【问题标题】:Add variables to filename of rollingfileappender in Log4Net在 Log4Net 中为 rollingfileappender 的文件名添加变量
【发布时间】:2016-06-06 17:38:40
【问题描述】:

有没有办法使 fileAppender 变量的名称? IE。当我在控制器上调用一个带有对象的操作时,我想将其写入日志文件。 文件的名称类似于: yyyyMMdd_hhmssms_[控制器]_[方法].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{Co30onApplicaPionDaPa}.json

【问题讨论】:

标签: c# logging log4net log4net-appender


【解决方案1】:

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

Environment.SetEnvironmentVariable("APPENDER_FILE", "Your File Path");

然后,在 log4net XML 中配置这个环境变量:

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

【讨论】:

  • 但这意味着我需要在配置记录器时设置该环境变量。那么我在哪里写:log4net.Config.XmlConfigurator.Configure() ?
【解决方案2】:

您可以像这样在运行时访问 log4net 配置的附加程序

var repository = (Hierarchy)LogManager.GetRepository();
var appenders = repository.GetAppenders().Where(x => x is FileAppender);

您可以通过名称获取特定的附加程序

var appender = appenders.FirstOfDefault(x => x.Name.Equals("MyAppeader"));

一旦你有了一个 appender,你就可以随心所欲地修改它。你想设置文件路径

appender.File = @"c:\folder\yyyyMMdd_hhmssms_[controller]_[method].json";

您不应该做任何其他事情,因为 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");

【讨论】:

  • 在修改代码中的 appender 时,您应该总是在事后调用 appender.ActivateOptions():有些更改可能不需要,但有些更改需要,所以每次都调用它是个好习惯。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多