.Net Core 5.x Api開發筆記 -- 基礎日誌(Log4Net)(八)

本篇講述使用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,打印效果

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章