Harici dosyadaki Log4Net yapılandırması çalışmıyor


91

Log4net kullanıyoruz ve yapılandırmasını harici bir yapılandırma dosyasında belirtmek istiyoruz (diğer bölümlerde yaptığımız gibi). Bunu yapmak için App.config dosyasındaki log4net bölümünü şu şekilde değiştirdik:

...
<section name="log4net" 
     type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
...
<log4net configSource="Log.config" />
...

Ve Log.Config dosyasında (App.config ile aynı dizin) var:

<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>

Ancak, uygulamayı çalıştırdığımızda, günlük dosyası oluşturulmaz (ve günlük kaydı yapılmaz). Konsola hiçbir hata mesajı gönderilmez.

Log.config dosyasının içeriğini tekrar App.config dosyasına taşırsak (yukarıdaki ilk kod satırını değiştirirsek), beklendiği gibi çalışır. Harici bir dosyada neden çalışmadığına dair bir fikriniz var mı?


Ben de aynı problemle karşılaştım - muhtemelen aynı (yanlış yönlendirilmiş) kılavuzu takip ettik!
Zach Burlingame

14
Log4net hakkında sevmediğim şey bu. Günlük oluşturma çerçevesi, bence uygulamanızın en sağlam parçalarından biri olmalıdır - ancak log4net genellikle biraz zahmetli görünmektedir.
UpTheCreek

Yanıtlar:


113

AssemblyInfo.csDosyanızda aşağıdaki özniteliğe sahip misiniz :

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log4Net.config", Watch = true)]

ve günlük kaydı işlevselliği gerektiren her sınıfın başında şu şekilde kodlayın:

private static readonly ILog log = 
LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

Burada bunu ve diğer bilgileri içeren bir blog yazım var .


17
Bu çalışır, log4net.config dosyasını "Her Zaman Kopyala" seçeneğinde "Çıktı Dizinine Kopyala" özelliğini ayarlamak için oluşturduğunuzdan emin olun.
E. van der Spoel

@mitchwheat Kesinlikle tanrı gibi, tüm gün tam olarak bunun yaptığı şeyi yapmak için nesne tabanlı bir çözümle savaşıyorum ... teşekkürler dostum!
Savaş

39

Bir yoktur açık kusur bu konuda. Log4Net, yapılandırma öğelerinin configSource özniteliğini desteklemez. Tamamen yapılandırma dosyası çözümü kullanmak için appSettings'deki log4net.Config anahtarını kullanırsınız.

Adım 1: Normal yapılandırma bölümü tanımını ekleyin:

<configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>

Adım 2: appSettings'de sihirli log4net.Config anahtarını kullanın.

<appSettings>
      <add key="log4net.Config" value="log4net.simple.config" />
</appSettings>

Adım 3: configSource'un işlenmesini düzeltmek için bir yama ile katkıda bulunun.


5
Log4net.Config.XmlConfigurator.Configure () için bir çağrı; configSource
Greg Domjan

Bu benim için hiçbir şeyi değiştirmedi. Henüz sorunu çözmedim ama takip etmeye çalışacağım.
Don Rolling

5
Log4net yapılandırma dosyasını "daha yeniyse kopyala" olarak işaretlemek önemlidir. Yapılandırma dosyası bin klasörüne kopyalanmazsa çalışmayacaktır.
Francisco Goldenstein

Bu benim için olduğu gibi çalıştı ve kabul edilen çözüme tercih ediyorum çünkü kitaplıklarımdan bazıları günlük kaydının ayrı bir log4net.config içinde yapılandırıldığı bir web uygulamasında kullanılıyor ve bazen günlük kaydının olduğu sabit uygulamada kullanılıyor app.exe.config içinde yapılandırılır. Bu şekilde her şey montaj bilgisi yerine yapılandırmada - log4net.config'e "sabit kodlamak" istemiyorum
Danny

27

Kaçırılan adım

log4net.Config.XmlConfigurator.Configure(); 

bu configSource'un kullanılmasına neden olur. GetLogger () 'ı çağırmadan önce onu bir kez çağırdığınızdan emin olun;


Mitch Wheat'in solüsyonunu kullanırsanız bunu yapmanıza gerek yoktur.
Robert Wagner

4
@Robert: Elbette, Mitch Wheat'ın çözümü yapılandırma dosyasını app.config dışında sabit kodlamayı gerektirse de - orijinal soruyu okudum, neden configSource çalışmıyor, bu fazladan adım takip edilirse işe yarıyor.
Greg Domjan

Bu yaklaşımı daha çok seviyorum, özellikle de log4net'i dahili olarak kullanan (daha sonra değiştirilebilir) bir sarmalayıcı günlük işleyicisi oluşturduğum için, daha sonra bu sarmalayıcı günlük işleyicisinde log4net.Config.XmlConfigurator.Configure () 'i çağırıyorum. Bu şekilde, kendi app.config dosyasına sahip herhangi bir proje, assembler.cs'yi değiştirmeye gerek kalmadan bu sarmalayıcı günlük işleyicisini kullanabilir
zheng yu

