C# 在Log4Net中向rollingfileappender的文件名添加变量

C# 在Log4Net中向rollingfileappender的文件名添加变量,c#,logging,log4net,log4net-appender,C#,Logging,Log4net,Log4net Appender,是否有方法使fileAppender变量的名称变为空? 也就是说,当我在控制器上调用一个操作并获取一个对象时,我想将其写入一个日志文件。 文件的名称类似于: yyyyMMdd\u hhmsms\u[controller]\u[method].json 这是我的配置文件中的内容: <appender name="JsonFileAppender" type="log4net.Appender.RollingFileAppender" > <file value="c:\tem

是否有方法使fileAppender变量的名称变为空? 也就是说,当我在控制器上调用一个操作并获取一个对象时,我想将其写入一个日志文件。 文件的名称类似于: yyyyMMdd\u hhmsms\u[controller]\u[method].json

这是我的配置文件中的内容:

<appender name="JsonFileAppender" type="log4net.Appender.RollingFileAppender" >
  <file value="c:\temp\" />
  <datePattern value="yyyyMMdd_hh.mm.ss.ms_%thread{CommonApplicationData}'.json'" />
  <staticLogFileName value="false" />
  <appendToFile value="true" />
  <rollingStyle value="Composite" />
  <maxSizeRollBackups value="10" />
  <maximumFileSize value="5MB" />
  <layout type="log4net.Layout.PatternLayout">
    <param name="ConversionPattern" value="%message%newline" />
  </layout>
</appender>


这将返回以下文件名:20160224_01.30.28.3028_P1rea24{co30onapplicationdapa}.json

一种方法是在代码中设置环境变量,如:

Environment.SetEnvironmentVariable("APPENDER_FILE", "Your File Path");
然后,在log4net XML中配置此环境变量:

  <appender name="FileAppender" type="log4net.Appender.FileAppender">
    <file value="${APPENDER_FILE}"/>

您可以在运行时访问log4net配置的附加器,如下所示

var repository = (Hierarchy)LogManager.GetRepository();
var appenders = repository.GetAppenders().Where(x => x is FileAppender);
您可以通过名称获得特定的appender

var appender = appenders.FirstOfDefault(x => x.Name.Equals("MyAppeader"));
一旦你有了一个appender,你可以随意修改它。您想设置文件路径吗

appender.File = @"c:\folder\yyyyMMdd_hhmssms_[controller]_[method].json";
您不应该让log4net执行任何其他操作,因为log4net应该自动开始使用新配置

将这一切放入一个小助手方法中,您将得到以下结果

public static void SetAppenderPath(string appender, string path)
{
    var repository = (Hierarchy)LogManager.GetRepository();
    var appenders = repository.GetAppenders().Where(x => x is FileAppender);
    var appender = appenders.FirstOfDefault(x => x.Name.Equals(appender));

    if (appender == null)
    {
        throw new ConfigurationErrorsException("Appender not found (" + appender + ")");
    }

    appender.File = path;
}

...

LogHelper.SetAppenderPath("MyAppender", @"yyyyMMdd_hhmssms_[controller]_[method].json");

这将为每个日志条目创建一个文件@斯图尔特:我知道,这是客户想要的。只是记录发送到api的json,但这意味着在配置记录器时需要设置环境变量。所以我写的地方是:log4net.Config.XmlConfigurator.Configure()?在修改代码中的appender时,您应该始终在之后调用
appender.ActivateOptions()
:某些更改可能不需要它,但其他更改需要它,所以每次都调用它是一种很好的做法。