NetCore2.x 使用Log4Net(一)


前言:本章僅僅是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&quot;.log&quot;"/>
      <!--創建日志文件的方式,可選值: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");
        }
    }

 


免責聲明!

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



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