Cara melacak masalah log4net

191

Saya menggunakan log4net sepanjang waktu, tetapi satu hal yang tidak pernah saya ketahui adalah bagaimana cara mengetahui apa yang terjadi di dalam. Sebagai contoh, saya punya aplikasi konsol dan aplikasi database di proyek saya. Saya membuat beberapa perubahan pada database dan kode, dan sekarang appender database tidak berfungsi lagi. Saya akan mencari tahu mengapa pada akhirnya, tetapi itu akan banyak membantu jika saya bisa melihat apa yang terjadi di dalam log4net.

Apakah log4net menghasilkan segala jenis output yang dapat saya lihat untuk mencoba menentukan sumber masalah saya?

John M Gant
sumber

Jawaban:

293

Pertama, Anda harus menetapkan nilai ini pada file konfigurasi aplikasi:

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

Kemudian, untuk menentukan file tempat Anda ingin menyimpan output, Anda dapat menambahkan kode berikut dalam file .config yang sama:

<configuration>
...

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

...
</configuration>

Anda dapat menemukan penjelasan yang lebih rinci di bawah 'Bagaimana cara mengaktifkan debugging internal log4net?' di halaman FAQ log4net .

David Espart
sumber
10
Pastikan saja bahwa proses aplikasi Anda berjalan di bawah memiliki hak untuk jalur di mana Anda ingin membuat file teks logging Anda ("C: \ tmp \ log4net.txt" dalam contoh di atas)
NMrt
3
Sepertinya debugging internal tidak memiliki cap waktu
snit80
4
Saya berubah dari C:\tmp\log4net.txtmenjadi C:\log4net.txt, maka dapat menghasilkan file teks.
Frank Myat Thu
6
Hanya sebuah catatan saya menemukan cara yang menyenangkan. Pastikan <configSections></configSections>entri pertama di bawah <configuration>. Kalau tidak, Anda berakhir dengan kesalahan.
Nick
2
Ini tidak menunjukkan waktu untuk entri dalam file log. Saya sudah mencoba atribut pengaturan traceOutputOptions="TimeStamp"dan traceOutputOptions="DateTime"di addtag tapi perubahan apa-apa dalam isi file log. Apakah ada yang tahu cara mengatur log4net untuk menunjukkan waktu untuk setiap baris / entri dalam file log jejak?
Ulysses Alves
43

Jika Anda menggunakan file konfigurasi log4net, Anda juga dapat mengaktifkan debugging di sana dengan mengubah simpul atas ke:

<log4net debug="true">

Ini akan berfungsi setelah konfigurasi dimuat ulang dan dengan asumsi pendengar jejak Anda sudah diatur dengan benar.

Bolo
sumber
6
Setelah flag ini diaktifkan - Anda akan dapat melihat log diagnostik dari log4net di dalam jendela Output Visual Studio
Naren
24

Selain jawaban di atas, Anda dapat menggunakan baris ini untuk melihat log in realtime alih-alih output c: \ tmp \ log4net.txt.

log4net.Util.LogLog.InternalDebugging = true;

Misalnya, di aplikasi konsol, Anda dapat menambahkan ini dan kemudian menonton hasilnya secara realtime. Ini baik untuk debugging log4net di test harness kecil untuk melihat apa yang terjadi dengan appender yang Anda uji.

JP Toto
sumber
8

Pastikan aplikasi root di mana titik masuk Anda mencatat sesuatu ke log4net. Berikan salah satu dari ini:

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());

Dengan 2.0.8, saya memiliki situasi yang menarik. Saya membuat proyek perpustakaan dan proyek ujian yang akan menunjukkan kemampuannya. Proyek perpustakaan diatur untuk menggunakan Log4net seperti proyek exe. Proyek exe menggunakan atribut assemblyinfo untuk mendaftarkan konfigurasi, namun saya tidak mendapatkan keluaran logging ke konsol atau file log. Ketika saya menyalakan logging debug internal log4net, saya mendapat beberapa pesan internal yang ditulis ke konsol, tetapi masih tidak ada log normal saya. Tidak ada kesalahan yang dilaporkan. Semuanya mulai berfungsi ketika saya menambahkan kode di atas ke program saya. Log4net jika tidak diatur dengan benar.

K0D4
sumber
1
menyelamatkan saya juga :-)
costa
2

Jika log internal tidak memberi Anda informasi yang cukup, sangat mudah untuk membangun dan men-debug kode sumber . Jika Anda tidak ingin mencampur ini dengan proyek pengembangan Anda, tambahkan aplikasi konsol sederhana yang hanya mencatat pesan, salin proyek Anda log4net.configke aplikasi ini, dan debug kelas yang dimaksud.

StuartN
sumber
2

Dalam log4net 2.0.8 tampaknya tidak mungkin untuk membuat logging dengan log4net di DLL terpisah. Jika saya mencoba ini, hasilnya sangat aneh: Tidak ada logging yang dilakukan lagi. Dan inisialisasi log4net dengan opsi debug tidak menunjukkan kesalahan.

Seperti kata K0D4, Anda harus memiliki referensi ke log4net di modul utama Anda dan harus memanggilnya sekali pada awal Programm dan semuanya baik-baik saja.

Di versi log4net berikutnya, bug ini mungkin akan diperbaiki.

olaf870
sumber