记录到多个文件夹
Logging to multiple folders
我有一个 windows 服务,它接受 Web 请求来触发一个长 运行 异步任务。我希望每个任务将日志输出到不同的目录(其名称由请求 ID 和触发作业的用户确定)。在每个目录中,我有多个日志文件。
我正在使用 Common.Logging 和 log4net。但是,我必须重置 log4net 配置才能更改目录(如下所示),如果一个任务被触发而另一个任务仍然是 运行,这将无法正常工作。两个任务的日志都更改为最新创建的目录。
protected ILog CreateLoggerInstance(string loggerName, string logFolder)
{
logFolder += "/";
// This is a hack to avoid creation of a folder called (null), because of limitation in log4net.
// More details: https://github.com/net-commons/common-logging/issues/81
log4net.GlobalContext.Properties["LogsDirectory"] = logFolder;
this.LogInstance = LogManager.GetLogger(loggerName);
this.LogInstance.GlobalVariablesContext.Set("LogsDirectory", logFolder);
LogManager.Reset();
this.LogInstance = LogManager.GetLogger(loggerName);
this.LogFolder = logFolder;
return this.LogInstance;
}
有没有办法只为特定的记录器设置日志?或者我能以某种方式避免 Reset() 吗?此外,这段特定的代码是我唯一提到 log4net 的地方。所以如果我可以为每个日志集创建多个文件夹,我可以转移到 NLog。
编辑:我在 NLog 中发现了这个功能 - https://github.com/NLog/NLog/wiki/Configure-component-logging
但是好像Common.Logging不支持
NLog 中的解决方案非常简单,
只需在 fileName
属性中使用 requestId
和 user
。
<targets>
<target name="file" xsi:type="File"
layout="${longdate} ${logger} ${message}"
fileName="${basedir}/${var:requestid}_${var:user}.log" />
</targets>
<rules>
<logger name="*" minlevel="Debug" writeTo="file" />
</rules>
您可以在各种上下文中设置请求 ID 和用户名:全局变量、GDC/MDC 等。参见 https://github.com/NLog/NLog/wiki/Gdc-layout-renderer
我有一个 windows 服务,它接受 Web 请求来触发一个长 运行 异步任务。我希望每个任务将日志输出到不同的目录(其名称由请求 ID 和触发作业的用户确定)。在每个目录中,我有多个日志文件。
我正在使用 Common.Logging 和 log4net。但是,我必须重置 log4net 配置才能更改目录(如下所示),如果一个任务被触发而另一个任务仍然是 运行,这将无法正常工作。两个任务的日志都更改为最新创建的目录。
protected ILog CreateLoggerInstance(string loggerName, string logFolder)
{
logFolder += "/";
// This is a hack to avoid creation of a folder called (null), because of limitation in log4net.
// More details: https://github.com/net-commons/common-logging/issues/81
log4net.GlobalContext.Properties["LogsDirectory"] = logFolder;
this.LogInstance = LogManager.GetLogger(loggerName);
this.LogInstance.GlobalVariablesContext.Set("LogsDirectory", logFolder);
LogManager.Reset();
this.LogInstance = LogManager.GetLogger(loggerName);
this.LogFolder = logFolder;
return this.LogInstance;
}
有没有办法只为特定的记录器设置日志?或者我能以某种方式避免 Reset() 吗?此外,这段特定的代码是我唯一提到 log4net 的地方。所以如果我可以为每个日志集创建多个文件夹,我可以转移到 NLog。
编辑:我在 NLog 中发现了这个功能 - https://github.com/NLog/NLog/wiki/Configure-component-logging
但是好像Common.Logging不支持
NLog 中的解决方案非常简单,
只需在 fileName
属性中使用 requestId
和 user
。
<targets>
<target name="file" xsi:type="File"
layout="${longdate} ${logger} ${message}"
fileName="${basedir}/${var:requestid}_${var:user}.log" />
</targets>
<rules>
<logger name="*" minlevel="Debug" writeTo="file" />
</rules>
您可以在各种上下文中设置请求 ID 和用户名:全局变量、GDC/MDC 等。参见 https://github.com/NLog/NLog/wiki/Gdc-layout-renderer