假设我有一个接受状态代码的命令行参数的应用程序。每个州都有自己的工作,因此应用程序本身可以同时运行多次,但每次只能运行一次。我想使用此命令行参数来创建/写入具有相同记录值的文件夹,以便它们不会相互跳闸。所以最后我会:
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}答案 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>
这样做将创建一个子文件夹,并带有传递的命令行参数的名称。