asp.net core使用 log4net全局日志处理

  • A+
所属分类:.NET技术
摘要

一、引用类库:  1、 Microsoft.Extensions.Logging.Log4Net.AspNetCore  2、log4net.AspNetCore

一、引用类库:

  1、 Microsoft.Extensions.Logging.Log4Net.AspNetCore

  2、log4net.AspNetCore

二、配置 log4net.config 文件

<?xml version="1.0" encoding="utf-8" ?> <log4net>     <appender name="DebugAppender" type="log4net.Appender.DebugAppender" >         <layout type="log4net.Layout.PatternLayout">             <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />         </layout>     </appender>     <!--指定日记记录方式,以滚动文件的方式(文件记录)-->     <appender name="RollingFile" type="log4net.Appender.RollingFileAppender">         <!--日志路径-->         <file value="loglog.txt" />         <!--是否是向文件中追加日志-->         <appendToFile value="true" />         <!--log保留天数-->         <param name= "MaxSizeRollBackups" value= "10"/>         <!--每个文件最大3M-->         <param name="maximumFileSize" value="3MB" />         <!--日志根据日期滚动-->         <param name="RollingStyle" value="Date" />         <!--日志文件名格式为:logs_20080831.log-->         <param name="DatePattern" value="&quot;logs_&quot;yyyyMMdd&quot;.log&quot;" />         <!--日志文件名是否是固定不变的-->         <param name="StaticLogFileName" value="false" />         <!--布局-->         <layout type="log4net.Layout.PatternLayout">             <conversionPattern value="%date %5level %logger.%method [%line] - MESSAGE: %message%newline %exception" />         </layout>     </appender>     <root>         <level value="ALL"/>         <appender-ref ref="DebugAppender" />         <appender-ref ref="RollingFile" />     </root> </log4net>

三、创建自己的 MyExceptionFilterAttribute并继承 ExceptionFilterAttribute 该抽象类,依赖注入日志对象 logger

public class MyExceptionFilterAttribute : ExceptionFilterAttribute     {         private readonly ILogger<MyExceptionFilterAttribute> _logger;                 /// <summary>         /// 通过构造函数的方式,依赖注入日志对象         /// </summary>         /// <param name="logger"></param>         public MyExceptionFilterAttribute(ILogger<MyExceptionFilterAttribute> logger)         {             this._logger = logger;         }         public override void OnException(ExceptionContext context)         {             // 判断是否被处理过             if (!context.ExceptionHandled)             {                 context.ExceptionHandled = true;                 var str = $"异常:{context.HttpContext.Request.Path}{context.Exception.Message}";                 // 输出到控制台                 Console.WriteLine(str);                 // 写入文本日志(或者是记录到数据库等....)                 _logger.LogWarning(str);                 if (context.HttpContext.Request.Method == "GET")                 {                     // 如果是 get请求,则跳转页面                 }                 else                 {                     // 如果是post 则都是ajax请求,则返回json数据格式,输出自定义或者约定好的格式                     context.Result = new JsonResult(new { Result = false, Message = "请求出现错误,请联系管理员" });                 }             }         }     } 

四、在Program.cs配置使用log4net

public class Program     {         public static void Main(string[] args)         {             CreateHostBuilder(args).Build().Run();         }          public static IHostBuilder CreateHostBuilder(string[] args) =>             Host.CreateDefaultBuilder(args)             .ConfigureLogging((context, loggingBuilder) =>             {                 loggingBuilder.AddFilter("System", LogLevel.Warning);                 loggingBuilder.AddFilter("Microsoft", LogLevel.Warning);                 // 使用log4net                 loggingBuilder.AddLog4Net();             })                 .ConfigureWebHostDefaults(webBuilder =>                 {                     webBuilder.UseStartup<Startup>();                 });     } 

五、在Startup.cs ConfigureServices方面里面里面注册全局错误日志处理

// This method gets called by the runtime. Use this method to add services to the container.         public void ConfigureServices(IServiceCollection services)         {             services.AddControllersWithViews(options=>              {                 // 全局注册,全局生效                 options.Filters.Add(typeof(MyExceptionFilterAttribute));             });         } 

这样系统都可以统一处理异常。避免代码中到处都是try catch,开发人员多,写出来的日志格式等不统一,错误日志漏处理等现象。