Log4net, günlüğü günlük dosyasına yazmaz


159

Log4net kullanarak basit bir senaryo oluşturdum, ancak iletileri günlük dosyasına eklenmediği için günlük uygulayıcılarım çalışmıyor gibi görünüyor.

Web.config dosyasına aşağıdakileri ekledim:

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

<log4net>
    <appender name="LogFileAppender" type="log4net.Appender.FileAppender">
            <file value="D:\MyData\Desktop\LogFile.txt" />
            <appendToFile value="true" />
            <encoding value="utf-8" />
            <layout type="log4net.Layout.SimpleLayout" />
    </appender>


    <root>
        <level value="INFO" />
        <appender-ref ref="LogFileAppender" />
    </root>
</log4net>

Global ASAX dosyasında ekledim:

ILog logger = LogManager.GetLogger(typeof(MvcApplication));

Ve Application_Start yöntemi içinde:

logger.Info("Starting the application...");

"Günlük başlatılıyor ..." test günlüğü neden günlük dosyasına eklenmiyor?

Yanıtlar:


316

sen ararmısın

log4net.Config.XmlConfigurator.Configure();

log4net yapılandırmanızı okumak için bir yere? Örneğin Global.asax'ta:

void Application_Start(object sender, EventArgs e) 
{
    // Code that runs on application startup

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

4
Teşekkürler bu kadar, ben aşağıdaki satırı vardı: log4net.Config.BasicConfigurator.Configure (); Log4net'i yapılandırmak için web.config yerine c # yapılandırmasını kullanırsam bunu çağırır mıyım? Bu "Configure" -Method çağrı herhangi bir şekilde gerekli çünkü birçok öğretici bu kod satırı bulamadık.
john84

9
Log4net'e yapılandırmayı nerede arayacağını söylemenin birçok yolu vardır, bkz. Logging.apache.org/log4net/release/manual/configuration.html . XmlConfigurator.Configure () öğesini çağırmak, log4net'in <app.exe> ​​.config veya web.config dosyasında yapılandırma aramasını sağlar. BasicConfigurator.Configure: (SDK belgelerine göre): "Console.Out'a yazacak bir ConsoleAppender kullanarak log4net günlük sistemini başlatır."
Andreas Paulsson

FYI - dosya tabanlı istemiyorsanız log4net.Config.BasicConfigurator'ı da kullanabilirsiniz. Çıktı konsola gönderilir.
silverArc

1
AssemblyInfoDosyadaki yapılandırmayı yapıyorum . Aşağıdaki cevap olarak gönderildi.
LCJ

Argh, bu soruların çoğunu buldu ve her yerde gerçek günlük dosyalarını nerede bulacağından bahsetmediler ... Herkesin zaten bildiği çok açık mı?
MrFox

50

Bu SSS sayfasını kullanın: Apache log4net Sık Sorulan Sorular

Yolun yaklaşık 3 / 4'ü uygulama izlemeyi kullanarak log4net hata ayıklamasını nasıl etkinleştireceğinizi anlatır. Bu size sorunun nerede olduğunu söyleyecektir.

Temel bilgiler:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <appSettings>
        <add key="log4net.Internal.Debug" value="true"/>
    </appSettings>
</configuration>

Ve standart çıktıda iz görüyorsunuz


1
Teşekkürler SSS kontrol ettik ama bunlar benim sorunumu çözemedi.
john84

1
Bu cevap sayesinde rootbölümümün yanlış kaydediciye atıfta bulunduğunu tespit edebildim !!
seebiscuit

büyük ipucu. Asp.net kullanıcısı için erişimin reddedildiğini buldum
Blue Clouds

birisine işe yaramazsa, lütfen bunu kullanma yolumu deneyin: <log4net> <internal> <Debug value = "true"> </Debug> </internal> </log4net>
himanshupareek66

35

@AndreasPaulsson'un önerdiği gibi, yapılandırmamız gerekiyor. AssemblyInfoDosyadaki yapılandırmayı yapıyorum . Belirttiğim configuration file nameburada.

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

9
hem bu hem de log4net.Config.XmlConfigurator.Configure () varsa ne olur; yükte?
n00b

1
@ n00b, sonra bu satırı yorumlayabiliriz, aslında sadece bu şekilde bana çalıştı "log4net.Config.XmlConfigurator.Configure ();" Ve bir şey daha: Bunu web.config ayarlarıma da ekledim <anahtar ekle = "log4net.Internal.Debug" value = "true" />
himanshupareek66

33

Ayrıca, [log4net] .config için "Her zaman kopyala" seçeneğinin işaretli olduğundan emin olun

resim açıklamasını buraya girin


1
Bu benim için bir çözümdü. Bu ayarı daima unuturum.
Ju66ernaut

25

Sitenin altında çalıştığı işlemin (hesap) çıktı dizinine yazma ayrıcalıklarına sahip olduğundan emin olun.

IIS 7 ve sonraki sürümlerde bu uygulama havuzunda yapılandırılır ve normalde tüm dizinlere yazma iznine sahip olmayacak olan AppPool Kimliği'dir .

Herhangi bir istisna atılıp atılmadığını görmek için olay günlüklerinizi (uygulama ve güvenlik) kontrol edin.


Yardımınız için teşekkürler, ayrıca izin sorunlarını düşündüm, ancak aynı zamanda işe yaramadığı herkese okuma, yazma, değiştirme ve yürütme klasörlerini ayarladıysam da.
john84

@ john84 - istisnalar alıyor musunuz? Etkinlik günlüklerine baktınız mı?
Oded

Ayrıca, keşfettiğim gibi, belirli bir hesap altında çalışan bir Windows Hizmeti ile de önemlidir.
Bob Mc

Bana çok yardımcı olan çok teşekkürler.
Abbas

20

ekle:

 [assembly: log4net.Config.XmlConfigurator(Watch = true)]

AssemblyInfo.cs dosyasının sonunda


Bu benim kurtarmamdı. Bir masaüstü Forms projesi yapmak ve log4net.Config.XmlConfigurator.Configure (); temelde yardımcı olmadı. Teşekkürler
Tomas Hesse

bu bana yardımcı oldu. Web.config dosyasında konfigürasyonum vardı ancak log4net yapılan değişiklikleri almıyor gibiydi. Bu özelliğe "Watch = true" ekledim ve
anithing

3

Benim için log dosyalarının yerini değiştirdim ve sadece dosyanın adını başka bir şeye değiştirdiğimde tekrar başladı.

Görünüşe göre zaten aynı adda bir günlük dosyası varsa, hiçbir şey olmuyor.

Daha sonra eski dosyayı yeniden adlandırdım ve yapılandırmadaki günlük dosya adını tekrar eski haline getirdim.


2

Benim durumumda, proje adımda bir boşluk olduğundan log4net düzgün bir şekilde günlüğe kaydedilmiyordu. Aynı kodun farklı bir projede neden iyi çalıştığını, ancak yeni projede neden işe yaramadığını söyledim. Spaces. Basit bir alan.

Bu nedenle, proje adlarındaki boşluklara dikkat edin. Dersimi öğrendim.


1
Bu sorunu nereden aldın? Log4Net bir projede harika çalışıyor, ama başka bir projede değil ... neden bilmiyorum. Tks
Pascal

2

Benim durumumda IIS_IUSRSgünlük dosyasına Okuma \ yazma izni vermek zorunda kaldım .


1

AssemblyInfo.cs dosyasında aşağıdaki satır kodunun bulunduğundan emin olun.

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

ve bu satırı Application_start () yönteminde de kontrol edin.

log4net.Config.XmlConfigurator.Configure();

0

Yapılandırma dosyanız doğru görünüyor. Ardından, Log4net yapılandırma dosyanızı uygulamaya kaydetmeniz gerekir. Böylece aşağıdaki kodu kullanabilirsiniz:

var logRepo = LogManager.GetRepository(Assembly.GetEntryAssembly());
XmlConfigurator.Configure(logRepo, new FileInfo("log4net.config"));

İşlemi kaydettikten sonra, günlükçüyü aramak için aşağıdaki tanımı arayabilirsiniz:

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

log.Error("Sample log");

0

Benim için Logger'ı bir Nuget Paketine taşımak zorunda kaldım. NuGet paket projesine aşağıdaki kodun eklenmesi gerekiyor.

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

Daha fazla bilgi için bkz. Https://gurunadhduvvuru.wordpress.com/2020/04/30/log4net-issues-when-moved-it-to-a-nuget-package/ .


Yanıt olarak bağlantılardan kaçınmaya çalışın. Her zaman çalışmayabilirler. Yanıtınızı, bağlantıya bilgilerin bir özetini eklemek için düzenleyin.
Derek

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.