记录到多个文件夹

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 属性中使用 requestIduser

<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