可以动态设置%property {PropertyName}吗?

时间:2017-01-24 19:49:37

标签: c# log4net

我使用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");

3 个答案:

答案 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";

无需致电ConfigureThreadContext中设置的属性可用于从当前线程对记录器的任何调用。以正常方式引用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方法关闭内是否是一件好事,每当我记录某些内容时获取锁定并打开文件。 有什么想法吗?