在.Net Core Web API中使用NLog组件

1、引用NLog组件

通过NuGet安装NLog、NLog.Web.AspNetCore包。

2、NLog配置

在项目中添加NLog.config文件,将其“生成操作”属性设置为“内容”,“复制到输出目录”属性设置为“如果较新则复制”,配置信息参见注释:

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      autoReload="true"
      keepVariablesOnReload="true"
      throwExceptions="false"
      internalLogLevel="Off"
      internalLogFile="log/nlog.txt">

  <!-- the targets to write to -->
  <targets async="true">
    <!-- File Target for all log messages with basic details -->
    <!--
    enableFileDelete: 是否允许删除日志文件。其取值类型为Boolean,默认为true。
    maxArchiveFiles: 保存的最大存档文件数。其类型类Integer,默认为9个。
    archiveNumbering: 存档文件的编号方式。
      可选值:
        Rolling – 滚动式编号,即最新的日志文件编号为0,然后是1,… ,N。
        Sequence – 序列式编号,即最大编号的日志文件为最新的日志文件。
    archiveAboveSize: 存档上限值。当日志文件大于此值是,将自动存档。其类型为Long。
      注意:在多进程并发记录日志的情况下,启用该选项可能会大幅降低日志记录速度。
      在单进程时,为了达到最佳性能,可以考虑设置ConcurrentWrites为false。
    bufferSize: 日志文件缓存区大小(单位:字节)。其取值类型为Integer,默认值为32768(32KB)。
    deleteOldFileOnStartUp: 启动时,是否删除旧的日志文件。其取值类型为Boolean,默认为false。
    concurrentWriteAttemptDelay: 在再次尝试将日志写入文件之前延迟的毫秒数。其取值类型为Integer,默认值为1。
      备注:实际的延迟时间,是一个介于0到指定参数值之间的随机整数,且在每次尝试失败之后,都会将此参数加倍。
      假使此参数值为10,则第一次重试写入的延迟时间(毫秒数)在 0-10之间的一个随机数,
      第二次重试时为0-20之间的一个随机数,第三次重试时为0-40之间的一个随机数,
      第四次重试时为0-80之间的一个随机数等等,以此类推。
    keepFileOpen: 是否保持日志文件处于打开状态,以代替其在每次日志写事件发生时频繁打开和关闭。
      其取值类型为Boolean,默认值为false。
      备注:设置此属性为true,有助于提高性能。
    openFileCacheTimeout: 文件保持打开状态的最大时间秒数。如果这个数字为负数,则在一定不活动时间后,
      文件不会自动关闭。其取值类型为Integer,默认值为-1。(即默 认状态下文件始终处于打开状态以备写入。)
    autoFlush: 在每次日志信息后,是否自动刷新文件缓存区。其取值类型为Boolean,默认值为true。
    createDirs: 是否允许自动创建(不存在的)目录。其取值类型为Boolean,默认为true。
    encoding: 文件编码方式。
    archiveFileName: 存档文件名称。允许使用Layout。
    -->
    <target xsi:type="File" name="allfile" fileName="${basedir}/logs/log.txt"
            enableFileDelete="true"
            maxArchiveFiles="20"
            concurrentWrites="true"
            archiveNumbering="Sequence"
            archiveAboveSize="2097152"
            bufferSize="327680"
            deleteOldFileOnStartup="false"
            concurrentWriteAttemptDelay="10"
            keepFileOpen="true"
            openFileCacheTimeout="30"
            autoFlush="false"
            openFileFlushTimeout="30"
            createDirs="true"
            encoding="utf-8"
            enableArchiveFileCompression="true"
            archiveFileName="${basedir}/archivelogs/log${date:format=yyyy\-MM\-dd_HH\-mm\-ss}.zip"
            layout="[${counter}]  ${longdate} [${level}] [${processid}] [${processname}]  ${message} ${newline} ${stacktrace}"/>
  </targets>

  <!-- rules to map from logger name to target -->
  <rules>
    <!--All logs, including from Microsoft-->
    <logger name="*" minlevel="Trace" writeTo="allfile"/>
  </rules>
</nlog>

3、注入NLog组件

在注入NLog组件之前要先对其进行配置,然后通过IHostBuilder接口注入NLog组件。

修改Program.cs如下:

public class Program
{
    public static void Main(string[] args)
    {
        var configFileName = Path.Combine("Config", "NLog.config");
        var logger = NLogBuilder.ConfigureNLog(configFileName).GetCurrentClassLogger();
        try
        {
            logger.Debug("Program startup.");
            CreateHostBuilder(args).Build().Run();
        }
        catch (Exception exception)
        {
            //NLog: catch setup errors
            logger.Error(exception, "Stopped program because of exception");
            throw;
        }
        finally
        {
            logger.Debug("Program shutdown.");
            // Ensure to flush and stop internal timers/threads before application-exit (Avoid segmentation fault on Linux)
            NLog.LogManager.Shutdown();
        }
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); })
            .ConfigureLogging(logging =>
            {
                logging.ClearProviders();
                logging.SetMinimumLevel(LogLevel.Trace);
            })
            .UseNLog(); // NLog: Setup NLog for Dependency injection
}

4、使用NLog组件

正常使用ILogger接口注入即可,不需要额外代码修改。

[ApiController]
[Route("api/[controller]")]
public class WeatherForecastController : ControllerBase
{
    private readonly ILogger<WeatherForecastController> _logger;

    public WeatherForecastController(ILogger<WeatherForecastController> logger)
    {
        _logger = logger;
    }
}
posted @ 2022-05-20 17:16  xhubobo  阅读(420)  评论(0编辑  收藏  举报