我使用log4net和C#来记录我的应用程序。
我知道我可以这样做:
GlobalContext.Properties["PropertyName"] = "NewValue";
XmlConfigurator.Configure();
它有效。 但它不是动态的,因为我必须再次调用Configure来设置新值。 有没有办法在调用ILog.Info之前设置属性值?
类似的东西:
//here I set a new value for %property{PropertyName}
log.Info("Value to log");
//here I set a another one for %property{PropertyName}
log.Info("Value to log 2");
答案 0 :(得分:0)
您可以在PatternLayout的conversionPattern中使用Option Private Module
Public Sub DoSomething()
' DoSomething is not exposed as a macro,
' but can be called from anywhere in the VBA project.
End Sub
,每次更改属性值时都会记录一个新值。
如果对appender配置属性使用属性,例如FileAppender的文件名或目录,则当然需要在更改属性值后重新配置。
答案 1 :(得分:0)
Log4Net支持各种上下文。正如您所发现的,GlobalContext
就是其中之一。 ThreadContext
是另一个,我认为在您的方案中更合适:
log4net.ThreadContext["PropertyName"] = "NewValue";
无需致电Configure
。 ThreadContext
中设置的属性可用于从当前线程对记录器的任何调用。以正常方式引用appender配置中的属性:
%property{PropertyName}
答案 2 :(得分:0)
基于@joe评论我已经编写了我自己的appender如下:
public class MyCustomAppender : RollingFileAppender
{
bool firstRun = true;
string fileNamePattern = null;
protected override void Append(LoggingEvent loggingEvent)
{
CloseFile();
File = fileNamePattern.Replace("__filename__", ThreadContext.Properties["PropertyName"].ToString());
LockingModel.OpenFile(File, true, Encoding.UTF8);
LockingModel.AcquireLock();
OpenFile(File, true);
base.Append(loggingEvent);
DoAppend(loggingEvent);
}
public override string File
{
get
{
if (firstRun)
{
firstRun = false;
fileNamePattern = base.File;
}
return base.File;
}
set
{
base.File = value;
}
}
}
它有效,但并不意味着是正确的。我不知道在overrode Append方法关闭内是否是一件好事,每当我记录某些内容时获取锁定并打开文件。 有什么想法吗?