使用NLog分隔特定类实例的日志文件

时间:2015-07-10 09:19:34

标签: c# .net logging nlog

我需要为每个类的实例编写事件日志来分隔文件。历史上项目使用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完成此任务?

感谢。

2 个答案:

答案 0 :(得分:3)

我使用文件名中的布局渲染器的事件属性提出了解决方案。当我将新消息写入日志时,我将文件名添加为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>

答案 1 :(得分:-1)

try var ruleInfo = new LoggingRule(name, LogLevel.Trace, target);