log4net基于cmdline数据的不同文件夹

时间:2018-03-08 16:37:23

标签: log4net

假设我有一个接受状态代码的命令行参数的应用程序。每个州都有自己的工作,因此应用程序本身可以同时运行多次,但每次只能运行一次。我想使用此命令行参数来创建/写入具有相同记录值的文件夹,以便它们不会相互跳闸。所以最后我会:

logfiles/WI/logfile.log
logfiles/MN/logfile.log
logfiles/MI/logfile.log

WI,MN,MI是1 app的命令行参数。

我目前尝试做的是在app.config和代码循环中使用string.Format()的格式,并使用该cmdline值按状态名称创建日志文件夹。

<param name="File" value="./logfiles/{0}/logfile.txt" />

public static void SetupLogFileVendorPath(string state)
        {
            foreach (var fileAppender in LogManager.GetRepository().GetAppenders().OfType<FileAppender>())
            {
                // apply transformation to the filename
                fileAppender.File = string.Format(fileAppender.File, state);

                // notify the logging subsystem of the configuration change
                fileAppender.ActivateOptions();
            }
        }

这种方法可以创建状态文件夹和日志文件,但它也会创建一个名为的文件夹:

logfiles/{0}/logfile.txt

因为如果2个实例恰好在同一时间运行,它就会产生这个问题,因为它们都会尝试写入{0}下的这个文件,这些文件最初都是在LogManager.GetRepository()行中执行的.GetAppenders () 叫做。他们只是把页眉/页脚,但它确实写到这个中心位置,这是我想要避免的。

有没有办法获得我正在寻找的结构,同时避免使用我在使用string.Format()

的方式避免这个{0}

1 个答案:

答案 0 :(得分:0)

将状态代码命令行参数连接到Log4net context property

static void Main(string[] args)
{
    string stateCode = args[0];
    log4net.GlobalContext.Properties["stateCode"] = stateCode;    

    // ...
}

通过(Rolling)FileAppender将此上下文属性包括在%property{stateCode}配置的输出文件路径中。

<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
    <file type="log4net.Util.PatternString" value="logfiles\%property{stateCode}\logfile.log" />

    <!-- More settings here -->
</parameters>

这样做将创建一个子文件夹,并带有传递的命令行参数的名称。