Лучший способ динамически установить путь к файлу 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?
Очень ценно!
Ответы
Ответ 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" />