在.NET?6中使用日志組件log4net的方法
本文將簡單介紹在.NET 6中使用log4net的方法,具體見下文范例。
1.首先新建一個ASP.NET Core空項(xiàng)目
2.通過Nuget包管理器安裝下面兩個包
log4net
Microsoft.Extensions.Logging.Log4Net.AspNetCore
3.在項(xiàng)目根目錄下新建log4net的配置文件log4net.config,并將其設(shè)置為始終復(fù)制。
<?xml version="1.0" encoding="utf-8" ?> <log4net> <!--根配置--> <root> <!--日志級別:可選值: ERROR > WARN > INFO > DEBUG --> <level value="ERROR"/> <level value="WARN"/> <level value="INFO"/> <level value="DEBUG"/> <appender-ref ref="ErrorLog" /> <appender-ref ref="WarnLog" /> <appender-ref ref="InfoLog" /> <appender-ref ref="DebugLog" /> </root> <!-- 錯誤 Error.log--> <appender name="ErrorLog" type="log4net.Appender.RollingFileAppender"> <!--目錄路徑,可以是相對路徑或絕對路徑--> <param name="File" value="C:\logs\"/> <!--文件名,按日期生成文件夾--> <param name="DatePattern" value="/yyyy-MM-dd/"Error.log""/> <!--追加到文件--> <appendToFile value="true"/> <!--創(chuàng)建日志文件的方式,可選值:Date[日期],文件大小[Size],混合[Composite]--> <rollingStyle value="Composite"/> <!--寫到一個文件--> <staticLogFileName value="false"/> <!--單個文件大小。單位:KB|MB|GB--> <maximumFileSize value="200MB"/> <!--最多保留的文件數(shù),設(shè)為"-1"則不限--> <maxSizeRollBackups value="-1"/> <!--日志格式--> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="[%d{HH:mm:ss}]%m%n"/> </layout> <filter type="log4net.Filter.LevelRangeFilter"> <param name="LevelMin" value="ERROR" /> <param name="LevelMax" value="ERROR" /> </filter> </appender> <!-- 警告 Warn.log--> <appender name="WarnLog" type="log4net.Appender.RollingFileAppender"> <!--目錄路徑,可以是相對路徑或絕對路徑--> <param name="File" value="C:\logs\"/> <!--文件名,按日期生成文件夾--> <param name="DatePattern" value="/yyyy-MM-dd/"Warn.log""/> <!--追加到文件--> <appendToFile value="true"/> <!--創(chuàng)建日志文件的方式,可選值:Date[日期],文件大小[Size],混合[Composite]--> <rollingStyle value="Composite"/> <!--寫到一個文件--> <staticLogFileName value="false"/> <!--單個文件大小。單位:KB|MB|GB--> <maximumFileSize value="200MB"/> <!--最多保留的文件數(shù),設(shè)為"-1"則不限--> <maxSizeRollBackups value="-1"/> <!--日志格式--> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="[%d{HH:mm:ss}]%m%n"/> </layout> <filter type="log4net.Filter.LevelRangeFilter"> <param name="LevelMin" value="WARN" /> <param name="LevelMax" value="WARN" /> </filter> </appender> <!-- 信息 Info.log--> <appender name="InfoLog" type="log4net.Appender.RollingFileAppender"> <!--目錄路徑,可以是相對路徑或絕對路徑--> <param name="File" value="C:\logs\"/> <!--文件名,按日期生成文件夾--> <param name="DatePattern" value="/yyyy-MM-dd/"Info.log""/> <!--追加到文件--> <appendToFile value="true"/> <!--創(chuàng)建日志文件的方式,可選值:Date[日期],文件大小[Size],混合[Composite]--> <rollingStyle value="Composite"/> <!--寫到一個文件--> <staticLogFileName value="false"/> <!--單個文件大小。單位:KB|MB|GB--> <maximumFileSize value="200MB"/> <!--最多保留的文件數(shù),設(shè)為"-1"則不限--> <maxSizeRollBackups value="-1"/> <!--日志格式--> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="[%d{HH:mm:ss}]%m%n"/> </layout> <filter type="log4net.Filter.LevelRangeFilter"> <param name="LevelMin" value="INFO" /> <param name="LevelMax" value="INFO" /> </filter> </appender> <!-- 調(diào)試 Debug.log--> <appender name="DebugLog" type="log4net.Appender.RollingFileAppender"> <!--目錄路徑,可以是相對路徑或絕對路徑--> <param name="File" value="C:\logs\"/> <!--文件名,按日期生成文件夾--> <param name="DatePattern" value="/yyyy-MM-dd/"Debug.log""/> <!--追加到文件--> <appendToFile value="true"/> <!--創(chuàng)建日志文件的方式,可選值:Date[日期],文件大小[Size],混合[Composite]--> <rollingStyle value="Composite"/> <!--寫到一個文件--> <staticLogFileName value="false"/> <!--單個文件大小。單位:KB|MB|GB--> <maximumFileSize value="200MB"/> <!--最多保留的文件數(shù),設(shè)為"-1"則不限--> <maxSizeRollBackups value="-1"/> <!--日志格式--> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="[%d{HH:mm:ss}]%m%n"/> </layout> <filter type="log4net.Filter.LevelRangeFilter"> <param name="LevelMin" value="DEBUG" /> <param name="LevelMax" value="DEBUG" /> </filter> </appender> </log4net>
log4net配置參數(shù)此處不多贅述,只針對日志的輸出格式參數(shù)conversionPattern
配置做簡要說明。
%M 輸出日志方法名 %m 輸出日志消息內(nèi)容 %p 輸出優(yōu)先級,即DEBUG,INFO,WARN,ERROR,F(xiàn)ATAL %r 輸出自應(yīng)用啟動到輸出該log信息耗費(fèi)的毫秒數(shù) %c 輸出所屬的類目,通常就是所在類的全名 %t 輸出產(chǎn)生該日志事件的線程名 %n 輸出一個換行符 %l或%L 輸出日志事件的發(fā)生位置,包括類目名、發(fā)生的線程,以及在代碼中的行數(shù)。 %c 輸出日志信息所屬的類的全名 %d 輸出完整的日志時間點(diǎn)的日期時間,支持自定義格式。比如:%d{HH:mm:ss},輸出類似:22:10:28 %f 輸出日志信息所屬的類的類名
4.在Program中使用log4net輸出自定義日志內(nèi)容
using log4net; var builder = WebApplication.CreateBuilder(args); //注入Log4Net builder.Services.AddLogging(cfg => { cfg.AddLog4Net(); //默認(rèn)的配置文件路徑是在根目錄,且文件名為log4net.config //如果文件路徑或名稱有變化,需要重新設(shè)置其路徑或名稱 //比如在項(xiàng)目根目錄下創(chuàng)建一個名為cfg的文件夾,將log4net.config文件移入其中,并改名為log.config //則需要使用下面的代碼來進(jìn)行配置 //cfg.AddLog4Net(new Log4NetProviderOptions() //{ // Log4NetConfigFileName = "cfg/log.config", // Watch = true //}); }); var app = builder.Build(); //訪問根頁面時 app.MapGet("/", (ILogger<Program> logger) => { logger.LogInformation("logger:測試一下Log4Net=》Info"); return "Hello World!"; }); //訪問test頁面時 app.MapGet("/test", () => { var log = LogManager.GetLogger(typeof(Program)); log.Info("log:這是一條普通日志信息"); }); app.Run();
5.將項(xiàng)目運(yùn)行起來,即可發(fā)現(xiàn)日志文件已生成
6.擴(kuò)展使用:使用簡單工廠模式IOC注入到自定義類中使用
新建一個ITestLog4Net
接口文件,并為其定義一個Log
方法。
并且新建一個TestLog4Net
的自定義類,繼承于ITestLog4Net
,并實(shí)現(xiàn)該Log
方法。
在Program中注入我們的自定義類TestLog4Net
builder.Services.AddTransient<ITestLog4Net, TestLog4Net>();
testLog4Net.Log();
使用方法
var testLog4Net = app.Services.GetService<ITestLog4Net>()!;
或者
var services = new ServiceCollection()!;
var provider = services.BuildServiceProvider()!;
var testLog4Net = provider.GetService<ITestLog4Net>()!;
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'.
推薦使用上面的寫法,百度之后,得到的答案是:不要通過調(diào)用BuildServiceProvider()這個方法應(yīng)該只被 Host 調(diào)用一次。重復(fù)的服務(wù)提供者可能會導(dǎo)致一些意想不到的錯誤。如果有哪位大佬知道具體原因,請告知一下,謝謝!
Tips:代碼中的感嘆號!表示該對象不會為空,一定要確保該對象不會為空才能這樣寫,這是C#10中的新特性。
到此這篇關(guān)于在.NET 6中使用日志組件log4net的文章就介紹到這了。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
asp.net mvc實(shí)現(xiàn)簡單的實(shí)時消息推送
這篇文章主要介紹了asp.net mvc實(shí)現(xiàn)簡單的實(shí)時消息推送的相關(guān)資料,需要的朋友可以參考下2016-07-07.Net中如何將一個實(shí)例的內(nèi)存二進(jìn)制內(nèi)容讀出來(超簡單方法)
這篇文章主要介紹了如何將一個實(shí)例的內(nèi)存二進(jìn)制內(nèi)容讀出來(超簡單方法),接下來的內(nèi)容中,我們將利用一個簡單的方法輸出指定實(shí)例的字節(jié)序列,并此次分析值類型和引用類型實(shí)例在內(nèi)存的布局,需要的朋友可以參考下2023-07-07asp.net中上傳圖片文件實(shí)現(xiàn)防偽圖片水印并寫入數(shù)據(jù)庫
asp.net上傳圖片文件實(shí)現(xiàn)防偽圖片水印并寫入數(shù)據(jù)庫,需要的朋友可以參考下。2010-10-10ASP.NET實(shí)現(xiàn)根據(jù)URL生成網(wǎng)頁縮略圖的方法
這篇文章主要介紹了ASP.NET實(shí)現(xiàn)根據(jù)URL生成網(wǎng)頁縮略圖的方法,結(jié)合實(shí)例較為詳細(xì)的分析了asp.net生成網(wǎng)頁縮略圖的詳細(xì)實(shí)現(xiàn)技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下2015-11-11