Ответ 1
Есть два существующих вопроса, которые предлагают решение для динамического изменения конфигурации log4net:
- Динамически перенастроить Log4Net
- Как я могу изменить расположение файла программно? (см. ответ JackAce).
У меня есть сторонний файл конфигурации, который выглядит так:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
<!--Others sections-->
</configSections>
<log4net>
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
<file value=".\logs\logclient.txt" />
<appendToFile value="false" />
<rollingStyle value="Date" />
<maximumFileSize value="1000KB" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%ndc] - %message%newline" />
</layout>
</appender>
<root>
<level value="DEBUG" />
<appender-ref ref="RollingFileAppender" />
</root>
</log4net>
</configuration>
Код в третьей стороне выглядит так:
LogManager.GetRepository(Assembly.GetCallingAssembly()), configFile);
LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
Я хотел бы, чтобы сторонняя dll использовала мой собственный appender, определенный в моем собственном файле конфигурации. Как я могу это сделать?
Примечание:
Есть два существующих вопроса, которые предлагают решение для динамического изменения конфигурации log4net:
Насколько я понимаю, вы должны использовать файл конфигурации третьей стороны, и вы можете его изменить.
Свойство/атрибут configSource должно работать для перенаправления раздела конфигурации log4net файла конфигурации вашей сторонней организации.
В файле конфигурации третьей стороны:
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
</configSections>
<log4net configSource="pathtoyourlog4net.config" />
Если ваше приложение .NET ссылается на файл thirdparty.dll, во время выполнения приложение полностью игнорирует файл thirdparty.dll.config. Кроме того, файл thirdparty.dll не будет загружать настройки в файле thirdparty.dll.config, так как ожидается, что они будут загружены exe.
Что вам нужно сделать, это объединить (или реплицировать) содержимое файла thirdparty.dll.config в свой собственный app.config. Как ваше приложение, так и файл thirdparty.dll смогут загружать настройки в файл app.exe.config, и вам нужно поддерживать только один файл .config.
Кроме того, вы можете добавить дополнительные приложения в раздел log4net, и это будет срабатывание как вашего приложения, так и файла thirdparty.dll
Библиотека log4net - это инструмент, помогающий выводам операторов журнала вывода к различным целевым показателям.
Вы также можете настроить log4net
в коде вместо использования файла конфигурации, this Сообщение SO четко объясняет вопрос.
Динамически изменить приложение:
public static void ChangeFilePath(string appenderName, string newFilename)
{
log4net.Repository.ILoggerRepository repository = log4net.LogManager.GetRepository();
foreach (log4net.Appender.IAppender appender in repository.GetAppenders())
{
if (appender.Name.CompareTo(appenderName) == 0 && appender is log4net.Appender.FileAppender)
{
log4net.Appender.FileAppender fileAppender = (log4net.Appender.FileAppender)appender;
fileAppender.File = System.IO.Path.Combine(fileAppender.File, newFilename);
fileAppender.ActivateOptions();
}
}
}