本篇講述使用Log4Net日誌的基礎用法
1,在項目中引入如下包文件,版本選擇最新穩定版即可
1 <PackageReference Include="log4net" Version="2.0.12" /> 2 <PackageReference Include="Microsoft.Extensions.Logging.Log4Net.AspNetCore" Version="5.0.0" />
2,在項目根目錄加入Log4net.config 配置文件 (注意:別忘了將文件,右鍵---屬性--始終複製)
3,Log4net.config 配置文件,這裏只展示Debug日誌類型,其他幾個日誌類型都一樣,照搬就行
1 <?xml version="1.0" encoding="utf-8"?> 2 <log4net> 3 <!-- 將日誌以回滾文件的形式寫到文件中 --> 4 <!-- 按日期切分日誌文件,並將日期作爲日誌文件的名字 --> 5 <!--Error--> 6 <!--Info--> 7 <!--WARN--> 8 9 <!--Debug--> 10 <appender name="DebugLog" type="log4net.Appender.RollingFileAppender"> 11 <!--不加utf-8編碼格式,中文字符將顯示成亂碼--> 12 <param name="Encoding" value="utf-8" /> 13 <!--定義文件存放位置--> 14 <file value="Log/Debug/debug.log"/> 15 <!--是否追加到文件--> 16 <appendToFile value="true" /> 17 <!--按照何種方式產生多個日誌文件(日期[Date],文件大小[Size],混合[Composite])--> 18 <rollingStyle value="Date" /> 19 <!--是否保存日誌文件的擴展名--> 20 <PreserveLogFileNameExtension value="true" /> 21 <!--日誌文件名是否爲靜態--> 22 <StaticLogFileName value="false"/> 23 <!--日期的格式,每天換一個文件記錄,如不設置則永遠只記錄一天的日誌,需設置--> 24 <datePattern value="yyyyMMdd" /> 25 <!--最多產生的日誌文件數,超過則只保留最新的n+1個--> 26 <maxSizeRollBackups value="1" /> 27 <!--每個文件的大小,只在混合方式與文件大小方式下使用,超出大小後在所有文件名後自動增加正整數重新命名,數字最大的最早寫入,沒帶數字最晚寫入--> 28 <maximumFileSize value="256MB" /> 29 <!--多線程時採用最小鎖定 不鎖定文本文件,防止多線程時不能寫Log--> 30 <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> 31 <!--佈局(向用戶顯示最後經過格式化的輸出信息)--> 32 <layout type="log4net.Layout.PatternLayout"> 33 <conversionPattern value="%date| %-5level %c %newline%message%newline--------------------------------%newline" /> 34 </layout> 35 <!--過濾設置,LevelRangeFilter爲使用的過濾器。--> 36 <filter type="log4net.Filter.LevelRangeFilter"> 37 <levelMin value="DEBUG" /> 38 <levelMax value="DEBUG" /> 39 </filter> 40 </appender> 41 <!--Debug--> 42 43 <root> 44 <!-- 控制級別,由低到高:ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF --> 45 <!-- 比如定義級別爲INFO,則INFO級別向下的級別,比如DEBUG日誌將不會被記錄 --> 46 <!-- 如果沒有定義LEVEL的值,則缺省爲DEBUG --> 47 <level value="ALL" /> 48 <!-- 按日期切分日誌文件,並將日期作爲日誌文件的名字 --> 49 <appender-ref ref="ErrorLog" /> 50 <appender-ref ref="InfoLog" /> 51 <appender-ref ref="WarnLog" /> 52 <appender-ref ref="DebugLog" /> 53 </root> 54 </log4net>
4,在 Program.cs 文件中全局配置日誌
1 public static IHostBuilder CreateHostBuilder(string[] args) => 2 Host.CreateDefaultBuilder(args) 3 .ConfigureWebHostDefaults(webBuilder => 4 { 5 webBuilder.UseStartup<Startup>() 6 .ConfigureLogging((hostingContext, builder) => 7 { 8 //1.過濾掉系統默認的一些日誌 9 //2.這裏配置後,appsettings.json中的Logging配置將失效 10 builder.AddFilter("System", LogLevel.Error); //只有錯誤時纔打印日誌 11 builder.AddFilter("Microsoft", LogLevel.Error); //只有錯誤時纔打印日誌 12 builder.AddFilter("Microsoft.Hosting.Lifetime", LogLevel.Error); //只有錯誤時纔打印日誌 13 builder.AddFilter("MyShopApi", LogLevel.Debug); //自定義項目過濾級別,使用項目命名空間 14 15 //3.清除console控制檯打印的日誌,註釋改行後控制檯也會同步打印日誌 16 //builder.ClearProviders(); 17 18 //4.默認log4net.confg 19 //Windows環境不區分大小寫,這麼寫爲了適應Linux環境 20 builder.AddLog4Net(Path.Combine(Directory.GetCurrentDirectory(), "Log4net.config")); 21 }); 22 });
5,同樣,如果不在 Program.cs 入口中配置日誌級別,則系統默認使用appsettings.json配置文件的日誌級別
1 "Logging": { 2 "LogLevel": { 3 "Default": "Information", //默認級別 4 "MyShopApi": "Debug", //使用項目命名空間 自定義項目過濾級別 5 "Microsoft": "Error", //註釋該行後,將不打印系統日誌(或者使用高日記級別也不會打印基礎系統信息) 6 "System": "Error", //註釋該行後,將不打印系統日誌(或者使用高日記級別也不會打印基礎系統信息) 7 "Microsoft.Hosting.Lifetime": "Error" //註釋該行後,將不打印系統日誌(或者使用高日記級別也不會打印基礎系統信息) 8 }, 9 "Log4Net": { 10 "Name": "MyShopApi" 11 } 12 }, 13 "AllowedHosts": "*",
6,用法1,使用構造函數注入,紅色加粗部分
1 [Route("api/[controller]/[action]")] 2 [ApiController] 3 public class UserController : ControllerBase 4 { 5 private readonly ILogger<UserController> logger; 6 7 public UserController(IUserService _userService,ILogger<UserController> _logger) 8 { 9 userService = _userService; 10 this.logger = _logger; 11 } 12 13 。。。。 14 15 [HttpPost] 16 public async Task<IActionResult> GetUserInfo() 17 { 18 //測試日誌 19 this.logger.LogInformation("this is logInfo"); 20 this.logger.LogError("this is logerror"); 21 this.logger.LogDebug("this is debug"); 22 this.logger.LogWarning("this is warning"); 23 this.logger.LogTrace("this is trace"); 24 }
7,用法2,主要用在中間件或過濾器中,日誌打印效果同上
1 public class ExceptionHandlerMid 2 { 3 private static readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(ExceptionHandlerMid)); 4 private readonly RequestDelegate _next; 5 6 public ExceptionHandlerMid(RequestDelegate next) 7 { 8 this._next = next; 9 } 10 11 12 private async Task HandleExceptionAsync(HttpContext context, Exception ex) 13 { 14 if (ex == null) return; 15 16 Console.WriteLine($"異常消息:{ex.GetBaseException()}"); 17 log.Error(ex.GetBaseException().ToString()); 18 } 19 }
8,打印效果