Kami menggunakan log4net dan ingin menentukan konfigurasinya di file konfigurasi eksternal (seperti yang telah kami lakukan dengan bagian lain). Untuk melakukan ini, kami telah mengubah bagian log4net di App.config menjadi:
...
<section name="log4net"
type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
...
<log4net configSource="Log.config" />
...
Dan di file Log.Config (direktori yang sama dengan App.config) kami memiliki:
<log4net>
<appender name="General" type="log4net.Appender.FileAppender">
<file value="myapp.log" />
<layout type="log4net.Layout.SimpleLayout" />
</appender>
<root>
<appender-ref ref="General" />
</root>
</log4net>
Namun, saat kami menjalankan aplikasi, tidak ada file log yang dibuat (dan tidak ada logging yang dilakukan). Tidak ada keluaran pesan kesalahan ke konsol.
Jika kita memindahkan konten file Log.config kembali ke App.config (mengganti baris kode pertama di atas), ini berfungsi seperti yang diharapkan. Tahu mengapa itu tidak berfungsi di file eksternal?
Jawaban:
Apakah Anda memiliki atribut berikut di
AssemblyInfo.cs
file Anda :dan kode seperti ini di awal setiap kelas yang memerlukan fungsionalitas logging:
Saya memiliki entri blog yang berisi ini dan info lainnya di sini .
sumber
Ada cacat terbuka pada masalah ini. Log4Net tidak mendukung atribut configSource elemen konfigurasi. Untuk menggunakan solusi file konfigurasi murni, Anda menggunakan kunci log4net.Config di appSettings.
Langkah 1: Sertakan definisi bagian konfigurasi normal:
Langkah 2: Gunakan kunci log4net.Config ajaib di appSettings.
Langkah 3: Kontribusikan tambalan untuk memperbaiki penanganan configSource.
sumber
Langkah yang terlewat adalah
ini akan menyebabkan configSource digunakan. Pastikan Anda memanggilnya sekali sebelum memanggil GetLogger ();
sumber
Pastikan file log4net.config Anda disetel dengan properti berikut:
Build Action: Konten
Salin ke direktori keluaran: Salin Selalu
sumber
Baik digunakan,
atau hanya,
Dalam kedua kasus, file, Log4Net.config, harus ada di direktori keluaran. Anda dapat melakukan ini dengan mengatur properti file Log4Net.config di explorer solusi. Build Action - Konten dan Salin ke Direktori Output - Salin selalu
sumber
Waspadai masalah ini ...
Dalam kasus saya semuanya telah dikonfigurasi dengan benar. Masalahnya adalah saya menggunakan Penyebaran Web di dalam Visual Studio 2013 untuk mengunggah situs ke WinHost.com dan mereset ACL di server. Ini pada gilirannya mencabut semua izin pada folder dan file - log4net tidak dapat menulis file.
Anda dapat membaca lebih lanjut di sini:
Bagaimana cara menghentikan Penyebaran Web / MSBuild dari mengacaukan izin server
Saya meminta tim dukungan di sana untuk mengatur ulang ACL dan kemudian log4net mulai mengeluarkan log. :)
sumber
Dengan asumsi Anda memiliki file konfigurasi eksternal bernama log4net.config yang disalin ke direktori penerapan Anda, Anda dapat mengkonfigurasinya seperti ini:
using System; using System.Collections.Generic; using System.Windows.Forms; using System.Reflection; using log4net; namespace MyAppNamespace { static class Program { //declare it as static and public so all classes in the project can access it //like so: Program.log.Error("got an error"); public static readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(Program)); /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main() { //configure it to use external file log4net.Config.XmlConfigurator.Configure(new Uri(Application.StartupPath + "\\log4net.config")); //use it log.Debug("############# STARING APPLICATION #################"); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new FormMain()); } } }
sumber
Saya memiliki masalah yang sama, selain memiliki
dalam proyek yang sedang berjalan, saya juga memiliki baris berikut dalam proyek referensi:
Ketika saya menghapus baris ini di proyek yang direferensikan, log mulai muncul.
sumber
Dimungkinkan juga untuk mengaktifkan mode Debug untuk
log4net
. Masukkan ini ke dalam file App.config:dan Anda setidaknya akan mendapatkan pesan kesalahan, yang darinya Anda dapat mengetahui apa yang sebenarnya salah. Dalam kasus saya, saya hanya lupa menyetel
Copy to output directory
keCopy Always
.sumber
@ Mitch, Ternyata ada file dengan deklarasi [assembly: ...], tetapi tidak memiliki properti ConfigFile.
Setelah saya menambahkannya dan mengarahkannya ke Log.config, itu mulai berfungsi. Saya akan berpikir bahwa ini akan berfungsi seperti semua bagian konfigurasi lainnya (yaitu AppSettings) dan menerima file konfigurasi eksternal tanpa modifikasi.
Kami tidak memiliki pernyataan kedua yang Anda sebutkan, karena kami membungkusnya dalam penyedia log statis global.
sumber
Dalam kasus saya, saya mendapat pesan kesalahan ini:
Dan
log4net.config
file itu ada di proyek Visual Studio 2017, tetapi ketika saya memeriksa file dibin\Debug
folder saya tidak dapat menemukannya.Pengaturan perakitan asli saya seperti ini:
Setelah beberapa waktu penelitian, saya mengubahnya menjadi yang berikut dan berhasil:
sumber
[perakitan: log4net.Config.XmlConfigurator (ConfigFile = "Log4Net.config")]
ubah Copy to Output Dirctory menjadi Copy jika lebih baru
sumber
Perlu juga ditunjukkan bahwa di aplikasi web, ini terlihat di direktori root, bukan folder bin, jadi pastikan di situlah Anda meletakkan file konfigurasi.
sumber