WebApi2 添加Log4Net

1,在项目中引用log4net.dll
在NuGet包管理器里面搜索log4net,并安装

2,添加Web.Config配置
在这里插入图片描述
在这里插入图片描述
相应代码如下:

<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
 <log4net>
    <!-- OFF, FATAL, ERROR, WARN, INFO, DEBUG, ALL -->
    <!-- Set root logger level to ERROR and its appenders -->
    <root>
      <level value="ALL" />
      <appender-ref ref="SysAppender" />
    </root>
    <!-- Print only messages of level DEBUG or above in the packages -->
    <logger name="WebLogger">
      <level value="DEBUG" />
    </logger>
    <appender name="SysAppender" type="log4net.Appender.RollingFileAppender,log4net">
      <param name="File" value="App_Data/" />
      <param name="AppendToFile" value="true" />
      <param name="RollingStyle" value="Date" />
      <param name="DatePattern" value="&quot;Logs_&quot;yyyyMMdd&quot;.txt&quot;" />
      <param name="StaticLogFileName" value="false" />
      <layout type="log4net.Layout.PatternLayout,log4net">
        <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" />
      </layout>
    </appender>
    <appender name="consoleApp" type="log4net.Appender.ConsoleAppender,log4net">
      <layout type="log4net.Layout.PatternLayout,log4net">
        <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" />
      </layout>
    </appender>
  </log4net>

3,添加相应类与方法
1,定义一个WebApiMonitorLog ,监控日志对象

/// <summary>
    /// 监控日志对象
    /// </summary>
    public class WebApiMonitorLog
    {
        public string ControllerName { get; set; }
        public string ActionName { get; set; }

        public DateTime ExecuteStartTime { get; set; }
        public DateTime ExecuteEndTime { get; set; }

        /// <summary>
        /// 请求的Action 参数
        /// </summary>
        public Dictionary<string, object> ActionParams { get; set; }

        /// <summary>
        /// Http请求头
        /// </summary>
        public string HttpRequestHeaders { get; set; }

        /// <summary>
        /// 请求方式
        /// </summary>
        public string HttpMethod { get; set; }

        /// <summary>
        /// 请求的IP地址
        /// </summary>
        public string IP { get; set; }

        /// <summary>
        /// 获取监控指标日志
        /// </summary>
        /// <param name="mtype"></param>
        /// <returns></returns>
        public string GetLoginfo()
        {
            string Msg = @"
            Action执行时间监控:
            ControllerName:{0}Controller
            ActionName:{1}
            开始时间:{2}
            结束时间:{3}
            总 时 间:{4}秒
            Action参数:{5}
            Http请求头:{6}
            客户端IP:{7},
            HttpMethod:{8}
                    ";
            return string.Format(Msg,
                ControllerName,
                ActionName,
                ExecuteStartTime,
                ExecuteEndTime,
                (ExecuteEndTime - ExecuteStartTime).TotalSeconds,
                GetCollections(ActionParams),
                HttpRequestHeaders,
                IP,
                HttpMethod);
        }

        /// <summary>
        /// 获取Action 参数
        /// </summary>
        /// <param name="Collections"></param>
        /// <returns></returns>
        public string GetCollections(Dictionary<string, object> Collections)
        {
            string Parameters = string.Empty;
            if (Collections == null || Collections.Count == 0)
            {
                return Parameters;
            }
            foreach (string key in Collections.Keys)
            {
                Parameters += string.Format("{0}={1}&", key, Collections[key]);
            }
            if (!string.IsNullOrWhiteSpace(Parameters) && Parameters.EndsWith("&"))
            {
                Parameters = Parameters.Substring(0, Parameters.Length - 1);
            }
            return Parameters;
        }

        /// <summary>
        /// 获取IP
        /// </summary>
        /// <returns></returns>
        public string GetIP()
        {
            string ip = string.Empty;
            if (!string.IsNullOrEmpty(System.Web.HttpContext.Current.Request.ServerVariables["HTTP_VIA"]))
                ip = Convert.ToString(System.Web.HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]);
            if (string.IsNullOrEmpty(ip))
                ip = Convert.ToString(System.Web.HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"]);
            return ip;
        }
    }

2,定义一个LoggerHelper,日志帮助类

