log4net tidak berfungsi


123

Hai, saya memiliki konfigurasi ini di web.config saya

<log4net>
    <appender name="LogFileAppender" type="log4net.Appender.FileAppender">
        <param name="File" value="mylog.log" />
        <param name="AppendToFile" value="true" />
        <layout type="log4net.Layout.PatternLayout">
            <param name="Header" value="" />
            <param name="Footer" value="" />
            <param name="ConversionPattern" value="%d [%t] %-5p %m%n" />
        </layout>
    </appender>
    <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" >
        <layout type="log4net.Layout.PatternLayout">
            <param name="Header" value="[Header]\r\n" />
            <param name="Footer" value="[Footer]\r\n" />
            <param name="ConversionPattern" value="%d [%t] %-5p %m%n" />
        </layout>
    </appender>
    <root>
        <level value="DEBUG" />
        <appender-ref ref="LogFileAppender" />
        <appender-ref ref="ConsoleAppender" />
    </root>
</log4net>

tetapi log4net tidak berfungsi. Proyek saya terkompilasi dengan baik, dan saya juga tidak mendapatkan kesalahan debugging. Garis-garis yang saya log.debug("somemessage")perintahkan untuk berjalan dengan baik, tetapi saya tidak dapat menemukan mylog.logfile tersebut, jadi di mana itu?


Pastikan untuk memeriksa ini juga: stackoverflow.com/a/24617269/114029
Leniel Maccaferri

Jawaban:


298

Satu gotcha untuk jenis hal ini adalah memastikan untuk menambahkan XmlConfiguratoratribut ke assembly dengan menempatkan baris berikut di Anda AssemblyInfo.cs:

[assembly: log4net.Config.XmlConfigurator]

Jika tidak, log4net tidak pernah aktif.


5
Metode ini digunakan untuk bekerja di proyek saya, tetapi entah bagaimana berhenti bekerja. Saya harus menggunakan metode ini stackoverflow.com/a/1479343/193634 untuk membuatnya berfungsi kembali.
Rosdi Kasim

Saya baru saja mencobanya lagi dan berfungsi dengan baik. Kemungkinan besar Anda tidak mereferensikan / memuat rakitan yang berisi AssemblyInfosecepat yang Anda pikirkan.
Kirk Woll

Bagi mereka yang menggunakan appender ELMAH ini adalah cara untuk pergi. Saya memiliki 'log4net.Config.XmlConfigurator.Configure ();' di global.asax.cs dan berfungsi dengan baik untuk penambah file tetapi tidak untuk penambah ELMAH.
pengguna3885927

Saya telah memeriksa jawaban ini dan menemukan bahwa saya perlu menyesuaikannya dengan `[assembly: log4net.Config.XmlConfigurator (Watch = true)]`
David Savage

49

Saya kira baik log4net tidak melakukan logging sama sekali, atau file tersebut tidak berakhir di tempat yang Anda harapkan.

Pertama, apakah Anda benar-benar menelepon

XmlConfigurator.Configure()

di mana saja di kode Anda? Jika potongan xml di atas ada dalam file konfigurasi aplikasi, panggilan ini akan melakukan triknya. Jika cuplikan xml ada di dalam filenya sendiri, Anda harus menggunakan .Configure(string)kelebihan beban yang mengambil jalur ke file tersebut. Tanpa panggilan ini (atau tampaknya atribut tingkat perakitan yang disebutkan oleh Kirk Woll), maka log4net tidak akan masuk sama sekali.

Jika Anda yakin ini semua sudah selesai, dan log4net seharusnya melakukan logging, mungkin Anda harus memasukkan jalur yang memenuhi syarat untuk file log saat Anda melakukan debug lebih lanjut. Itu akan membuat Anda yakin di mana file itu seharusnya .


33

Ada gotcha kecil lainnya, lihat di sini: http://logging.apache.org/log4net/release/manual/configuration.html#dot-config

yang [assembly: log4net.Config.XmlConfigurator]metode tidak bekerja dengan app.config. Jika Anda mengkonfigurasi log4net dari app.config, Anda harus menggunakan log4net.Config.XmlConfigurator.Configure()metode ini.


