前言:本章僅僅是Log4Net的基本簡單的運用,后續章節會按照我的項目使用情況進行深入研究
1.項目搭建
- 新建一個基於.netCore2.x的Web項目 => 過程略
- 給新建項目安裝log4net包(NuGet安裝 ) => 過程略
2.添加配置文件 log4Net.config
配置文件路徑暫時就放在根目錄,我怕到時候讀取不到(盡量少給自己找事)
2.1 配置文件內容
<?xml version="1.0" encoding="utf-8"?> <configuration> <log4net> <root> <level value="ALL" /> <appender-ref ref="RollingFile" /> </root> <appender name="RollingFile" type="log4net.Appender.RollingFileAppender"> <!--文件路徑 如果不設置(去掉 value="Log")會默認保存到[App_Data]文件夾中--> <param name="File" value="Log"/> <!--追加到文件--> <param name="AppendToFile" value="true"/> <!--最多保留的文件數,設為"-1"則不限--> <param name="MaxSizeRollBackups" value="365"/> <!--寫到一個文件--> <param name="StaticLogFileName" value="false"/> <!--文件名,按日期命名--> <param name="DatePattern" value="yyyyMMdd".log""/> <!--創建日志文件的方式,可選值:Date[日期],文件大小[Size],混合[Composite]--> <param name="RollingStyle" value="Date"/> <!--日志格式--> <layout type="log4net.Layout.PatternLayout"> <!--%newline輸出的日志會換行 [%date{HH:mm:ss fff}]表示記錄的時間 --> <conversionPattern value="[%date{HH:mm:ss fff}] %- %message%newline" /> <!--如果想自己設置格式就只需要--> <!--<conversionPattern value="%message"/>--> </layout> </appender> </log4net> </configuration>
ps:看不懂沒關系,先用起來再說,沒有直觀體驗,說了沒有用
2.2 注冊Log4Net服務
- 實現方式一
這是我看了網上大多數實現方式,是在 Startup.cs 中創建一個靜態變量 ,然后在其它類中調用這個靜態方法獲取Log對象,如下:
public class Startup { public static ILoggerRepository repository { get; set; }
public Startup(IConfiguration configuration) { Configuration = configuration; repository = LogManager.CreateRepository("NETCoreRepository"); // 指定配置文件 XmlConfigurator.Configure(repository, new FileInfo("log4net.config")); } } public class HomeController : Controller { private ILog log; public HomeController(IHostingEnvironment hostingEnv) { this.log = LogManager.GetLogger(Startup.repository.Name, typeof(HomeController)); } public IActionResult Index() { log.Error("測試日志"); return View(); } }
ps: 我在想,既然都在使用netcore 為啥不將 ILog 注入的服務中,構造函數注入直接獲得呢。其實最大的可能就是在獲取 Log實例的時候傳入一個參數 typeof(HomeController),請移駕到該博客
https://blog.csdn.net/lixwjava/article/details/45950559
在我的項目中,會對寫日志進行二次封裝,對輸出格式會有一定規定,所以,我會將Log 直接注入service中,如何封裝將在后續博客中詳細分析。
- 實現方式二
在 Startup.cs 文件的 ConfigureServices 方法中添加代碼,結果如下
public void ConfigureServices(IServiceCollection services) { services.Configure<CookiePolicyOptions>(options => { // This lambda determines whether user consent for non-essential cookies is needed for a given request. options.CheckConsentNeeded = context => true; options.MinimumSameSitePolicy = SameSiteMode.None; }); var repository = LogManager.CreateRepository("NETCoreLogRepository"); XmlConfigurator.Configure(repository, new FileInfo("log4net.config")); services.AddSingleton<ILog>(LogManager.GetLogger(repository.Name, typeof(Startup))); }
創建分為三步:
a.創建一個Log4Net 倉庫 repository
b.指定該倉庫的配置文件路徑
c.創建一個Log 實例 注入到 Service中
2.2 使用方法
項目中需要寫日志的地方直接構造函數注入,代碼如下:
public class HomeController : Controller { public readonly ILog _log; public HomeController(ILog log) { _log = log; _log.Info("This is Info Info"); } }
以上,最簡單的使用方式。下篇將介紹如何根據不同日志等級寫入不同的文件中。
后記:后來想了一想,其實我們可以在將 ILoggerRepository 注入到services中而不是將ILog注入,在使用的地方就可以動態指定typeof,以便跟蹤對象,反正就是不想用靜態變量,如下:
public void ConfigureServices(IServiceCollection services) { services.Configure<CookiePolicyOptions>(options => { // This lambda determines whether user consent for non-essential cookies is needed for a given request. options.CheckConsentNeeded = context => true; options.MinimumSameSitePolicy = SameSiteMode.None; }); var repository = LogManager.CreateRepository("NETCoreLogRepository"); XmlConfigurator.Configure(repository, new FileInfo("log4net.config")); services.AddSingleton<ILoggerRepository>(repository)); } public class HomeController : Controller { public readonly ILog _log; public HomeController(ILoggerRepository repository) { _log = LogManager.GetLogger(repository.Name,typeof(HomeController)); _log.Info("This is Info Info"); } }