登录多个文件的最佳方式是什么(每个请求一个文件)

时间:2016-06-20 11:41:29

标签: c# logging nlog

我有一个Windows服务,我希望能够将每个请求(以及与该请求相关的调试消息)记录在一个文件中(每个请求一个文件)。

并且还有一个通用日志,我只记录时间和请求ID,我想存储在一个文件中。

我正在使用Nlog,并为每个新请求创建一个新的记录器

private Logger CreateNewLogger( string logerName ) {
      var logger = LogManager.GetLogger( logerName );
      var target = new FileTarget {
        Layout = new SimpleLayout( "${time} | ${level:uppercase=true} | ${message} | ${exception:format=tostring}" ), AutoFlush = true
      };
      target.FileName = "${basedir}/Logs/${date:format=dd}-${date:format=MM}-${date:format=yyyy}/" + logerName + ".txt";
      var rule = new LoggingRule( logerName, LogLevel.Trace, target );
      var configuration = new LoggingConfiguration();
      configuration.AddTarget( logerName, target );
      configuration.LoggingRules.Add( rule );
      logger.Factory.Configuration = configuration;
      return logger;
    }

但这样做似乎不正确......因为我将结束创建无数个记录器并可能产生内存问题。

当我做

时,通用记录器也没有正常工作
LogManager.GetCurrentClassLogger().Info( "Received resolve request ID:" + srgMsgId );

它仍会记录我创建的其中一个日志而不是一般日志。那是为什么?

无论如何,真正的问题是如何使用nlog实现我的目标?

1 个答案:

答案 0 :(得分:2)

如果我理解正确,您可以使用Configuration variables指定记录器应记录的路径。

using NLog;

public static class LogService {
    private static Logger logger = LogManager.GetLogger("Logs");
    private static object lockObject = new object();

    public static void Log(string loggerName)
    {
        lock (lockObject)
        {
            LogManager.Configuration.Variables["LoggerName"] = loggerName;
            logger.Log("some message");
        }
    }
}

然后在你的配置文件中有:

<target name="Logs"
    xsi:type="File"
    fileName="${var:LoggerName}.csv">
    <layout xsi:type="CSVLayout">
        <column name="Message" layout="${message}" />
    </layout>
</target>

您可以通过代码完成所有这些操作,而不需要配置文件设置,但这种方法适用于我们。

对于通用日志,您可以使用LoggerName的默认值,每次都会记录到同一个地方。