Sekadar catatan, kedua metode berfungsi untuk saya dalam aplikasi konsol.
rageit

Saya mengkonfirmasi solusi di atas - Saya harus menjalankan log4net.Config.XmlConfigurator.Configure (); dalam kode saya (yang menggunakan app.config agar log4net berfungsi secara efektif. Baris yang dicetak secara efektif adalah yang mengikuti eksekusi metode Configure ().
luisa rosi

19

Berikut adalah daftar periksa saya tentang kapan log4net terbukti bandel:

  • pastikan bahwa file log4net.config disalin ke folder bin \ saat membangun (setel ke 'Salin jika lebih baru' di kompiler)
    • ketika berurusan dengan kode yang diinstal, pastikan bahwa log4net.config disertakan untuk perjalanan (setel ke 'Konten' di kompiler)
  • memastikan bahwa pengguna yang menjalankan proses memiliki hak tulis ke folder tempat log akan ditulis
  • jika ragu, berikan izin promiscuous ke c: \ temp \ dan dapatkan semuanya untuk masuk ke sana ()
  • jalankan Sysinternal / Dbgview.exe untuk melihat apakah itu memberi tahu Anda sesuatu

3
"pastikan bahwa file log4net.config disalin ke folder bin \ saat membangun (setel ke 'Salin jika lebih baru' di kompiler)" -> simpan hari saya! Terima kasih banyak!
Hoang Nguyen Huu

8

Untuk penambahan proyek ASP.NET MVC

log4net.Config.XmlConfigurator.Configure();

ke Global.asax.cs juga membantu:

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        WebApiConfig.Register(GlobalConfiguration.Configuration);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        AuthConfig.RegisterAuth();

        log4net.Config.XmlConfigurator.Configure();
    }
}

1
Memiliki masalah yang sangat aneh dengan ini, dalam produksi dan di komputer bos saya, penebang bekerja dengan baik seperti ini, tetapi tidak sampai jawaban I Kirk berhasil di komputer saya. Hanya berpikir saya akan memberi tahu orang-orang jika mereka memiliki masalah serupa (proyek MVC btw).
Shelby115

@ Shelby115, banyak terima kasih! Saya mencoba untuk meletakkan entri log4Net saya di ELMAH. Saya memiliki segalanya dengan benar di web.config. Saya sudah memiliki 'log4net.Config.XmlConfigurator.Configure ();' di global.asax.cs saya, tetapi tidak berfungsi. Datang ke posting SO ini dan menambahkan baris ke assemblyInfo.cs berdasarkan Kirk's. Itu masih tidak berhasil !. Setelah membaca komentar Anda, saya menghapus entri sebelumnya dari global.asax.cs dan itu mulai berfungsi. Saya menghabiskan beberapa jam untuk ini dan komentar Anda sangat membantu. Terima kasih lagi!
pengguna3885927

Entri di global.asax.cs berfungsi dengan baik untuk penambah file tetapi tidak untuk penambah ELMAH. Cara Kirk bekerja untuk penambah ELMAH (saya secara khusus harus menghapusnya dari global.asax.cs)
pengguna3885927

Anda mungkin juga ingin memastikan bahwa log4net memiliki izin menulis ke direktori yang dikonfigurasi untuk file log.
Oladipo Olasemo

@ Shelby115 Sial, pasti senang bila Anda lupa solusinya dan komentar Anda sendiri yang menyelesaikan masalah Anda. Membuka halaman dengan jawaban yang sudah Anda beri suara positif juga merupakan indikator yang baik.
Shelby115

7

Ini adalah langkah-langkah yang pada akhirnya membuat pencatatan file saya berfungsi:

  • -Periksa AssemblyInfo.cs berisi atribut berikut. [perakitan: log4net.Config.XmlConfigurator] . Ini memuat log4net.
  • Periksa direktori log memiliki izin menulis.
  • Periksa logger memiliki format yang ditentukan. Ini dilakukan dengan memeriksa setiap elemen dalam konfigurasi Anda yang memiliki elemen tata letak yang ditentukan. Misalnya:

