五彩盒子五彩盒子五彩盒子

Nlog高并发日志记录从此不再掉日志记录

    之前做一个服务,请求量大,导致日志记录出问题,经常出现日志没记录进去的问题。

今天研究了一下Nlog,介绍支持高并发日志写入,并且可配置异步,同时支持.net framework和.net core以上版本。

1、首先通过Nuget安装包:

Install-Package NLog

Install-Package NLog.Config

2、配置Nlog,此处有两种方式。

2.1使用配置文件:在根目录创建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">
<!-- 定义日志目标 -->
<targets>
<!-- 控制台日志
<target name="console" xsi:type="Console" /> -->
<!-- 文件日志 -->
<!--<target name="file" xsi:type="File" fileName="Log/app.log" />-->
<target name="file" xsi:type="File" fileName="Log/${shortdate}/Nlog.log" layout="${longdate} ${level} ${message}" />
</targets>

<!-- 定义日志规则 -->
<rules>
<!-- 控制台日志
<logger name="*" minlevel="Info" writeTo="console" /> -->
<!-- 文件日志 -->
<logger name="*" minlevel="Info" writeTo="file" />
</rules>
</nlog>

2.1.1NLog配置文件信息简单概述:

rules【规则】说明:
规则是logger具有以下属性的元素:
name - 记录器名称过滤器 - 可能包含通配符(*和?)
minlevel - 记录的最低级别
maxlevel - 记录的最高级别
level - 单级记录
levels - 逗号分隔的记录级别列表
writeTo - 逗号分隔的要写入的目标列表
final - 最终规则匹配后不处理任何规则
enabled- 设置为false禁用规则而不删除它
ruleName- 规则标识符,允许使用Configuration.FindRuleByName和进行规则查找Configuration.RemoveRuleByName。在NLog 4.6.4中引入
注意:虽然命名了规则logger,但它没有定义记录器。它引用一个或多个记录器。
通过将规则name模式与记录器名称匹配,将规则映射到记录器。规则name属性可以包括通配符(*和?),以通过通配符匹配来匹配记录器名称。
* - 匹配0个或更多字符
? - 恰好匹配1个字符
targets【目标】:
每个目标由一个target元素表示。每个目标需要两个属性:
name - 目标名称
type - 目标类型 - 例如“文件”,“数据库”,“邮件”。使用名称空间时,此属性已命名xsi:type。
除了这些属性之外,目标通常还接受其他参数,这些参数会影响诊断跟踪的写入方式。每个目标都有一组不同的参数,它们在项目主页上有详细描述,并且它们是上下文相关的。Intellisense也可以在Visual Studio中使用。

2.2使用代码配置,在程序启动时配置:


using System;
using NLog;

class Program
{
    private static readonly Logger Logger = LogManager.GetCurrentClassLogger();

    static void Main(string[] args)
    {
        // 配置 NLog
        var config = new NLog.Config.LoggingConfiguration();

        // 控制台日志目标
        var consoleTarget = new NLog.Targets.ConsoleTarget("console");
        config.AddRule(LogLevel.Info, LogLevel.Fatal, consoleTarget);

        // 文件日志目标
        var fileTarget = new NLog.Targets.FileTarget("file")
        {
            FileName = "logs/app.log",
            Layout = "${longdate}|${level:uppercase=true}|${message}${exception:format=toString,Data}"
        };
        config.AddRule(LogLevel.Info, LogLevel.Fatal, fileTarget);

        // 应用配置
        LogManager.Configuration = config;

        Logger.Info("Hello, NLog!");

        // 继续你的应用程序逻辑
    }
}

3.可以封装一下


using NLog;
using System;

namespace Log
{
    public static class NlogHelper
    {
        private static readonly NLog.Logger logger = LogManager.GetCurrentClassLogger();

        public static void Debug(string message)
        {
            logger.Debug(message + "\r\n");
        }

        public static void Info(string message)
        {
            logger.Info(message + "\r\n");
        }

        public static void Warn(string message)
        {
            logger.Warn(message + "\r\n");
        }

        public static void Error(string message, Exception ex = null)
        {
            logger.Error(ex, message + "\r\n");
        }

        public static void Fatal(string message, Exception ex = null)
        {
            logger.Fatal(ex, message + "\r\n");
        }
    }
}

4.在需要记录日志的地方记录即可。



热门推荐