public class LoggerHelper
					    {
					        private static readonly log4net.ILog loginfo = log4net.LogManager.GetLogger("loginfo");
					        private static readonly log4net.ILog logerror = log4net.LogManager.GetLogger("logerror");
					        private static readonly log4net.ILog logmonitor = log4net.LogManager.GetLogger("logmonitor");
					        public static void Error(string ErrorMsg, Exception ex = null)
					        {
					            if (ex != null)
					            {
					                logerror.Error(ErrorMsg, ex);
					            }
					            else
					            {
					                logerror.Error(ErrorMsg);
					            }
					        }	
				        public static void Info(string Msg)
				        {
				            loginfo.Info(Msg);
				        }	
				        public static void Monitor(string Msg)
				        {
				            logmonitor.Info(Msg);
				        }
				    }

3,定义一个WebApiTrackerAttribute类,继承于ActionFilterAttribute

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false)]
    public class WebApiTrackerAttribute : ActionFilterAttribute
    {
        private readonly string Key = "_thisWebApiOnActionMonitorLog_";
        public override void OnActionExecuting(HttpActionContext actionContext) {
            base.OnActionExecuting(actionContext);
            WebApiMonitorLog MonLog = new WebApiMonitorLog();
            MonLog.ExecuteStartTime = DateTime.Now;
            //获取Action 参数
            MonLog.ActionParams = actionContext.ActionArguments;
            MonLog.HttpRequestHeaders = actionContext.Request.Headers.ToString();
            MonLog.HttpMethod = actionContext.Request.Method.Method;
            actionContext.Request.Properties[Key] = MonLog;
            var form = System.Web.HttpContext.Current.Request.Form;
            #region 如果参数是实体对象,获取序列化后的数据
            Stream stream = actionContext.Request.Content.ReadAsStreamAsync().Result;
            Encoding encoding = Encoding.UTF8;
            stream.Position = 0;
            string responseData = "";
            using (StreamReader reader = new StreamReader(stream, encoding)) {
                responseData = reader.ReadToEnd().ToString();
            }
            if (!string.IsNullOrWhiteSpace(responseData) && !MonLog.ActionParams.ContainsKey("__EntityParamsList__")) {
                MonLog.ActionParams["__EntityParamsList__"] = responseData;
            }
            #endregion
        }
        public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext) {
            WebApiMonitorLog MonLog = actionExecutedContext.Request.Properties[Key] as WebApiMonitorLog;
            MonLog.ExecuteEndTime = DateTime.Now;
            MonLog.ActionName = actionExecutedContext.ActionContext.ActionDescriptor.ActionName;
            MonLog.ControllerName = actionExecutedContext.ActionContext.ActionDescriptor.ControllerDescriptor.ControllerName;
            LoggerHelper.Monitor(MonLog.GetLoginfo());
            if (actionExecutedContext.Exception != null) {
                string Msg = string.Format(@"
                请求【{0}Controller】的【{1}】产生异常:
                Action参数:{2}
               Http请求头:{3}
                客户端IP:{4},
                HttpMethod:{5}
                    ", MonLog.ControllerName, MonLog.ActionName, MonLog.GetCollections(MonLog.ActionParams), MonLog.HttpRequestHeaders, MonLog.GetIP(), MonLog.HttpMethod);
                LoggerHelper.Error(Msg, actionExecutedContext.Exception);
            }
        }
    }

4,在WebApiConfig.cs 中加上(也可以在global中加)

log4net.Config.XmlConfigurator.Configure();	

5,最后在需要监控的控制器上加上 WebApiTracker
在这里插入图片描述

4,查看记录结果
每次在调用这个监控下的Action 时,都会有日志记录,像这样滴

在项目下有个log 文件夹
在这里插入图片描述

或者自定义使用亦可
在这里插入图片描述

5,在桌面应用程序、控制台应用程序、Windows服务项目中log4net的配置

第一步:跟上面网站项目配置一样先把log4net程序包安装到项目中
第二步:也是一样只是由Web.config变成App.config文件代码还是一样
第三步:有点不一样了,我们要在项目中的AssemblyInfo.cs中加一行代码:
//[assembly: log4net.Config.XmlConfigurator(ConfigFileExtension = "config", Watch = true)]
//log4net从配置文件中读取配置 在这里插入图片描述
最后一步就是在项目中使用了,跟网站项目中的使用一样就可以了。

参考资料:
1,https://www.cnblogs.com/weixiaowei/p/8253228.html
2,https://www.cnblogs.com/huangenai/archive/2016/04/23/5424596.html
3,https://jingyan.baidu.com/album/636f38bb5e5eead6b84610e9.html?picindex=8 (里面的第三步)

