.net Log4Net日志的配置及使用 全局异常过滤器
.net添加Log4Net日志的配置及使用,以及将其设置为全局异常过滤器,主要有以下步骤:
1. 新建一个Web应用程序
2. 引用log4net.dll
3. 添加config文件
4. 在AssemblyInfo.cs进行注册
5. 在Global.asax中进行初始化设置
6. 添加Log4Helper.cs帮助类
7. 新增过滤器LogExceptionFilter.cs文件
8. 在FilterConfig.cs中添加过滤器
9. 在Global.asax中注册过滤器
详细步骤如下:
1.新建一个web应用程序,如下图所示
2.利用Nuget引用log4net.dll
3.为了便于管理,添加log4net.config文件
<?xml version="1.0" encoding="utf-8"?> <configuration> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> </configSections> <system.web> <compilation debug="true" targetFramework="4.5.2" /> <httpRuntime targetFramework="4.5.2" /> </system.web> <log4net> <appender name="WarnAppender" type="log4net.Appender.RollingFileAppender"> <file value="Logs\\Warn"/> <appendToFile value="true"/> <rollingStyle value="Date"/> <datePattern value="yyyy\\yyyyMM\\yyyyMMdd'.txt'"/> <staticLogFileName value="false"/> <param name="MaxSizeRollBackups" value="100"/> <maximumFileSize value="1GB" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%n========== %n【日志级别】%-5level %n【记录时间】%date %n【线程编号】[%thread] %n【执行时间】[%r]毫秒 %n【出错文件】%F %n【出错行号】%L %n【出错的类】%logger 属性[%property{NDC}] %n【错误描述】%message %n【错误详情】%newline"/> </layout> </appender> <appender name="InfoAppender" type="log4net.Appender.RollingFileAppender"> <file value="Logs\\LogInfo"/> <appendToFile value="true"/> <rollingStyle value="Date"/> <datePattern value="yyyy\\yyyyMM\\yyyyMMdd'.txt'"/> <staticLogFileName value="false"/> <param name="MaxSizeRollBackups" value="100"/> <maximumFileSize value="1GB" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%n========== %n【日志级别】%-5level %n【记录时间】%date %n【线程编号】[%thread] %n【执行时间】[%r]毫秒 %n【出错文件】%F %n【出错行号】%L %n【出错的类】%logger 属性[%property{NDC}] %n【错误描述】%message %n【错误详情】%newline"/> </layout> </appender> <appender name="ErrorAppender" type="log4net.Appender.RollingFileAppender"> <file value="Logs\\LogError"/> <appendToFile value="true"/> <rollingStyle value="Date"/> <datePattern value="yyyy\\yyyyMM\\yyyyMMdd'.txt'"/> <staticLogFileName value="false"/> <param name="MaxSizeRollBackups" value="100"/> <maximumFileSize value="1GB" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%n========== %n【日志级别】%-5level %n【记录时间】%date %n【线程编号】[%thread] %n【执行时间】[%r]毫秒 %n【出错文件】%F %n【出错行号】%L %n【出错的类】%logger 属性[%property{NDC}] %n【错误描述】%message %n【错误详情】%newline"/> </layout> </appender> <logger name="logerror"> <level value="ERROR" /> <appender-ref ref="ErrorAppender" /> </logger> <logger name="warning"> <level value="WARN" /> <appender-ref ref="WarnAppender" /> <!--<appender-ref ref="ConsoleAppender" />--> </logger> <logger name="info"> <level value="ALL"/> <appender-ref ref="InfoAppender" /> </logger> </log4net> </configuration>
config文件中节点说明如下:
<!--错误日志:记录错误日志--> <!--按日期分割日志文件 一天一个--> <!-- appender 定义日志输出方式 将日志以回滚文件的形式写到文件中。--> <appender name="ErrorAppender" type="log4net.Appender.RollingFileAppender"> <!--保存路径:下面路径项目启动的时候会在相应目录创建logs、logError文件夹--> <file value="Logs\\LogError"/> <!-- 如果想在本项目中添加路径,那就直接去掉C:\\ 只设置log\\LogError 项目启动中默认创建文件夹 --> <appendToFile value="true"/> <!--按照何种方式产生多个日志文件(日期[Date],文件大小[Size],混合[Composite])--> <rollingStyle value="Date"/> <!--这是按日期产生文件夹--> <datePattern value="yyyy\\yyyyMM\\yyyyMMdd'.txt'"/> <!--是否只写到一个文件中--> <staticLogFileName value="false"/> <!--保留的log文件数量 超过此数量后 自动删除之前的 好像只有在 按Size分割时有效 设定值value="-1"为不限文件数--> <param name="MaxSizeRollBackups" value="100"/> <!--每个文件的大小。只在混合方式与文件大小方式下使用。超出大小后在所有文件名后自动增加正整数重新命名,数字最大的最早写入。可用的单位:KB|MB|GB。不要使用小数,否则会一直写入当前日志--> <maximumFileSize value="1GB" /> <!-- layout 控制Appender的输出格式,也可以是xml 一个Appender只能是一个layout--> <layout type="log4net.Layout.PatternLayout"> <!--每条日志末尾的文字说明--> <!--输出格式 模板--> <!--<conversionPattern value="%newline %n记录时间:%date %n线程ID:[%thread] %n日志级别: %-5level %n错误描述:%message%newline %n"/>--> <conversionPattern value="%n========== %n【日志级别】%-5level %n【记录时间】%date %n【线程编号】[%thread] %n【执行时间】[%r]毫秒 %n【出错文件】%F %n【出错行号】%L %n【出错的类】%logger 属性[%property{NDC}] %n【错误描述】%message %n【错误详情】%newline"/> </layout> </appender> <appender/>节点的name属性的值对应<logger/>节点中的name属性的值
4.在AssemblyInfo.cs文件中对log4net.config文件进行注册,添加代码如下
// 为项目注册Log4Net.config配置文件
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]
5.在Global.asax中对其进行初始化设置
//读取日志 如果使用log4net,应用一开始的时候,都要进行初始化设置 log4net.Config.XmlConfigurator.Configure();
6.如果不需要添加全局异常过滤器的话,则执行到这一步即可,添加Log4Helper.cs文件
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using System.Web; using log4net; namespace LogDemo { public class Log4netHelper { public static readonly ILog logInfo = log4net.LogManager.GetLogger("info"); public static readonly ILog logWarn = log4net.LogManager.GetLogger("warning"); public static readonly ILog logError = log4net.LogManager.GetLogger("logerror"); public static void Info(string info) { if (logInfo.IsInfoEnabled) { logInfo.Info(info); } } public static void Warn(string info, Exception ex) { if (logWarn.IsWarnEnabled) { logWarn.Warn(info, ex); } } public static void Debug(string info, Exception ex) { if (logError.IsDebugEnabled) { logError.Debug(info, ex); } } public static void ErrorLog(object msg) { //Task.Run(() => logError.Error(msg)); // 异步 logError.Error(msg); } public static void ErrorLog(Exception ex) { //Task.Run(() => logError.Error(Newtonsoft.Json.JsonConvert.SerializeObject(ex))); logError.Error(Newtonsoft.Json.JsonConvert.SerializeObject(ex)); } public static void ErrorLog(object msg, Exception ex) { if (ex != null) { //Task.Run(() => logError.Error(msg, ex)); // 异步 logError.Error(msg, ex); } else { //Task.Run(() => logError.Error(msg)); // 异步 logError.Error(msg); } } } }
7.新增Filters文件夹,添加LogExceptionFilter.cs文件,如下
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace LogDemo.Filters { /// <summary> /// 异常过滤器 /// </summary> public class LogExceptionFilter : HandleErrorAttribute { public override void OnException(ExceptionContext filterContext) { if (!filterContext.ExceptionHandled) { string controllerName = (string)filterContext.RouteData.Values["controller"]; string actionName = (string)filterContext.RouteData.Values["action"]; string msgTemplate = "在执行 controller[{0}] 的 action[{1}] 时产生异常:[{2}]"; log4net.ILog log = log4net.LogManager.GetLogger("LogError");//获取一个日志记录器 log.Error(DateTime.Now.ToString() + ": login success");//写入一条新log Log4netHelper.ErrorLog(string.Format(msgTemplate, controllerName, actionName, filterContext.Exception.Message), filterContext.Exception); filterContext.HttpContext.Response.Redirect("/Error/Index"); return; } else { base.OnException(filterContext); } } } }
8.在App_Start文件中添加FilterConfig.cs文件
using LogDemo.Filters; using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace LogDemo.App_Start { public class FilterConfig { public static void RegisterGlobalFilters(GlobalFilterCollection filters) { // 注册异常处理过滤器 filters.Add(new LogExceptionFilter()); filters.Add(new CustomerFilterAttribute()); } } }
9.在Global.asax文件中进行注册
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
如果本文对你有所帮助,请留下痕迹。
本文参考地址:
一分辛苦一分才