在.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();
}
posted @ 2022-05-20 16:31  xhubobo  阅读(918)  评论(0编辑  收藏  举报