<appender name="MainLogger"... <layout type="log4net.Layout.SimpleLayout"/>

  • Terakhir, coba aktifkan logging internal log4net untuk mengaktifkan logging konsol dan memeriksa konsol. Untuk melakukan ini, tambahkan <add key="log4net.Internal.Debug" value="true"/>ke appSettings.

<add key = "log4net.Internal.Debug" value = "true" /> Ini membantu saya memecahkan masalah. Terima kasih
Ravi Khambhati

Izin direktori inilah yang membuat saya
Omar Himada

6

Saya memiliki pengalaman di mana sistem logging gagal secara diam-diam tanpa memunculkan pengecualian. Saya kira ini masuk akal karena jika logger melakukan kesalahan pencatatan lalu bagaimana ia dapat mencatat kesalahan yang tidak dapat melakukan pencatatan?

Jadi jika file tidak dibuat pada disk, mulailah dengan melihat izin sistem file untuk memastikan pengguna yang menjalankan aplikasi Anda dapat menulis file baru ke lokasi disk tersebut.

Untuk tujuan pengujian, Anda mungkin ingin secara manual membuat file pada disk yang harus ditulis dan membuka izin bagi semua orang untuk menulis padanya. Jika logger mulai menulis padanya maka Anda tahu itu berbasis izin daripada berbasis konfigurasi.


2

Di sisi saya, saya lupa menandai file konfigurasi untuk disalin saat aplikasi sedang dikompilasi.

Salin file konfigurasi ke direktori keluaran

Cukup klik kanan file log4net.config, pilih properti lalu pilih Salin ke Direktori Output untuk disalin XXXX


1

Saya mencoba semua cara di atas tetapi tidak ada yang berhasil. Menambahkan baris ini di bagian app.config configSections berhasil untuk saya.

<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net, Version=1.2.15.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a" />

Pastikan itu Versiondan PublicKeyTokenbenar


0
<param name="File" value="mylog.log" />

mengatakan "tulis mylog.log ke folder sebenarnya". Artinya jika aplikasi web Anda berada di bawah IIS, maka log akan ditulis ke C: \ inetpub \ wwwroot \ appname \ mylog.log.

Jika file log tidak ada, maka mungkin akun yang menjalankan aplikasi tidak memiliki izin menulis di folder. Anda dapat menjalankan Monitor Proses dari SysInternals untuk melihat apakah dan di mana file ditulis.

Juga jalankan VS dalam mode debug, untuk melihat apakah ada pengecualian yang dilemparkan (Debug-> Pengecualian-> Pengecualian CLR, centang Dilempar).


0

Dalam kasus saya, saya lupa untuk mengatur properti file log4Net.config sebagai "Konten" sehingga file tersebut tidak disertakan dalam penerapan. Jadi perhatikan itu:

Compile action : Content

0

Sayangnya, semua hal di atas tidak membantu. Konfigurasi eksplisit di kelas yang akan dicatat sebagai tambahan untuk saran pengaturan sebelumnya melakukan trik untuk saya.

string assemblyFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
log4net.Config.XmlConfigurator.Configure(new FileInfo(assemblyFolder + "/log4net.config"));

-7

Juga setelah beberapa jam, saya menemukan mengapa itu tidak berhasil untuk saya ...

saya punya:

public static class Program
{

    private static CommunicationManager _bcScanner = new CommunicationManager();
    private static ILog _log = LogManager.GetLogger(typeof(Program));
    private static SocketServer socketListener;

tetapi seharusnya:

public static class Program
    {
        private static ILog _log = LogManager.GetLogger(typeof(Program));
        private static CommunicationManager _bcScanner = new CommunicationManager();
        private static SocketServer socketListener;

Jadi pastikan ILog ada di baris pertama ....


1
Ini jelas bukan penyebabnya. Tidak masalah saat Anda menginisialisasi objek ILog selama Anda melakukannya sebelum membuat panggilan ke metode logging yaitu _log.Info; _log.error dll.
Oladipo Olasemo
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.