2013-05-27 14 views
15

çağrıldığında çalışır ben thisquestionhasbeenaskedseveraltimes ama maalesef benim günlüğü yapılandırması çalışma almanız mümkün olmamıştır anlıyoruz. Bir yerlerde çok küçük bir hata yapmak zorundayım.log4net sadece XmlConfigurator.Configure()

.NET 4.5 MVC 4/EF 5 web uygulamasına sahibim ve çalışmaya başlamak için çalışıyorum. Çözüm, biri DAO ve model objeler için, diğeri ise web sitesi olmak üzere iki projeye sahiptir. App.Config dosyası şuna benzer: Aynı log4net bölümü de Web.Config dosyasında kopyalanan

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <configSections> 
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --> 
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> 
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" requirePermission="false" /> 
    </configSections> 
    <connectionStrings> 
    <add name="RebuildingTogetherEntities" connectionString="stuff..."/> 
    </connectionStrings> 
    <entityFramework> 
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" /> 
    </entityFramework> 
    <log4net configSource="Log.config" /> 
</configuration> 

.

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

"Output Directory için Kopyala" hem Log.Config dosyalar için true olarak ayarlanır:

ben hem AssemblyInfo.cs dosyalarına aşağıdaki eklendi.

Çıkış dosyasına eklemek için günlüğe kaydetme gibi görünen tek yol, ilk günlüğe kaydetme deyimi çalışmadan önce XmlConfigurator.Configure() yöntemini çağırmaktır. Sanırım ilk kayıtçıyı aldığımda bunu yapmak için bir cephe yazabilirim, ama bu sadece yanlış geliyor.

XmlConfigurator'ı el ile çağırmadan kaydediciyi nasıl başlatırım?

+0

http mu başvurunun giriş noktasında aşağıdakileri ekleyin: // stackoverflow.com/questions/3971250/log4net-configuration-from-assembly-attribute-does-not-load-configuration-file Uygulanır? – sgmoore

+0

Görünmüyordu ... bu durumda, uygulama kapatılmadan önce log4net'ten bir mesaj geldi, fakat bu mesajı benim durumumda göremiyorum. Yine de öneriniz için teşekkürler. – Brad

+0

Mantığınıza katılıyorum emin değilim. Dahili günlük kaydı olmadıkça log4net mesajını göremezsiniz ve sisteminiz log.config dosyanızı okumadıysa, büyük olasılıkla açık olmayacaktır. Önemli olan, GetLogger (...) gibi bir şey yaptığınızda, sistemin temel olarak Attribute.GetCustomAttributes (Assembly.GetCallingAssembly(), typeof (log4net.Config.ConfiguratorAttribute), false) ile eşdeğer bir şey yapacağıdır. Bu nedenle, uygulamanızın başlangıcında çok erken giriş yapmazsanız, ilk günlüğünüz, özel özniteliğe devam etmeyen bir derlemeden başlatılabilir. – sgmoore

cevap

6

Kullandığınız el eğer XmlConfigurator aramaya gerek yoktur: zorunda Ancak

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

tüm DLL dosyaları (bütün assambly.cs dosyaları) etiket eklemek.

+1

Maalesef bu eklenmiş olsa bile uygulama hala oturum açmıyor. – Brad

+2

Log4net hata ayıklamasını etkinleştirebilirsiniz: http://haacked.com/archive/2006/09/27/Log4Net_Troubleshooting.aspx – Peter

+0

Bu özelliği yalnızca ana bilgisayar yerine * tüm * dll'lere eklemeyi neden tavsiye edersiniz? – DarkWalker

16

Tam olarak aynı sorunla karşılaştım. Doğru bir şekilde belirttiğiniz gibi, AssemblyInfo.cs numaranıza satır eklediğinizde, XmlConfigurator'u açıkça aramanıza gerek yoktur. Sorun, log4net'in ilk kullanımının, o satıra sahip olmadığı bir şekilde verildiğinde ortaya çıkar. Benim durumumda, Topshelf.Log4Net NuGet paketini ve uygulamamın günlüğe kaydedildiği ilk günlük satırını kullanıyordum.

sadece uygulamanızda erken bir çizgi log olabilir veya oturum açmak için gerekmiyorsa şey ne yaptım ve

LogManager.GetLogger(typeof(Program)); 
+0

Harika cevap. DI kapsayıcımız tarafından otomatik olarak yaratılan bir nesnenin, ana uygulamadan önce bir günlük kaydı serpmekle aynı sorunu yaşadık. – BBoy

+0

Hayat kurtarıcı. Global.asax.cs içine koyun ve mükemmel çalıştı. Bunun için tam anlamıyla bir gün geçirdim. – arviman

+0

Bu durumda Program nedir? – Euridice01