Как использовать свойство GlobalContext в имени приложения log4net?
Я пытаюсь настроить путь к файлу log4net для использования свойства, которое я установил в словаре log4net.GlobalContext.Properties
.
log4net.GlobalContext.Properties["LogPathModifier"] = "SomeValue";
Я вижу, что это значение задано правильно при отладке через него. а затем в моей конфигурации
<file type="log4net.Util.PatternString"
value="Logs\%appdomain_%property{LogPathModifier}.log" />
Однако вывод этого дает мне "_ (null).log" в конце пути. Что дает?
Ответы
Ответ 1
Я столкнулся с тем же поведением и решил его, установив глобальную переменную перед вызовом 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");
}
Надеюсь, что это поможет...
Ответ 2
Добавить тип = log4net.Util.PatternString
в элемент File
Ответ 3
Проблема (я думаю) заключается в том, что вы GET (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
Ответ 4
Был ли инициализирован логгер с помощью глобального или основного метода в приложении? Возможно, что GlobalContext еще не инициализирован.