Asp.Net Core中簡單使用日志組件log4net


本文將簡單介紹在.NET 6中使用log4net的方法,具體見下文范例。

1.首先新建一個ASP.NET Core空項目

 2.通過Nuget包管理器安裝下面兩個包

Install-Package log4net
Install-Package Microsoft.Extensions.Logging.Log4Net.AspNetCore

 3.在項目根目錄下新建log4net的配置文件log4net.config,並將其設置為始終復制 

 

  1 <log4net>
  2         <!--根配置-->
  3         <root>
  4             <!--日志級別:可選值: ERROR > WARN > INFO > DEBUG -->
  5             <level value="ERROR"/>
  6             <level value="WARN"/>
  7             <level value="INFO"/>
  8             <level value="DEBUG"/>
  9             <appender-ref ref="ErrorLog" />
 10             <appender-ref ref="WarnLog" />
 11             <appender-ref ref="InfoLog" />
 12             <appender-ref ref="DebugLog" />
 13         </root>
 14         <!-- 錯誤 Error.log-->
 15         <appender name="ErrorLog" type="log4net.Appender.RollingFileAppender">
 16             <!--目錄路徑,可以是相對路徑或絕對路徑-->
 17             <param name="File" value="D:\logs\"/>
 18             <!--文件名,按日期生成文件夾-->
 19             <param name="DatePattern" value="/yyyy-MM-dd/&quot;Error.log&quot;"/>
 20             <!--追加到文件-->
 21             <appendToFile value="true"/>
 22             <!--創建日志文件的方式,可選值:Date[日期],文件大小[Size],混合[Composite]-->
 23             <rollingStyle value="Composite"/>
 24             <!--寫到一個文件-->
 25             <staticLogFileName value="false"/>
 26             <!--單個文件大小。單位:KB|MB|GB-->
 27             <maximumFileSize value="200MB"/>
 28             <!--最多保留的文件數,設為"-1"則不限-->
 29             <maxSizeRollBackups value="-1"/>
 30             <!--日志格式-->
 31             <layout type="log4net.Layout.PatternLayout">
 32                 <conversionPattern value="[%d{HH:mm:ss}]%m%n"/>
 33             </layout>
 34             <filter type="log4net.Filter.LevelRangeFilter">
 35                 <param name="LevelMin" value="ERROR" />
 36                 <param name="LevelMax" value="ERROR" />
 37             </filter>
 38         </appender>
 39 
 40         <!-- 警告 Warn.log-->
 41         <appender name="WarnLog" type="log4net.Appender.RollingFileAppender">
 42             <!--目錄路徑,可以是相對路徑或絕對路徑-->
 43             <param name="File" value="D:\logs\"/>
 44             <!--文件名,按日期生成文件夾-->
 45             <param name="DatePattern" value="/yyyy-MM-dd/&quot;Warn.log&quot;"/>
 46             <!--追加到文件-->
 47             <appendToFile value="true"/>
 48             <!--創建日志文件的方式,可選值:Date[日期],文件大小[Size],混合[Composite]-->
 49             <rollingStyle value="Composite"/>
 50             <!--寫到一個文件-->
 51             <staticLogFileName value="false"/>
 52             <!--單個文件大小。單位:KB|MB|GB-->
 53             <maximumFileSize value="200MB"/>
 54             <!--最多保留的文件數,設為"-1"則不限-->
 55             <maxSizeRollBackups value="-1"/>
 56             <!--日志格式-->
 57             <layout type="log4net.Layout.PatternLayout">
 58                 <conversionPattern value="[%d{HH:mm:ss}]%m%n"/>
 59             </layout>
 60             <filter type="log4net.Filter.LevelRangeFilter">
 61                 <param name="LevelMin" value="WARN" />
 62                 <param name="LevelMax" value="WARN" />
 63             </filter>
 64         </appender>
 65 
 66         <!-- 信息 Info.log-->
 67         <appender name="InfoLog" type="log4net.Appender.RollingFileAppender">
 68             <!--目錄路徑,可以是相對路徑或絕對路徑-->
 69             <param name="File" value="D:\logs\"/>
 70             <!--文件名,按日期生成文件夾-->
 71             <param name="DatePattern" value="/yyyy-MM-dd/&quot;Info.log&quot;"/>
 72             <!--追加到文件-->
 73             <appendToFile value="true"/>
 74             <!--創建日志文件的方式,可選值:Date[日期],文件大小[Size],混合[Composite]-->
 75             <rollingStyle value="Composite"/>
 76             <!--寫到一個文件-->
 77             <staticLogFileName value="false"/>
 78             <!--單個文件大小。單位:KB|MB|GB-->
 79             <maximumFileSize value="200MB"/>
 80             <!--最多保留的文件數,設為"-1"則不限-->
 81             <maxSizeRollBackups value="-1"/>
 82             <!--日志格式-->
 83             <layout type="log4net.Layout.PatternLayout">
 84                 <conversionPattern value="[%d{HH:mm:ss}]%m%n"/>
 85             </layout>
 86             <filter type="log4net.Filter.LevelRangeFilter">
 87                 <param name="LevelMin" value="INFO" />
 88                 <param name="LevelMax" value="INFO" />
 89             </filter>
 90         </appender>
 91 
 92         <!-- 調試 Debug.log-->
 93         <appender name="DebugLog" type="log4net.Appender.RollingFileAppender">
 94             <!--目錄路徑,可以是相對路徑或絕對路徑-->
 95             <param name="File" value="D:\logs\"/>
 96             <!--文件名,按日期生成文件夾-->
 97             <param name="DatePattern" value="/yyyy-MM-dd/&quot;Debug.log&quot;"/>
 98             <!--追加到文件-->
 99             <appendToFile value="true"/>
