log4net çalışmıyor


123

Hey bu yapılandırma web.config dosyamda var

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

ancak log4net çalışmıyor. Projem iyi bir şekilde derleniyor ve ben de hata ayıklamada hata almıyorum. Söylediğim satırlar log.debug("somemessage")iyi çalışıyor, ancak mylog.logdosyayı bulamıyorum, peki nerede?


Bunu da kontrol ettiğinizden emin olun: stackoverflow.com/a/24617269/114029
Leniel Maccaferri

Yanıtlar:


298

Bu tür bir şey için bir şey, XmlConfiguratoraşağıdaki satırı sizin tarafınıza yerleştirerek derleme özniteliği eklediğinizden emin olmaktır AssemblyInfo.cs:

[assembly: log4net.Config.XmlConfigurator]

Aksi takdirde log4net asla etkinleşmez.


5
Bu yöntem kullanılır projemde çalışmalarına, ama her nasılsa çalışmayı durdurdu. Tekrar çalışmasını sağlamak için bu yöntemi stackoverflow.com/a/1479343/193634 kullanmam gerekiyordu.
Rosdi Kasım

Tekrar denedim ve iyi çalışıyor. Büyük olasılıkla düşündüğünüz anda içeren montajı referans göstermiyor / yüklemiyorsunuz AssemblyInfo.
Kirk Woll

ELMAH appender kullananlar için gitmenin yolu budur. 'Log4net.Config.XmlConfigurator.Configure ();' global.asax.cs dosyasında ve dosya ekleyici için iyi çalışıyordu, ancak ELMAH ekleyicileri için çalışmıyordu.
user3885927

Bu cevabı güncelledim ve "[assembly: log4net.Config.XmlConfigurator (Watch = true)]" ile ince ayar yapmam gerektiğini fark ettim
David Savage

49

Sanırım ya log4net hiç günlüğe kaydetmiyor ya da dosya beklediğiniz yerde bitmiyor.

İlk olarak, gerçekten aradınız mı

XmlConfigurator.Configure()

kodunuzun herhangi bir yerinde? Yukarıdaki xml parçacığı uygulama yapılandırma dosyasındaysa, bu çağrı hile yapacaktır. Xml parçacığı kendi dosyasındaysa, dosyanın .Configure(string)yolunu alan aşırı yüklemeyi kullanmanız gerekir . Bu çağrı (veya Kirk Woll tarafından belirtilen montaj seviyesi özniteliği) olmadan, log4net hiç günlüğe kaydetmeyecektir.

Tüm bunların yapıldığına inanıyorsanız ve log4net'in günlüğe kaydetmesi gerektiğine inanıyorsanız, daha fazla hata ayıklarken günlük dosyası için tam nitelikli bir yol koymanız gerekebilir. Bu, dosyanın nerede olması gerektiğinden emin olmanızı sağlayacaktır .


33

Başka bir küçük sorun var, buraya bakın: http://logging.apache.org/log4net/release/manual/configuration.html#dot-config

[assembly: log4net.Config.XmlConfigurator]yöntem app.config ile çalışmaz. Log4net'i app.config dosyasından yapılandırırsanız, log4net.Config.XmlConfigurator.Configure()yöntemi kullanmanız gerekir .


Sadece kayıt için, her iki yöntem de bir konsol uygulamasında benim için çalıştı.
rageit

