Почему log4net может не писать логи

Возможные причины, по которым log4net может не писать логи.

log4net не сконфигурирован

Не вызывается метод log4net.Config.XmlConfigurator.Configure или не срабатывает другой, выбранный вами, способ конфигурирования.

Для диагностики необходимо проверить свойство log4net.LogManager.GetRepository().Configured, которое должно вернуть True, если log4net сконфигурирован.

log4net сконфигурирован некорректно

Ошибка в конфигурации log4net. Например, некорректно прописана строка подключения к базе данных, некорректный запрос или параметры запроса, не хватает прав для записи в указанный приемник и пр.

Для диагностики необходимо смотреть лог работы самого log4net. Внутренний лог можно включить с помощью свойства log4net.Util.LogLog.InternalDebugging, установленного в True или с помощью настроек в файле Web.config. Если у вас под рукой есть Web.config, то в нем же настраивается и способ вывода внутреннего лога (в файл, в консоль и пр.). Если же у вас библиотека без конфигурационных файлов, то единственный способ, который я нашел, чтобы получить внутренний лог, это воспользоваться событием log4net.Util.LogLog.LogReceived:

log4net.Util.LogLog.LogReceived += (source, e) =>
{
    using (StreamWriter w = File.AppendText("c:\\test.txt"))
    {
        w.WriteLine(e.LogLog.Message + " " + e.LogLog.Exception?.Message);
    }
};

Не включен нужный логгер

В конфигурации log4net не настроен нужный логгер, а также нет настроек логгера по умолчанию, который пишет данные от всех логгеров.

Логгер по умолчанию может быть определен, например, следующим образом:

<root>
    <level value="ALL" />
    <appender-ref ref="MyAdoNetAppender" />
</root>

Если такой узел есть в конфигурационном XML-ле то все логгеры будут записывать информацию указанного уровня. Если такого узла нет, значит каждый логгер должен быть настроен отдельно, например так:

<logger name="MyLogger">
    <level value="ALL" />
    <appender-ref ref="MyAdoNetAppender" />
</logger>

Если включить внутренний лог, то в нем можно увидеть сообщение о том, что для логгера не настроено ни одного аппендера.

log4net не видит некоторых классов

Если в параметрах аппендера используются пользовательские классы, то они могут быть не видны для log4net.

<parameter>
    <parameterName value="@system_name" />
    <dbType value="String" />
    <size value="50" />
    <layout type="MyOrg.MyPatternLayout">
        <conversionPattern value="%system_name" />
    </layout>
</parameter>

В этом примере в настройках параметра используется пользовательский класс MyOrg.MyPatternLayout.

Если использовать инструмент ILMerge для сливания библиотек, то есть вероятность что log4net не увидит пользовательский класс, особенно, если он определен в отдельной библиотеке (например, у вас есть отдельная библиотека для работы с логами).

Для диагностики проблемы необходимо смотреть внутренний лог log4net. В нем будет сообщение о том что не удается найти библиотеку.

Для решения проблемы, можно положить библиотеку, содержащую пользовательский класс в GAC (там log4net его точно увидит).

About the author

Добавить комментарий

Сказать спасибо

Способ платежа:

Подписаться на обновления

Укажите свой e-mail чтобы получать уведомления о новых статьях.

Присоединиться к еще 3 подписчикам