100             <!--創建日志文件的方式,可選值:Date[日期],文件大小[Size],混合[Composite]-->
101             <rollingStyle value="Composite"/>
102             <!--寫到一個文件-->
103             <staticLogFileName value="false"/>
104             <!--單個文件大小。單位:KB|MB|GB-->
105             <maximumFileSize value="200MB"/>
106             <!--最多保留的文件數,設為"-1"則不限-->
107             <maxSizeRollBackups value="-1"/>
108             <!--日志格式-->
109             <layout type="log4net.Layout.PatternLayout">
110                 <conversionPattern value="[%d{HH:mm:ss}]%m%n"/>
111             </layout>
112             <filter type="log4net.Filter.LevelRangeFilter">
113                 <param name="LevelMin" value="DEBUG" />
114                 <param name="LevelMax" value="DEBUG" />
115             </filter>
116         </appender>
117 
118     </log4net>

 

log4net配置參數此處不多贅述,只針對日志的輸出格式參數conversionPattern配置做簡要說明。

%M 		輸出日志方法名
%m 		輸出日志消息內容 
%p 		輸出優先級,即DEBUG,INFO,WARN,ERROR,FATAL 
%r 		輸出自應用啟動到輸出該log信息耗費的毫秒數 
%c 		輸出所屬的類目,通常就是所在類的全名 
%t 		輸出產生該日志事件的線程名 
%n 		輸出一個換行符
%l或%L  輸出日志事件的發生位置,包括類目名、發生的線程,以及在代碼中的行數。
%c 		輸出日志信息所屬的類的全名
%d 		輸出完整的日志時間點的日期時間,支持自定義格式。比如:%d{HH:mm:ss},輸出類似:22:10:28
%f 		輸出日志信息所屬的類的類名

  

  4.在Program中使用log4net輸出自定義日志內容

 1 using log4net;
 2 
 3 var builder = WebApplication.CreateBuilder(args);
 4 //注入Log4Net
 5 builder.Services.AddLogging(cfg =>
 6 {
 7     cfg.AddLog4Net();
 8     //默認的配置文件路徑是在根目錄,且文件名為log4net.config
 9     //如果文件路徑或名稱有變化,需要重新設置其路徑或名稱
10     //比如在項目根目錄下創建一個名為cfg的文件夾,將log4net.config文件移入其中,並改名為log.config
11     //則需要使用下面的代碼來進行配置
12     //cfg.AddLog4Net(new Log4NetProviderOptions()
13     //{
14     //    Log4NetConfigFileName = "cfg/log.config",
15     //    Watch = true
16     //});
17 });
18 var app = builder.Build();
19 //訪問根頁面時
20 app.MapGet("/", (ILogger<Program> logger) =>
21 {
22     logger.LogInformation("logger:測試一下Log4Net=》Info");
23     return "Hello World!";
24 });
25 //訪問test頁面時
26 app.MapGet("/test", () =>
27 {
28     var log = LogManager.GetLogger(typeof(Program));
29     log.Info("log:這是一條普通日志信息");
30 });
31 app.Run();

  5.將項目運行起來,即可發現日志文件已生成

 

 

 

  6.擴展使用:使用簡單工廠模式IOC注入到自定義類中使用

  新建一個ITestLog4Net接口文件,並為其定義一個Log方法。

1 public interface ITestLog4Net
2 {
3         public void Log();
4 }

    並且新建一個TestLog4Net的自定義類,繼承於ITestLog4Net,並實現該Log方法。

 1 public class TestLog4Net : ITestLog4Net
 2 {
 3         private readonly ILogger<TestLog4Net> _logger;
 4         public TestLog4Net(ILogger<TestLog4Net> logger)
 5         {
 6             _logger = logger;
 7             _logger.LogInformation("ctor測試一下Log4Net=》Info");
 8         }
 9 
10 
11         public void Log()
12         {
13             _logger.LogInformation("測試一下Log4Net=》Info");
14         }
15 }

  在Program中注入我們的自定義類TestLog4Net 

 1 builder.Services.AddTransient<ITestLog4Net, TestLog4Net>(); 

   使用方法

 1 var testLog4Net = app.Services.GetService<ITestLog4Net>()!; 2 testLog4Net.Log(); 

  或者

1 var services = new ServiceCollection()!;
2 var provider = services.BuildServiceProvider()!;
3 var testLog4Net = provider.GetService<ITestLog4Net>()!;
4 testLog4Net.Log();

  其中,使用下面這種寫法,將會收到一個編譯警告信息。

  warning ASP0000: Calling 'BuildServiceProvider' from application code results in an additional copy of singleton services being created. Consider alternatives such as dependency injecting services as parameters to 'Configure'.

 

   推薦使用上面的寫法,百度之后,得到的答案是:不要通過調用BuildServiceProvider()這個方法應該只被 Host 調用一次。重復的服務提供者可能會導致一些意想不到的錯誤。如果有哪位大佬知道具體原因,請告知一下,謝謝!

 

Tips:代碼中的感嘆號!表示該對象不會為空,一定要確保該對象不會為空才能這樣寫,這是C#10中的新特性。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM