Добавить переменные в имя файла приложения Rollingfileappender в Log4Net

Есть ли способ сделать имя переменной fileAppender? Т.е. когда я вызываю на своем контроллере действие, которое принимает объект, я хотел бы записать это в файл журнала. Имя файла будет выглядеть примерно так: 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


person Bart Schelkens    schedule 24.02.2016    source источник
comment
stackoverflow.com/ questions / 1535736 /   -  person blogprogramisty.net    schedule 24.02.2016
comment
Это создаст один файл для каждой записи в журнале !!   -  person stuartd    schedule 24.02.2016
comment
@stuartd Я знаю, это то, что хочет заказчик. Это просто для того, чтобы зарегистрировать json, который был отправлен в api.   -  person Bart Schelkens    schedule 25.02.2016


Ответы (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.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");
person Ash Burlaczenko    schedule 24.02.2016
comment
При внесении изменений в дополнения в коде вы всегда должны впоследствии вызывать appender.ActivateOptions(): некоторые изменения могут не потребоваться, но другие требуют, поэтому рекомендуется вызывать его каждый раз. - person stuartd; 24.02.2016

один из способов - установить в коде переменную среды, например:

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

а затем настройте эту переменную среды в log4net XML:

  <appender name="FileAppender" type="log4net.Appender.FileAppender">
    <file value="${APPENDER_FILE}"/>
person bkdev    schedule 24.02.2016
comment
Но это означает, что мне нужно установить эту переменную среды при настройке регистратора. Итак, где я пишу: log4net.Config.XmlConfigurator.Configure ()? - person Bart Schelkens; 24.02.2016