我有一个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实现我的目标?
答案 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的默认值,每次都会记录到同一个地方。