Как отследить проблемы log4net - PullRequest
175 голосов
/ 16 апреля 2009

Я все время пользуюсь log4net, но одна вещь, о которой я никогда не догадывался, это как узнать, что происходит внутри. Например, в моем проекте есть консольный приложение и приложение базы данных. Я сделал несколько изменений в базе данных и коде, и теперь приложение базы данных больше не работает. В конце концов, я пойму, почему, но это очень помогло бы, если бы я мог видеть, что происходит внутри log4net.

Генерирует ли log4net какой-либо вывод, который я могу просмотреть, чтобы попытаться определить источник моей проблемы?

Ответы [ 6 ]

269 голосов
/ 16 апреля 2009

Сначала вы должны установить это значение в файле конфигурации приложения:

<configuration>
   <appSettings>
      <add key="log4net.Internal.Debug" value="true"/>
   </appSettings>
</configuration>

Затем, чтобы определить файл, в котором вы хотите сохранить вывод, вы можете добавить следующий код в тот же файл .config:

<configuration>
...

<system.diagnostics>
    <trace autoflush="true">
        <listeners>
            <add 
                name="textWriterTraceListener" 
                type="System.Diagnostics.TextWriterTraceListener" 
                initializeData="C:\tmp\log4net.txt" />
        </listeners>
    </trace>
</system.diagnostics>

...
</configuration>

Более подробное объяснение вы можете найти в «Как включить внутреннюю отладку log4net?» на странице log4net FAQ .

33 голосов
/ 04 марта 2016

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

<log4net debug="true">

Это будет работать после перезагрузки конфигурации и при условии, что ваш слушатель трассировки настроен правильно.

20 голосов
/ 08 февраля 2016

В дополнение к ответу, приведенному выше, вы можете использовать эту строку для просмотра журнала в реальном времени вместо вывода c: \ tmp \ log4net.txt.

log4net.Util.LogLog.InternalDebugging = true;

Например, в консольном приложении вы можете добавить это, а затем просматривать результаты в реальном времени. Это хорошо для отладки log4net в небольшом тестовом жгуте, чтобы увидеть, что происходит с тестируемым аппендером.

3 голосов
/ 08 декабря 2017

Убедитесь, что корневое приложение, в котором находится ваша точка входа, записывает что-то в log4net. Дайте ему одно из них:

private static ILog logger = LogManager.GetLogger(typeof(Program));
static void Main(string[] args)
{
    logger.InfoFormat("{0} v.{1} started.", Assembly.GetExecutingAssembly().GetName().Name, Assembly.GetExecutingAssembly().GetName().Version.ToString());

С 2.0.8 у меня сложилась интересная ситуация. Я создал проект библиотеки и тестовый exe-проект, который продемонстрировал бы его возможности. Проект библиотеки был настроен на использование Log4net, как и проект exe. Проект exe использовал атрибут assemblyinfo, чтобы зарегистрировать конфигурацию, но я не получал вывод журнала ни на консоль, ни на файл журнала. Когда я включил ведение журнала внутренней отладки log4net, я получил несколько внутренних сообщений, записанных на консоль, но по-прежнему ни один из моих обычных журналов. Об ошибках не сообщалось. Все начало работать, когда я добавил вышеуказанный код в свою программу. В противном случае Log4net был настроен правильно.

0 голосов
/ 30 ноября 2018

В log4net 2.0.8 представляется невозможным вести запись с log4net в отдельную dll. Если я попробовал это, результаты были бы очень странными: регистрация не выполнялась. И инициализация log4net с параметром отладки не показывает ошибок.

Как сказал K0D4, у вас должна быть ссылка на log4net в вашем основном модуле, и он должен вызываться один раз при запуске программы, и все в порядке.

В следующей версии log4net эта ошибка, вероятно, будет исправлена.

0 голосов
/ 26 октября 2017

Если во внутреннем журнале недостаточно информации, очень просто создать и отладить исходный код . Если вы не хотите смешивать это с вашим проектом разработки, добавьте простое консольное приложение, которое просто регистрирует сообщение, скопируйте log4net.config вашего проекта в это приложение и отладьте соответствующий класс.

...