Лучший способ динамически установить путь к файлу приложения - PullRequest
36 голосов
/ 21 февраля 2009

Я пытаюсь найти кого-то умнее меня, чтобы проверить синтаксис, который я написал. Идея состоит в том, чтобы настроить имя файла моего 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?

Очень ценится!

Ответы [ 4 ]

91 голосов
/ 21 февраля 2009

Вы делаете это трудным путем! Определите вашу конфигурацию 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» для простого примера, но вы можете иметь один для каждого приложения, если хотите, если ваш код знает, каково правильное имя свойства и какое должно быть правильное значение.

9 голосов
/ 23 марта 2016

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

var appender = (log4net.Appender.FileAppender)LogManager.GetRepository().GetAppenders()[0];
appender.File = "C:\whatever.log";
appender.ActivateOptions();
9 голосов
/ 03 июля 2015

В 2015 году мы делаем это так:

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

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

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

2 голосов
/ 27 декабря 2018

у меня с датой сработало <file type="log4net.Util.PatternString" value="./Log/logQueueService%date{yyyy_MM_dd}.log" />

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...