Использовать файл конфигурации приложения log4net для данных конфигурации
Я хочу сохранить данные конфигурации log4net в файле application.config. Основываясь на моем понимании документации, я сделал следующее:
-
Добавить ссылку на log4net.dll
-
Добавьте следующую строку в AssemblyInfo.cs:
[assembly: log4net.Config.XmlConfigurator(Watch = true)]
-
Инициализируйте регистратор следующим образом:
private static readonly ILog log = LogManager.GetLogger(typeof(frmWizard));
-
У меня есть следующий код в моем app.config:
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>
<log4net>
<appender name="EventLogAppender" type="log4net.Appender.EventLogAppender" >
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
</layout>
</appender>
<root>
<level value="INFO" />
<appender-ref ref="ConsoleAppender" />
</root>
</log4net>
Однако, когда я запускаю приложение, на консоли появляется следующая ошибка:
Не найдено ни одного приложения с именем [Consoleappender].
Как я могу заставить log4net читать настройки из файла конфигурации?
Спасибо!
Ответы
Ответ 1
Добавьте строку в свой app.config в элементе configSections
<configSections>
<section name="log4net"
type="log4net.Config.Log4NetConfigurationSectionHandler, log4net, Version=1.2.10.0,
Culture=neutral, PublicKeyToken=1b44e1d426115821" />
</configSections>
Затем добавьте раздел log4Net, но делегируйте его в файл конфигурации log4Net в другом месте...
<log4net configSource="Config\Log4Net.config" />
В коде приложения, когда вы создаете журнал, напишите
private static ILog GetLog(string logName)
{
ILog log = LogManager.GetLogger(logName);
return log;
}
Ответ 2
Из конфигурации, указанной в вопросе, настроено только одно приложение, и оно называется "EventLogAppender". Но в config для root автор ссылается на приложение под названием "ConsoleAppender", поэтому сообщение об ошибке.
Ответ 3
Вы пытались добавить обработчик configsection
к вашему app.config? например.
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
Ответ 4
Я полностью поддерживаю ответ @Charles Bretana. Однако, если он не работает, убедитесь, что существует только один элемент <section>
и что configSections
является первым потомком корневого элемента:
configSections
должен быть первым элементом в вашей app.Config
после конфигурации:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=1b44e1d426115821" />
</configSections>
<!-- add log 4 net config !-->
<!-- add others e.g. <startup> !-->
</configuration>
Ответ 5
Все имена подписчиков должны быть отражены в корневом разделе.
В вашем случае имя приложения EventLogAppender, но в разделе <root> <appender-ref ..
оно называется ConsoleAppender. Они должны соответствовать.
Вы можете добавить несколько добавлений в конфигурацию журнала, но вам нужно зарегистрировать их в разделе <root>
.
<appender-ref ref="ConsoleAppender" />
<appender-ref ref="EventLogAppender" />
Вы также можете обратиться к документации apache при настройке log4net.
Ответ 6
Не забудьте установить свойство файла конфигурации "Copy To Output Directory = Copy Always" и ссылаться на файл конфигурации в сборке [assembly: log4net.Config.XmlConfigurator(ConfigFile = "App.config", Watch = true)] - после нескольких дней борьбы это наконец решило мою проблему.