Как использовать свойство GlobalContext в имени приложения log4net? - PullRequest
40 голосов
/ 18 февраля 2009

Я пытаюсь настроить путь к файлу log4net для использования свойства, заданного в словаре log4net.GlobalContext.Properties.

log4net.GlobalContext.Properties["LogPathModifier"] = "SomeValue";

Я вижу, что это значение установлено правильно при отладке через него. а потом в моей конфигурации

<file type="log4net.Util.PatternString" 
      value="Logs\%appdomain_%property{LogPathModifier}.log" />

Однако, вывод этого дает мне "_ (null) .log" в конце пути. Что дает?

Ответы [ 4 ]

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

Я столкнулся с тем же поведением и решил его, установив глобальную переменную перед вызовом XmlConfigurator ... Вот что я успешно использую:

Подробности log4net.config:

<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender,log4net">
  <File type="log4net.Util.PatternString" value="App_Data/%property{LogName}" />
  ...
</appender>

Global.asax подробности:

private static readonly log4net.ILog log = log4net.LogManager.GetLogger("Global.asax");
void Application_Start(object sender, EventArgs e) 
{
    // Set logfile name and application name variables
    log4net.GlobalContext.Properties["LogName"] = GetType().Assembly.GetName().Name + ".log";
    log4net.GlobalContext.Properties["ApplicationName"] = GetType().Assembly.GetName().Name;

    // Load log4net configuration
    System.IO.FileInfo logfile = new System.IO.FileInfo(Server.MapPath("log4net.config"));
    log4net.Config.XmlConfigurator.ConfigureAndWatch(logfile);

    // Record application startup
    log.Debug("Application startup");
}

Надеюсь, это поможет ...

16 голосов
/ 02 июня 2009

Добавить тип = log4net.Util.PatternString в элемент File

4 голосов
/ 04 июня 2009

Проблема (я думаю) в том, что вы ПОЛУЧАЕТЕ (GetLogger) регистратор, прежде чем задать имя и загрузить конфигурацию ...

Попробуйте сделать объявление логгера как: private static log4net.ILog _pLog а затем в Application_Start выполните:

void Application_Start(object sender, EventArgs e) 
{
    // Set logfile name and application name variables
    log4net.GlobalContext.Properties["LogName"] = GetType().Assembly.GetName().Name + ".log";
    log4net.GlobalContext.Properties["ApplicationName"] = GetType().Assembly.GetName().Name;

    // Load log4net configuration
    System.IO.FileInfo logfile = new System.IO.FileInfo(Server.MapPath("log4net.config"));
    log4net.Config.XmlConfigurator.ConfigureAndWatch(logfile);

    //Get the loger
    _pLog = log4net.LogManager.GetLogger("Global.asax");

    // Record application startup
    pLog .Debug("Application startup");
}

Итак, последовательность:

// Set logfile name and application name variables
// Load log4net configuration
// get the logger
// Record application startup
1 голос
/ 18 февраля 2009

Был ли регистратор инициализирован с помощью глобального или основного метода в приложении? Возможно, что GlobalContext еще не инициализирован.

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