20

Log4net.config dosyanızın aşağıdaki özelliklerle ayarlandığından emin olun:

Eylem Oluştur: İçerik

Çıktı dizinine kopyala: Her Zaman Kopyala


10

Ya kullanın,

<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
<appSettings>
<add key="log4net.Config" value="Log4Net.config" />
</appSettings>

ya da sadece,

log4net.Config.XmlConfigurator.ConfigureAndWatch(new System.IO.FileInfo("Log4Net.config"));

Her iki durumda da Log4Net.config dosyası çıktı dizininde bulunmalıdır. Çözüm gezgininde Log4Net.config dosya özelliklerini ayarlayarak bunu yapabilirsiniz. Derleme Eylemi - İçerik ve Çıktı Dizinine Kopyala - Her zaman kopyala


ilk durum için <configSections> etiketine ihtiyacınız yok
disklosr

2

Bu soruna dikkat edin ...

Benim durumumda her şey doğru yapılandırıldı. Sorun şu ki, siteyi WinHost.com'a yüklemek için Visual Studio 2013 içinde Web Dağıtımı kullandım ve sunucudaki ACL'leri sıfırladı . Bu da klasörler ve dosyalar üzerindeki tüm izinleri iptal etti - log4net dosyayı yazamadı.

Bununla ilgili daha fazla bilgiyi buradan okuyabilirsiniz:

Web Dağıtımı / MSBuild'in sunucu izinlerini bozması nasıl engellenir

Oradaki destek ekibinden ACL'leri sıfırlamasını istedim ve ardından log4net günlükleri tükürmeye başladı. :)


1

Konuşlandırma dizininize kopyalanan log4net.config adında harici bir yapılandırma dosyanız olduğunu varsayarak, bunu şu şekilde yapılandırabilirsiniz:

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

1

Sahip olmanın yanı sıra aynı sorunu yaşadım

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net")]

devam eden projede, bir referans projede şu satır da vardı:

[assembly: log4net.Config.XmlConfigurator]

Referans verilen projelerde bu satırı kaldırdığımda günlükler görünmeye başlıyor.


1

İçin bir Hata Ayıklama modunu açmak da mümkündür log4net. Bunu App.config dosyasına ekleyin:

 <appSettings>
      <add key="log4net.Internal.Debug" value="true"/>
 </appSettings>
 <system.diagnostics>
      <trace autoflush="true">
      <listeners>
           <add
             name="textWriterTraceListener"
             type="System.Diagnostics.TextWriterTraceListener"
             initializeData="link\to\your\file.log" />
      </listeners>
      </trace>
 </system.diagnostics>

ve en azından, tam olarak neyin yanlış gittiğini türetebileceğiniz hata mesajları alacaksınız. Benim durumumda ben sadece kurmayı unuttuğu Copy to output directoryiçin Copy Always.


0

@Mitch, [assembly: ...] bildirimine sahip bir dosya var, ancak ConfigFile özelliğine sahip değil.

Ekledikten ve Log.config'e işaret ettiğimde çalışmaya başladı. Diğer tüm yapılandırma bölümleri (yani AppSettings) gibi çalışacağını ve harici yapılandırma dosyalarını değiştirmeden kabul edeceğini düşünürdüm.

Global bir statik günlük sağlayıcısına soktuğumuz için bahsettiğiniz ikinci ifadeye sahip değiliz.


0

Benim durumumda bu hata mesajını aldım:

log4net: config file [C:\........\bin\Debug\log4net.config] not found.

Ve log4net.configdosya Visual Studio 2017 projesindeydi, ancak dosyayı bin\Debugklasörde kontrol ettiğimde bulamadım.

Orijinal montaj kurulumum şöyleydi:

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]

Bir süre araştırma yaptıktan sonra aşağıdakine değiştiriyorum ve işe yarıyor:

[assembly: log4net.Config.XmlConfigurator(ConfigFile = @"..\..\log4net.config", Watch = true)]

0
  1. AssemblyInfo.cs dosyasına aşağıdakileri ekleyin

[derleme: log4net.Config.XmlConfigurator (ConfigFile = "Log4Net.config")]

  1. Log4net.config'in projeye dahil edildiğinden emin olun
  2. Log4net.config özelliklerinde

değişim Çıktı dirctory kopyalama için Copy yeni eğer

  1. Çift kontrol günlük seviyesi seviyesi değeri = "TÜMÜ"

0

Ayrıca, bir web uygulamasında, bin klasörüne değil, kök dizine baktığına dikkat çekmek önemlidir, bu nedenle, yapılandırma dosyasını koyduğunuz yere emin olun.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.