C# 是否可以动态设置%property{PropertyName}?

C# 是否可以动态设置%property{PropertyName}?,c#,log4net,C#,Log4net,我正在使用log4net和C#来记录我的应用程序 我知道我可以这样做: GlobalContext.Properties["PropertyName"] = "NewValue"; XmlConfigurator.Configure(); 它是有效的。 但这不是Thaaat dynamic,因为我必须再次调用Configure来设置新值。 在调用ILog.Info之前,是否有方法设置属性值 诸如此类: //here I set a new value for %property{Propert

我正在使用log4net和C#来记录我的应用程序

我知道我可以这样做:

GlobalContext.Properties["PropertyName"] = "NewValue";
XmlConfigurator.Configure();
它是有效的。 但这不是Thaaat dynamic,因为我必须再次调用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");

您可以在PatternLayout的conversionPattern中使用
%property{PropertyName}
,每次更改属性值时都会记录一个新值


如果您对appender配置属性使用属性,例如FileAppender的文件名或目录,那么在更改属性值后当然需要重新配置

Log4Net支持各种上下文<正如您所发现的,code>GlobalContext,就是其中之一<代码>线程上下文是另一种情况,我认为在您的场景中更合适:

log4net.ThreadContext["PropertyName"] = "NewValue";
无需调用
Configure
ThreadContext
中设置的属性可用于从当前线程对记录器的任何调用。以正常方式引用appender配置中的属性:

%property{PropertyName}

根据@joe comment,我编写了自己的附录,如下所示:

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方法close、acquire lock和open file是否是一件好事。
有什么想法吗?

我想你指的是log4net.ThreadContext.Properties[“PropertyName”]。无论如何,我已经尝试过你的例子,但我不得不调用XmlConfigurator.Configure();工作。谢谢,但我已经通过这种方式完成了。我需要一些更灵活的东西。@ramires.cabral-也许可以告诉我们您需要什么?我希望能够在每次调用ILog.Info时更改属性。我想在我的应用程序中的某些事件中为文件指定一个新名称。使用ThreadContext.Properties是可能的,但不调用Configure就不行。如果我在多个任务中运行它,则无法正常工作。你看,我没有使用log4net的经验。可能这是错误的方法。您是否也在尝试使用此方法更改文件日志附加程序写入的文件?如果是这样的话,你最初的问题就不清楚了,这可能不是最好的方法。我会为每个文件定义一个appender(假设有一个约束集),并使用过滤器过滤属性值。如果我的假设是正确的,我将为您写一个更完整的答案。如果您想通过更改属性来更改log4net记录到的文件名,那么不,这不能用标准Appender FileAppender和RollingFileAppender完成。要做到这一点,您需要编写自己的自定义appender。