<think>好的,我现在需要帮助用户在WebAPI项目中正确配置log4net的配置文件,并提供示例教程。首先,我得回忆一下log4net在.NET中的基本配置方法,尤其是WebAPI环境下的特殊性。用户提供的引用内容提到了一些关键点,比如配置文件的格式、节点结构以及如何在代码中加载配置。 首先,根据引用[1],log4net通常使用XML配置文件,并且配置文件的根节点是log4net。引用[2]指出,有些情况下配置文件需要直接使用log4net作为根节点,而不是嵌套在configuration节点内,这可能与版本有关。因此,在创建配置文件时,需要确认正确的结构。 接下来,引用[3]提到在ASP.NET Core中使用builder.Logging.AddLog4Net("log4net.config");来加载配置,但用户的问题是关于WebAPI,可能需要区分传统ASP.NET和Core的区别。如果是传统的ASP.NET WebAPI(非Core),配置方法可能不同,比如需要在AssemblyInfo.cs中启用log4net,或在Global.asax中初始化。 引用[4]是关于log4j2在Java中的配置,但用户的问题是关于log4net的,所以这部分可能不直接相关,但可以作为参考,了解Web项目中的配置位置,比如将配置文件放在WEB-INF或项目的根目录。 接下来,我需要整理步骤: 1. 创建log4net.config文件,确保正确的XML结构和节点。 2. 设置配置文件属性,确保在生成时被复制到输出目录。 3. 在项目中加载配置文件,可能需要通过AssemblyInfo.cs或代码初始化。 4. 在代码中获取ILog实例并记录日志。 需要注意的问题包括配置文件的路径是否正确、权限问题,以及不同版本log4net的配置差异。例如,传统ASP.NET项目可能需要使用XmlConfigurator.Configure()方法,并在Global.asax中调用。 另外,需要验证配置是否生效,比如检查日志文件是否生成,或者使用调试工具查看log4net的内部日志,这可以通过在配置文件中开启debug模式。 可能的问题还有配置节点是否正确,比如appender的类型是否正确,比如RollingFileAppender用于滚动日志,以及日志文件的路径是否可写。 最后,根据用户的引用信息,特别是引用[2]中的情况,可能需要测试配置文件是否必须放在根节点下,而不是包含在configuration节点内,这可能导致配置未正确加载。</think>### WebAPI项目配置log4net的步骤说明 #### 1. 创建log4net配置文件 新建名为`log4net.config`的XML文件,**根节点直接使用`<log4net>`**(注意:传统ASP.NET项目不需要嵌套在`<configuration>`节点内[^2]): ```xml <?xml version="1.0" encoding="utf-8"?> <log4net> <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender"> <file value="logs\\api.log" /> <appendToFile value="true" /> <rollingStyle value="Size" /> <maxSizeRollBackups value="5" /> <maximumFileSize value="10MB" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" /> </layout> </appender> <root> <level value="DEBUG" /> <appender-ref ref="RollingFileAppender" /> </root> </log4net> ``` #### 2. 设置配置文件属性 在Visual Studio中右键点击文件属性,设置: - **生成操作**:`嵌入式资源` - **复制到输出目录**:`始终复制` #### 3. 初始化配置(传统ASP.NET WebAPI) 在`Global.asax`的`Application_Start`方法中添加初始化代码: ```csharp protected void Application_Start() { var configFile = HttpContext.Current.Server.MapPath("~/log4net.config"); log4net.Config.XmlConfigurator.Configure(new FileInfo(configFile)); // 其他初始化代码... } ``` #### 4. 在控制器中使用日志 ```csharp public class ValuesController : ApiController { private static readonly ILog log = LogManager.GetLogger(typeof(ValuesController)); public IEnumerable<string> Get() { log.Info("访问Get方法"); return new string[] { "value1", "value2" }; } } ``` #### 验证配置的两种方式 1. **检查日志输出**:查看项目`/bin/logs/api.log`文件是否生成 2. **启用log4net内部诊断**:在`Web.config`中添加配置: ```xml <configuration> <appSettings> <add key="log4net.Internal.Debug" value="true"/> </appSettings> </configuration> ``` ### §§常见问题解决§§ 1. **配置文件未加载** ➔ 检查文件路径是否正确,确认`Copy to Output Directory`设置为`Copy always` 2. **权限问题** ➔ 确保应用程序对日志目录有写入权限 3. **配置节点错误** ➔ 使用[log4net配置检查工具](https://logging.apache.org/log4net/release/config-examples.html)验证语法 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值