Log4net не будет читать из app.config
У меня есть два проекта, настроенных одинаково для log4net. Один проект регистрируется в порядке; однако другой не регистрируется вообще.
Logger
в проекте, который не регистрирует, возвращает IsFatalEnabled = false
, IsErrorEnabled = false
, IsWarnEnabled = false
, IsInforEnabled = false
и IsDebugEnabled = false
.
Я скопировал и вставил один проект в другой, полностью заменил файл и попытался удалить все пробелы.
Что может привести к тому, что один проект не будет правильно читать правильные уровни из app.config?
app.config:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>
<log4net>
<appender name="FileAppender" type="log4net.Appender.FileAppender">
<file value="logfile.txt" />
<appendToFile value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date: %-5level – %message%newline" />
</layout>
</appender>
<root>
<level value="DEBUG" />
<appender-ref ref="FileAppender" />
</root>
</log4net>
</configuration>
Program.cs
using log4net;
class Program
{
private static readonly ILog Log = LogManager.GetLogger("SO");
static void Main(string[] args)
{
Log.Info("SO starting");
}
}
Ответы
Ответ 1
Кажется, что файл app.config не был настроен для просмотра log4net.
Я добавил следующую строку в AssemblyInfo.cs
, и теперь включено ведение журнала:
[assembly: log4net.Config.XmlConfigurator(Watch = true)]
Странно, так как я не добавлял эту строку в проект, который работал.
EDIT:
Похоже, что у работающего проекта действительно была линия. Я, должно быть, забыл.
// This will cause log4net to look for a configuration file
// called [ThisApp].exe.config in the application base
// directory (i.e. the directory containing [ThisApp].exe)
// The config file will be watched for changes.
[assembly: log4net.Config.XmlConfigurator(Watch = true)]
Ответ 2
Решением для меня было использование XmlConfigurator.Configure()
в коде запуска программы. Однако моя ситуация отличалась тем, что я использовал модуль Autofac.log4net для регистрации ILog
в контейнере Autofac. В этом случае использование XmlConfiguratorAttribute
(с Watch
установленным в true или false) оставило регистратор ненастроенным.