Подтвердить что ты не робот

Лучший способ динамически установить путь к файлу appender

Я пытаюсь найти кого-то умнее меня, чтобы проверить некоторый синтаксис, который я написал. Идея состоит в том, чтобы настроить имя файла моего RollingFileAppender на имя сборки, чтобы сделать его более пригодным для повторного использования для моих проектов.

Я видел эту предыдущую статью SO, но не смог ответить на мой вопрос...

У меня было время от времени, пытаясь понять внутренние компоненты Log4net, и это то, что я придумал (находясь в файле Global.asax - Application_Start):

// Bind to the root hierarchy of log4net
log4net.Repository.Hierarchy.Hierarchy root = 
  log4net.LogManager.GetRepository() 
    as log4net.Repository.Hierarchy.Hierarchy;

if (root != null)
{
  // Bind to the RollingFileAppender
  log4net.Appender.RollingFileAppender rfa = 
    (log4net.Appender.RollingFileAppender)root.Root.GetAppender("RollingLogFileAppender");

  if (rfa != null)
  {
    // Set the file name based on the assembly name
    string filePath = 
      string.Format("~/App_Data/{0}.log", GetType().Assembly.GetName().Name);

    // Assign the value to the appender
    rfa.File = Server.MapPath(filePath);

    // Apply changes to the appender
    rfa.ActivateOptions();
  }
}

Может ли кто-нибудь сказать мне, "это отвратительно", или "это должно работать нормально"? Кроме того, если я настрою файл динамически, могу ли я ожидать, что поведение log4net будет вращать файлы на основе параметров файла log4net.config?

Очень ценно!

4b9b3361

Ответ 1

Вы делаете это с трудом! Определите конфигурацию log4net как XML в файле конфигурации приложения и используйте %property{} для удобства:

<appender name="YourAppender" type="log4net.Appender.RollingFileAppender">
  <file type="log4net.Util.PatternString" value="~/App_Data/%property{LogName}" />
  ....
</appender>

Это динамически - вам просто нужно установить свойство log4net "LogName" до, которое вы инициализируете log4net. Таким образом, в вашем коде в любое время перед настройкой log4net задайте нужное значение этого свойства:

string LogName = GetType().Assembly.GetName().Name + ".log";
log4net.GlobalContext.Properties["LogName"] = LogName;

Конечно, вы можете использовать любое имя свойства. Я выбрал "LogName" для простого примера, но вы можете иметь один для каждого приложения, если хотите, до тех пор, пока ваш код знает, что такое правильное имя свойства и каково должно быть правильное значение.

Ответ 2

В 2015 году мы делаем это следующим образом:

<file type="log4net.Util.PatternString">
  <conversionPattern value="%appdomain.log" />
</file>

Никакой другой код не требуется.

Домен приложения - это имя исполняемого файла сборки.

Ответ 3

Вот способ установки или изменения файла журнала первого приложения во время выполнения:

var appender = (log4net.Appender.FileAppender)LogManager.GetRepository().GetAppenders()[0];
appender.File = "C:\whatever.log";
appender.ActivateOptions();

Ответ 4

Я делал то же самое с использованием свойства% {}, но файл создается как "(nul).log". Ниже приведен код:

log4net.GlobalContext.Properties["service"] = _servicename.ToString();
_flatFileLogger = LogManager.GetLogger("FlatFileLogger");
_flatFileLogger.Debug(logData.ToString());

Я заявил в файле XML как

<file type="log4net.Util.PatternString" value="C:\MY_Log\%property{Service}.log" />