一、引用類庫:
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="log\log.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方法里面注冊全局Filters錯誤日志處理
// 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,開發人員多,寫出來的日志格式等不統一,錯誤日志漏處理等現象。
