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