• 在.NET中使用NLog组件


    .NET中,控制台程序、Winform、WPF使用NLog的方式相同,本文通过.NET5控制台程序说明如何使用NLog组件。

    1、引用NLog组件

    下面2种方法都可以引用NLog组件:

    (1) 通过NuGet安装NLog包。

    (2) 直接引用相应版本的NLog.dll。

    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>
        <logger name="*" minlevel="Debug" writeTo="allfile"/>
      </rules>
    </nlog>

    3、NLog封装

    public static class LogHelper
    {
        //NLog日志对象
        private static Logger _logger;
    
        /// <summary>
        /// 初始化日志组件
        /// </summary>
        /// <param name="configFile">NLog日志配置文件</param>
        public static void Startup(string configFile)
        {
            if (string.IsNullOrWhiteSpace(configFile))
            {
                throw new ArgumentException(@"NLog ConfigFile is null or whitespace");
            }
    
            try
            {
                _logger = LogManager.LoadConfiguration(configFile).GetCurrentClassLogger();
            }
            catch (Exception e)
            {
                Console.WriteLine($@"NLog LoadConfiguration Exception: {e.Message}.");
            }
        }
    
        /// <summary>
        /// 关闭日志组件
        /// </summary>
        public static void Shutdown()
        {
            _logger = null;
            LogManager.Shutdown();
        }
    
        public static void Trace(object value)
        {
            _logger?.Trace(value);
        }
    
        public static void Debug(object value)
        {
            _logger?.Debug(value);
        }
    
        public static void Info(object value)
        {
            _logger?.Info(value);
        }
    
        public static void Warn(object value)
        {
            _logger?.Warn(value);
        }
    
        public static void Error(object value)
        {
            _logger?.Error(value);
        }
    
        public static void Fatal(object value)
        {
            _logger?.Fatal(value);
        }
    }

    4、NLog使用

    static void Main()
    {
        //启动日志组件
        var directoryInfo = new DirectoryInfo(Assembly.GetExecutingAssembly().Location);
        var configFile = Path.Combine(directoryInfo.Parent?.FullName ?? string.Empty, "NLog.config");
        LogHelper.Startup(configFile);
    
        LogHelper.Trace("trace");
        LogHelper.Debug("debug");
        LogHelper.Info("info");
        LogHelper.Warn("warn");
        LogHelper.Error("error");
        LogHelper.Fatal("fatal");
    
        //关闭日志组件
        LogHelper.Shutdown();
    }
  • 相关阅读:
    【Linux】【Shell】【Basic】文件查找locate,find
    【Linux】【Shell】【text】Vim
    【Linux】【Shell】【text】文本处理工具
    【Linux】【Shell】【text】grep
    【Linux】【Basis】用户、组和权限管理
    什么是高并发;超发的解决思路(悲观锁与乐观锁);高并发与多线程的关系--持续更新(十四)
    线程池的应用(十三)
    线程池基本概念(十二)
    ThreadLocal(十一)
    tomcat的单例多线程代码示例(十)
  • 原文地址:https://www.cnblogs.com/xhubobo/p/16292789.html
Copyright © 2020-2023  润新知