Как отследить проблемы log4net

191

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

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

Джон М Гант
источник

Ответы:

294

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

<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 .

Дэвид Эспарт
источник
10
Просто убедитесь, что процесс, под которым выполняется ваше приложение, имеет права на путь, по которому вы хотите создать текстовый файл журнала («C: \ tmp \ log4net.txt» в приведенном выше примере)
NMrt
3
Похоже, что внутренняя отладка не имеет временных меток
snit80
4
Я изменил с C:\tmp\log4net.txtна C:\log4net.txt, то он может генерировать текстовый файл.
Фрэнк Мятт Чт
6
Просто заметка, я нашел забавный способ. Убедитесь, что <configSections></configSections>первая запись под <configuration>. В противном случае вы получите ошибку.
Ник
2
Это не показывает время для записей в файле журнала. Я попытался установить атрибуты traceOutputOptions="TimeStamp"и traceOutputOptions="DateTime"в addтеге, но это ничего не меняет в содержимом файла журнала. Кто-нибудь знает, как настроить log4net, чтобы показать время для каждой строки / записи в файле журнала трассировки?
Улисс Алвес
43

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

<log4net debug="true">

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

Боло
источник
6
После того, как этот флаг включен - вы сможете увидеть журналы диагностики с log4net в окне вывода Visual Studio,
Naren
24

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

log4net.Util.LogLog.InternalDebugging = true;

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

JP Toto
источник
8

Убедитесь, что корневое приложение, в котором находится ваша точка входа, записывает что-то в 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 был настроен правильно.

K0D4
источник
1
спасла и мою :-)
Коста
2

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

StuartN
источник
2

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

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

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

olaf870
источник