0 Log4Net 日志集成到 ILogger
ansonzhang edited this page 2019-12-11 13:07:39 +08:00
This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

在api层内容根目录添加 config 文件

Blog.Core
├─ Controllers
│  └─ WeatherForecastController.cs
├─ Log4net.config // 就是这里
├─ Program.cs
├─ Properties
│  └─ launchSettings.json
├─ Startup.cs
├─ appsettings.Development.json
└─ appsettings.json

config 的内容是:

<?xml version="1.0" encoding="utf-8"?>
<log4net>
    <!-- 将日志以回滚文件的形式写到文件中 -->
    <!-- 按日期切分日志文件,并将日期作为日志文件的名字 -->
    <appender name="RollingFileAppenderNameByDate" type="log4net.Appender.RollingFileAppender">
      <!-- 日志文件存放位置,可以为绝对路径也可以为相对路径 -->
      <file value="Log/" />
      <!-- 将日志信息追加到已有的日志文件中-->
      <appendToFile value="true" />
      <!-- 最小锁定模式,以允许多个进程可以写入同一个文件 -->
      <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
      <!-- 指定按日期切分日志文件 -->
      <rollingStyle value="Date" />
      <!-- 日志文件的命名规则 -->
      <datePattern value="&quot;GlobalExcepLogs_&quot;yyyyMMdd&quot;.log&quot;" />
      <!-- 当将日期作为日志文件的名字时必须将staticLogFileName的值设置为false -->
      <staticLogFileName value="false" />

      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date| %newline%message%newline--------------------------------%newline" />        
        <!-- 这里也可以直接用json格式输出具体请自行百度 -->
      </layout>
    </appender>

    <root>
      <!-- 控制级别由低到高ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF -->
      <!-- 比如定义级别为INFO则INFO级别向下的级别比如DEBUG日志将不会被记录 -->
      <!-- 如果没有定义LEVEL的值则缺省为DEBUG -->
      <level value="ALL" />
      <!-- 按日期切分日志文件,并将日期作为日志文件的名字 -->
      <appender-ref ref="RollingFileAppenderNameByDate" />
    </root>
  </log4net>

引用 nuget 包

  <ItemGroup>
    <PackageReference Include="Microsoft.Extensions.Logging.Log4Net.AspNetCore" Version="3.0.3" />
  </ItemGroup>

Program.cs 创建服务


 XmlDocument log4netConfig = new XmlDocument();
 log4netConfig.Load(File.OpenRead("Log4net.config"));//注意名字

 var repo = log4net.LogManager.CreateRepository(
     Assembly.GetEntryAssembly(), typeof(log4net.Repository.Hierarchy.Hierarchy));

 log4net.Config.XmlConfigurator.Configure(repo, log4netConfig["log4net"]);


配置中间件,接管 ILogger

 public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory)
 {
     if (env.IsDevelopment())
     {
         app.UseDeveloperExceptionPage();
     }
     
     // 就是这里
     loggerFactory.AddProvider(new Log4NetProvider("Log4net.config"));

     app.UseRouting();

     app.UseAuthorization();

     app.UseEndpoints(endpoints =>
     {
         endpoints.MapControllers();
     });
 }


控制器注入

 private readonly ILogger<WeatherForecastController> _logger;

 public WeatherForecastController(ILogger<WeatherForecastController> logger)
 {
     _logger = logger;
 }

 [HttpGet]
 public IEnumerable<WeatherForecast> Get()
 {
     _logger.LogError("this is an error.");
     var rng = new Random();
     return null;
 }