• 在.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;
        }
    }
  • 相关阅读:
    玩家移动
    人物上线(激活玩家之后)
    map 玩家上线
    无锁的环形队列
    随笔
    std::bind
    如何查找文件中的schema约束
    myeclipse便捷导包方式
    21 求1+2!+3!+...+20!的和
    20 求出这个数列的前 20 项之和
  • 原文地址:https://www.cnblogs.com/xhubobo/p/16293061.html
Copyright © 2020-2023  润新知