Як виявити проблеми 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 в невеликому тестовому ремені, щоб побачити, що відбувається з тестувальним додатком.


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 у мене була цікава ситуація. Я створив бібліотечний проект та тестовий проект, що демонструє його можливості. Проект бібліотеки був створений для використання Log4net, як і проект exe. Проект exe використовував атрибут Assemblyinfo для реєстрації конфігурації, але я не отримував вихід з журналу ні на консоль, ні на файл журналу. Коли я ввімкнув внутрішній журнал налагодження log4net, я отримав кілька внутрішніх повідомлень, записаних на консоль, але все ще жоден з моїх нормальних журналів. Про помилки не повідомлялося. Все почало працювати, коли я додав вищевказаний код до своєї програми. Інакше Log4net був налаштований правильно.


1
врятував і мою :-)
коста

2

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


2

У log4net 2.0.8, здається, неможливо зробити журнал із log4net в окремій DLL. Якщо я спробував це, результати дуже дивні: жоден журнал не проводиться. І ініціалізація log4net з параметром налагодження не показує помилок.

Як сказав K0D4, ви повинні мати посилання на log4net у своєму основному модулі, і якщо він повинен викликати один раз на початку програми, і все добре.

У наступній версії log4net ця помилка, ймовірно, буде виправлена.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.