【问题标题】:Separate log file for specific class instance using NLog使用 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 完成这项任务?

谢谢。

【问题讨论】:

    标签: c# .net logging 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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-01
        • 2021-01-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多