使用 NLog 为特定类实例单独的日志文件

Posted

技术标签:

【中文标题】使用 NLog 为特定类实例单独的日志文件【英文标题】:Separate log file for specific class instance using NLog 【发布时间】:2015-09-28 23:34:21 【问题描述】:

我需要为每个类实例编写事件日志以分隔文件。历史上项目使用 NLog 进行日志记录,所以我想尝试使用 NLog 解决这个问题(我找到了类似的主题 Unique log file for each instance of class,但建议使用 log4net)

目前我正在获取这样的记录器实例:

    public static Logger GetInstanceLogger(string name, bool init = false)
    
        if (!LogManager.Configuration.AllTargets.Any(t => t.Name == name))
        
            var target = new FileTarget();

                target.Name = name;
                target.FileName = string.Format("logs/0.$shortdate.log", name);

            target.Layout =
           "$date:format=dd.MM.yyyy HH\\:mm\\:ss.fff thread[$threadid] $logger ($level:uppercase=true): $message. $exception:format=ToString";
            var config = init ? new LoggingConfiguration() : LogManager.Configuration;
            config.AddTarget(name, target);

            var ruleInfo = new LoggingRule("*", LogLevel.Trace, target);

            config.LoggingRules.Add(ruleInfo);

            LogManager.Configuration = config;

            LogManager.ReconfigExistingLoggers();
        

        var logger = LogManager.GetLogger(name);

        return logger;
    

现在它正在将相同的日志写入所有文件(我想这是由日志级别引起的)。有没有办法使用 NLog 完成这项任务?

谢谢。

【问题讨论】:

【参考方案1】:

我提出了在文件名中使用布局渲染器的事件属性的解决方案。当我编写新消息以记录时,我将文件名添加为 LogEventInfo 的属性

protected virtual void SendEvent(LogLevel level, string message, Exception exception, string memberName = null)
    
        var logEvent = new LogEventInfo(level, _name, message);
        logEvent.Exception = exception;
        foreach (String key in _properties.Keys)
        
            logEvent.Properties[key] = _properties[key];
        
        _logger.Log(logEvent);
    

并且在 NLog 目标部分的配置文件中:

  <targets async="true">
  <target xsi:type="File" name="f" fileName="$basedir/logs/$shortdate_$event-properties:item=Name.log"
          layout="$detailedLayout" />
  <target xsi:type="File" name="errorLogFile" fileName="$basedir/logs/$shortdate.ERROR_$event-properties:item=Name.log"
      layout="$detailedLayout" />
</targets>

【讨论】:

【参考方案2】:
try var ruleInfo = new LoggingRule(name, LogLevel.Trace, target);

【讨论】:

以上是关于使用 NLog 为特定类实例单独的日志文件的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core 使用NLog打印html格式日志

NLog 不创建日志文件

Nlog - Web.config 规则 - 仅用于 Global.asax 文件的日志文件?

最有用的 NLog 配置

拥有不同配置的 NLog 记录器

为每个 Logger 实例动态设置 Nlog 日志级别 ASP.Net Core 2.x