日志组件DotNetCommon.Filelog
介紹
根據Microsoft.Extensions.Logging.Console改造的本地文件日志輸出組件,輕量便捷,運行平臺:asp.net core。
1. 為什么要寫這個項目,開源的日志組件不夠用嗎?
第一:微軟提供了一個很好的日志輸出框架,也提供了基本的控制臺輸出組件,但沒有提供輸出到文件的日志組件,很是遺憾;
第二:第三方日志組件(如:NLog、Serialog、Log4net)功能雖然比較全,但也引入了其他大量的概念和規則。而對于中小型項目來說,它們僅需要輸出日志到本地文件即可,所以在使用的便捷上總是差強人意;
第三:第三方日志組件在某些功能上也不盡如人意,比如:是否能將日志消息按照日志類別輸出到不同文件中?在程序工作時,是否占用日志文件?是否能排除某個類別的日志文件不輸出?
第四:練手。
2. 這個項目的特點
不引入新的規則概念,不引入額外的配置文件,力求輕量級,所有配置均在appsetting.json中實現;
實現非占用文件式輸出, 方便日志文件瀏覽,其內部文件的輸出是基于內存的單線程隊列,高并發下不影響主線程運行;
提供按照日志類別、級別過濾輸出到不同的文件;
提供按文件大小滾動輸出的功能;
提供定時凈化日志目錄的功能;
3. 這個項目的實現思路
大量參考控制臺輸出組件的源碼(Microsoft.Extensions.Logging.Console)
4. 快速使用
第一步:安裝包
<ItemGroup><PackageReference Include="DotNetCommon.Filelog" Version="1.1.0" /> </ItemGroup>第二步:修改Program.cs文件,引入組件
public class Program {public static void Main(string[] args){CreateHostBuilder(args).Build().Run();}public static IHostBuilder CreateHostBuilder(string[] args) =>Host.CreateDefaultBuilder(args).ConfigureLogging(loggingBuilder =>{loggingBuilder.ClearProviders();loggingBuilder.AddConsole();//一行代碼即可引入loggingBuilder.AddFile();}).ConfigureWebHostDefaults(webBuilder =>{webBuilder.UseStartup<Startup>();}); }第三步:沒有了。
5. 輸出效果
引入日志組件后,為了測試輸出效果,我們可以新建一個控制器代碼如下:
[HttpGet] public string Get() {_logger.LogTrace("trace");_logger.LogDebug("debug");_logger.LogInformation("info");_logger.LogWarning("warn");_logger.LogError("error");_logger.LogCritical("critical");using (_logger.BeginScope("測試日志的Scope")){_logger.LogTrace("scope-trace");_logger.LogDebug("scope-debug");_logger.LogInformation("scope-info");_logger.LogWarning("scope-warn");_logger.LogError("scope-error");_logger.LogCritical("scope-critical");}_logger.LogTrace("Scope已經結束了。。。");//多行日志_logger.LogInformation($@"第幾次 小明小紅 小花小龍圣誕節哦我按實際大地阿斯頓");_logger.LogInformation($@"hah 小明小紅 小花小龍圣誕節哦我按實際大地阿斯頓end");//throw new Exception("測試異常日志");return "ok"; }當程序啟動并且訪問到這個api后,我們將會看到程序目錄下多了個文件夾logs,它里面的日志文件如下:
app-all-2021-06-09.log 4KB //應用類別的日志都會記錄到這里 app-crit-2021-06-09.log 1KB //應用類別中Critical級別的日志都會記錄到這里 app-fail-2021-06-09.log 1KB //應用類別中Error級別的日志都會記錄到這里 app-info-2021-06-09.log 2KB //應用類別中Information級別的日志都會記錄到這里 app-warn-2021-06-09.log 1KB //應用類別中Warning級別的日志都會記錄到這里 system-2021-06-09.log 1KB //系統類別的日志都會記錄到這里//system-2021-06-09.log 內容 [2021-06-09 20:44:52.676]-[info]: Microsoft.Hosting.Lifetime[0]-[threed:1]Now listening on: https://localhost:5501 [2021-06-09 20:44:52.679]-[info]: Microsoft.Hosting.Lifetime[0]-[threed:1]Now listening on: http://localhost:5500 [2021-06-09 20:44:52.680]-[info]: Microsoft.Hosting.Lifetime[0]-[threed:1]Application started. Press Ctrl+C to shut down. [2021-06-09 20:44:52.680]-[info]: Microsoft.Hosting.Lifetime[0]-[threed:1]Hosting environment: Development [2021-06-09 20:44:52.680]-[info]: Microsoft.Hosting.Lifetime[0]-[threed:1]Content root path: E:\gitee\DotNetCommon.Filelog\samples\SimpleFileLog//app-warn-2021-06-09.log 內容 [2021-06-09 20:44:53.604]-[warn]: SimpleFileLog.Controllers.HomeController[0]-[threed:11]=> RequestPath:/home RequestId:0HM9B8HGAQOQF:00000001, SpanId:|85fcc31f-49a39d824a1949ba., TraceId:85fcc31f-49a39d824a1949ba, ParentId: => SimpleFileLog.Controllers.HomeController.Get (SimpleFileLog)warn [2021-06-09 20:44:53.604]-[warn]: SimpleFileLog.Controllers.HomeController[0]-[threed:11]=> RequestPath:/home RequestId:0HM9B8HGAQOQF:00000001, SpanId:|85fcc31f-49a39d824a1949ba., TraceId:85fcc31f-49a39d824a1949ba, ParentId: => SimpleFileLog.Controllers.HomeController.Get (SimpleFileLog) => 測試日志的Scopescope-warn注意:雖然代碼中有輸出Information級別以下的日志,但由于工程的appsettings.json中的配置導致Debug和Trace級別的日志并沒有記錄到文件。
{ "Logging": {"LogLevel": {"Default": "Information", //設置默認類別日志的輸出級別"Microsoft": "Warning", //設置Microsoft開頭的類別日志的輸出級別"Microsoft.Hosting.Lifetime": "Information" //設置Microsoft.Hosting.Lifetime開頭的類別日志的輸出級別} }, "AllowedHosts": "*" }為了能輸出Information級別以下的日志,我們可以調整appsettings.json的配置如下:
{ "Logging": {"LogLevel": {"Default": "Trace", "Microsoft": "Trace", "Microsoft.Hosting.Lifetime": "Trace" } }, "AllowedHosts": "*" }如果僅想設置FileLog組件的日志輸出級別,也可以如下設置:
{"Logging": {"LogLevel": {"Default": "Information", "Microsoft": "Warning", "Microsoft.Hosting.Lifetime": "Information" },"File":{"LogLevel": {"Default": "Trace", "Microsoft": "Trace", "Microsoft.Hosting.Lifetime": "Trace" }}},"AllowedHosts": "*" }關于日志的類別和級別參考MSDN文檔:https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/logging/?view=aspnetcore-5.0#log-level
6. 輕量配置
上面引入FileLog的時候雖然僅使用了loggingBuilder.AddFile();一行代碼,但FileLog組件內部加載了默認的配置,如下:
{"Logging": {"LogLevel": {"Default": "Information","Microsoft": "Warning","Microsoft.Hosting.Lifetime": "Information"},"File": {"IncludeScopes": true, //表示是否輸出日志范圍,默認輸出"InternalLogFile": "logs/internal-#datetime{yyyy-MM-dd}#.log","AutoClear": {"Enable": false,"ExpireSpan": 0,"TriggerCount": 200,"Dirs": [ "logs" ],"Exts": [ "*.log" ]},"Writers": [{"FirstInclude": [ "Microsoft", "System" ],"Path": "logs/system-#datetime{yyyy-MM-dd}#.log","RollingSize": 10485760,"MinLogLevel": "Trace","MaxLogLevel": "None"},{"FirstInclude": [ "*" ],"Path": "logs/app-#level#-#datetime{yyyy-MM-dd}#.log","SecondExclude": [ "Microsoft", "System" ],"RollingSize": 10485760,"MinLogLevel": "Trace","MaxLogLevel": "None"},{"FirstInclude": [ "*" ],"Path": "logs/app-all-#datetime{yyyy-MM-dd}#.log","SecondExclude": [ "Microsoft", "System" ],"RollingSize": 10485760,"MinLogLevel": "Trace","MaxLogLevel": "None"}]}},"AllowedHosts": "*" }配置詳解:
| IncludeScopes | 是否輸出日志作用域,參考:上面示例的輸出 | true |
| InternalLogFile | FileLog內部異常時輸出的日志位置,支持相對路徑和絕對路徑 | logs/internal-#datetime{yyyy-MM-dd}#.log |
| AutoClear | 自動凈化日志目錄配置塊,提供定時刪除目錄下日志文件的功能 | 看下級 |
| AutoClear.Enable | 是否啟用自動凈化功能 | false |
| AutoClear.ExpireSpan | 過期時間(單位:秒),當文件的創建日期距現在超過了指定秒后才會被刪除 | 0,表示永不過期 |
| AutoClear.TriggerCount | 觸發目錄凈化的條件,當FileLog連續輸出多少次后才會掃描日志文件 | 200 |
| AutoClear.Dirs | 需要凈化的目錄列表,凈化時采用的是遞歸算法 | [ "logs" ] |
| AutoClear.Exts | 為防止誤刪除文件,必須設置日志文件的匹配模式 | [ "*.log" ] |
| Writers | 日志輸出器數組,每個writer對應一個日志文件 | 具有三個日志輸出器的數組 |
| Writers[].MinLogLevel | 當前Writer最低輸出級別(執行時首先檢查MinLogLevel和MaxLogLevel) | Trace,即不限制 |
| Writers[].MaxLogLevel | 當前Writer最高輸出級別(執行時首先檢查MinLogLevel和MaxLogLevel) | None,即不限制 |
| Writers[].FirstInclude | 默認當前Writer不允許輸出任何日志類別,通過FirstInclude設置允許的類別 | null |
| Writers[].SecondExclude | 在FirstInclude基礎上,設置排除的日志輸出類別 | null |
| Writers[].Path | 當前Writer文件的路徑,支持相對路徑和絕對路徑 | null |
| Writers[].RollingSize | 當前Writer文件滾動輸出的單文件最大值(字節),滾動示例:xxxx-r2.log | 10485760,即:10M |
注意:
上面AutoClear.Exts的配置是調用?var _files = Directory.GetFiles(_dir, pattern);?生效的。
Writers配置默認是有三個Writer的數組,如果自己做了配置的話會將這三個Writer一起覆蓋掉。
7. 示例工程
https://gitee.com/jackletter/DotNetCommon.Filelog/tree/master/samples/SimpleFileLog
總結
以上是生活随笔為你收集整理的日志组件DotNetCommon.Filelog的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Entity Framework Cor
- 下一篇: c#爬虫-解决ChromeDriver