- A+
所属分类:.NET技术
一、引用类库:
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=""logs_"yyyyMMdd".log"" /> <!--日志文件名是否是固定不变的--> <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,开发人员多,写出来的日志格式等不统一,错误日志漏处理等现象。