Yukarıdaki çözümü onaylıyorum - log4net.Config.XmlConfigurator.Configure ();
kodumda (log4net'in

19

İşte log4net'in ne zaman inatçı olduğunu kanıtladığına dair kontrol listem:

  • oluştururken log4net.config dosyasının bin \ klasörüne kopyalandığından emin olun (derleyicide 'Daha yeniyse kopyala' olarak ayarlayın)
    • kurulu kodla uğraşırken, log4net.config dosyasının sürüş için geldiğinden emin olun (derleyicide 'İçerik' olarak ayarlayın)
  • kullanıcının işlemin olduğu gibi çalıştığından emin olun, günlüklerin yazılacağı klasöre yazma haklarına sahip olduğundan emin olun
  • şüpheniz varsa, c: \ temp \ için rastgele izinler verin ve orada oturum açmak için her şeyi alın ()
  • Bunun size bir şey söyleyip söylemediğini görmek için Sysinternal / Dbgview.exe'yi çalıştırın

3
"oluştururken log4net.config dosyasının bin \ klasörüne kopyalandığından emin olun (derleyicide 'Daha yeniyse kopyala' olarak ayarlayın)" -> günümü kurtarın! Çok teşekkürler!
Hoang Nguyen Huu

8

ASP.NET MVC projesi eklenmesi için

log4net.Config.XmlConfigurator.Configure();

Global.asax.cs adresine ayrıca şu konularda yardımcı olur:

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
Bununla ilgili çok tuhaf bir sorun vardı, üretimde ve patronumun bilgisayarında kaydediciler böyle iyi çalıştı, ancak Kirk'ün cevabı bilgisayarımda işe yarayana kadar olmadı. Benzer sorunları olması durumunda insanlara haber vereceğimi düşündüm (MVC projesi btw).
Shelby115

@ Shelby115, çok çok teşekkürler! Log4Net girdilerimi ELMAH'a koymaya çalışıyordum. Web.config dosyasında her şey doğruydu. Zaten 'log4net.Config.XmlConfigurator.Configure ();' global.asax.cs dosyamda ama çalışmıyor. Bu SO gönderisine geldi ve Kirk'e dayalı olarak assemblyInfo.cs'ye satırı ekledi. Hala işe yaramadı !. Yorumunuzu okuduktan sonra global.asax.cs dosyasından önceki girişi sildim ve çalışmaya başladı. Bunun için birkaç saat harcadım ve yorumunuz çok yardımcı oldu. Tekrar teşekkürler!
user3885927

Global.asax.cs içindeki girdi dosya ekleyici için iyi çalışıyordu, ancak ELMAH ekleyicileri için çalışmıyordu. Kirk'ün yolu ELMAH
ekleyici

Log4net'in günlük dosyaları için yapılandırılmış dizine yazma izinlerine sahip olduğundan da emin olmak isteyebilirsiniz.
Oladipo Olasemo

@ Shelby115 Dang, çözümü unuttuğunuzda sevmelisiniz ve kendi yorumunuz probleminizi çözer. Sizin tarafınızdan zaten oylanmış bir cevaba sahip bir sayfaya gelmek de iyi bir göstergedir.
Shelby115

7

Sonunda dosya günlüğümü çalıştıran adımlar şunlardır:

  • -Check AssemblyInfo.cs aşağıdaki özniteliği içerir. [derleme: log4net.Config.XmlConfigurator] . Bu log4net'i yükler.
  • Günlük dizininin yazma izinlerine sahip olup olmadığını kontrol edin.
  • Kaydedicinin belirtilen bir biçime sahip olup olmadığını kontrol edin. Bu, yapılandırmanızdaki her bir öğenin belirtilen bir düzen öğesine sahip olup olmadığını kontrol ederek yapılır . Örneğin:

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

  • Son olarak, konsol günlük kaydını etkinleştirmek ve konsolu kontrol etmek için log4net dahili günlüğünü açmayı deneyin. Bunu yapmak <add key="log4net.Internal.Debug" value="true"/>için appSettings.

<add key = "log4net.Internal.Debug" value = "true" /> Bu, sorunu gidermeme yardımcı oldu. Teşekkürler
Ravi Khambhati

Yönetmenin izinleri beni
anlayan

6

Loglama sistemlerinin istisnalar yaratmadan sessizce başarısız olduğu deneyimlerim oldu. Sanırım bu mantıklı çünkü günlük kaydedici hataları günlüğe kaydediyorsa, günlüğe kaydetmeyi gerçekleştiremediği bir hatayı nasıl günlüğe kaydedebilir?

Bu nedenle, dosya diskte oluşturulmadıysa, uygulamanızın altında çalıştığı kullanıcının bu disk konumuna yeni bir dosya yazabilmesini sağlamak için dosya sistemi izinlerine bakarak başlayın .

Sınama amacıyla, diske yazılması gereken dosyayı el ile oluşturmak ve herkesin yazması için izinleri açmak isteyebilirsiniz. Kaydedici yazmaya başlarsa, yapılandırma tabanlı değil izin tabanlı olduğunu anlarsınız.


2

Benim açımdan, uygulama derlenirken kopyalanacak yapılandırma dosyasını işaretlemeyi unuttum.

Yapılandırma dosyasını çıktı dizinine kopyalayın

Log4net.config dosyasına sağ tıklayın, özelliği seçin ve ardından XXXX Kopyalamak için Çıktı Dizinine Kopyala'yı seçin.


1

Yukarıdakilerin hepsini denedim ama hiçbir şey işe yaramadı. Bu satırı app.config configSections bölümüne eklemek benim için çalıştı.

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

Emin olun Versionve PublicKeyTokendoğru


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

"log.log'umu gerçek klasöre yaz" diyor. Bu, web uygulamanız IIS altındaysa, günlüğün C: \ inetpub \ wwwroot \ appname \ mylog.log dosyasına yazılacağı anlamına gelir.

Günlük dosyası orada değilse, uygulamanın çalıştığı hesabın klasöre yazma izni olmayabilir. Bir dosyanın yazılıp yazılmadığını ve nereye yazıldığını görmek için Process Monitor'ü SysInternals'dan çalıştırabilirsiniz.

Ayrıca herhangi bir istisnanın atılıp atılmadığını görmek için VS'yi hata ayıklama modunda çalıştırın (Hata Ayıklama-> İstisnalar-> CLR İstisnaları, Atılmış'ı kontrol edin).


0

Benim durumumda log4Net.config dosya özelliklerini "İçerik" olarak ayarlamayı unuttum, böylece dosya konuşlandırmaya dahil edilmedi. Öyleyse ona dikkat edin:

Compile action : Content

0

Ne yazık ki yukarıdakilerin hiçbiri yardımcı olmadı. Önceki ayar önerilerine ek olarak günlüğe kaydedilecek sınıftaki açık konfigürasyon benim için hile yaptı.

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

-7

Ayrıca birkaç saat sonra neden benim için işe yaramadığını anladım ...

sahiptim:

public static class Program
{

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

ama şöyle olmalı:

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

Bu yüzden ILog'un ilk satırda olduğundan emin olun ....


1
Sebep kesinlikle bu değil. Günlüğe kaydetme yöntemlerine bir çağrı yapmadan önce, yani _log.Info; _log.error vs.
Oladipo Olasemo
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.