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

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

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

Ответ 1

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

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

Ответ 2

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

<log4net debug="true">

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

Ответ 3

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

log4net.Util.LogLog.InternalDebugging = true;

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

Ответ 4

Убедитесь, что корневое приложение, где ваша точка входа регистрирует что-то в 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 у меня была интересная ситуация. Я создал проект библиотеки и проект test exe, который продемонстрировал бы его возможности. Проект библиотеки был настроен на использование Log4net, как и проект exe. Проект exe использовал атрибут assemblyinfo для регистрации конфигурации, но я не получал никакого вывода журнала на консоль или файл журнала. Когда я включил log4net внутреннее ведение журнала отладки, я получил некоторые внутренние сообщения, записанные на консоль, но все же ни один из моих обычных журналов. Ошибок не сообщалось. Все это начало работать, когда я добавил код выше в мою программу. В противном случае была установлена ​​правильная настройка Log4net.

Ответ 5

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

Ответ 6

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

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

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