2014-11-06 13 views
6

Sto lavorando con una soluzione su Visual Studio 2008, .net framework 3.5, windows 7. Ho creato una libreria log4net che scrive su un file txt e voglio usarla su diversi progetti sulla mia soluzione e anche su un servizio wcf che si trova nella stessa soluzione che viene eseguita localmente da Visual Studio.Come configurare log4net in modo che funzioni su un servizio wcf?

Avvio il programma da un'applicazione console sulla soluzione. E l'app per console chiama gli altri progetti e quei progetti usano log4net. A questo livello nel flusso di lavoro il registro sta scrivendo bene. Il problema arriva quando viene chiamato il servizio wcf. Il servizio wcf utilizza il registro, ma log4net non scrive sul file.

Sul progetto di console ho questa:

Sulle AssemblyInfo.cs:

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

Sulla App.config devo la configurazione log4net.

Su Program.cs, sul metodo principale che ho:

LogManager.GetLogger("Initialise log4net from the current assembly attributes"); 

sul servizio WCF ho questo:

lo stesso sul AssemblyInfo.cs come il progetto di console.

Lo stesso su Web.config come App.config sul progetto della console.

Al costruttore della Service1.svc ho:

LogManager.GetLogger("Initialise log4net from the current assembly attributes"); 

Ecco come il mio App.config e Web.Config LOOS come:

all'interno del tag configSections:

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

e all'interno del tag di configurazione principale:

<log4net> 
    <root> 
     <level value="DEBUG"/> 
     <appender-ref ref="LogFileAppender" /> 
    </root> 
    <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender" > 
     <file value="C:\test3.txt"/> 
     <appendToFile value="true" /> 
     <rollingStyle value="Size" /> 
     <maxSizeRollBackups value="5" /> 
     <maximumFileSize value="10MB" /> 
     <staticLogFileName value="true" /> 
     <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%d [%t] %-5p %c %m%n" /> 
     </layout> 
    </appender> 
    </log4net> 

Come posso risolvere questo?

+0

ho mai riuscito a ottenere i miei servizi WCF di utilizzare il montaggio attributi, alla fine ho rinunciato e ho usato 'XmlConfigurator.ConfigureAndWatch (...) ' – stuartd

+0

@stuartd Stai dicendo che dovrei rimuovere la parte log4net sul web.config del servizio e lasciare la parte su AssemblyInfo.cs sul servizio. Ho fatto questo cambiamento ma il servizio non scrive ancora nel file. – pyram

+1

No, non sono mai riuscito a caricare i servizi WCF per caricare log4net tramite gli attributi dell'assieme, quindi ho utilizzato XmlConfigurator per configurare la registrazione. Non ci ho dedicato troppo tempo perché volevo che il logging funzionasse e andassi avanti. 'LogManager.GetRepository(). Configured' restituisce true dopo la chiamata a GetLogger? – stuartd

risposta

3

Avete un esempio di XmlConfigurator per configurare il logging?

var logpath = HostingEnvironment.MapPath("~/web.config"); 
var fileInfo = new FileInfo(logpath); 

if (fileInfo.Exists == false) 
{ 
    throw new InvalidOperationException("Can't locate the web.config file"); 
} 

log4net.Config.XmlConfigurator.ConfigureAndWatch(fileInfo); 

Nota che solo l'overload del metodo ConfigureAndWatch che prende un FileInfo può guardare un app.config o web.config come si legge il file config direttamente invece di utilizzare System.Configuration (che un tempo si legge il file non può rileggerlo).

La documentazione spiega questo here.

Edit da @pyram: perché entrambi i progetti accedono allo stesso file è stato necessario aggiungere questa riga alla configurazione appender di entrambi i progetti:

<lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> 
+0

Ho inserito il codice di risposta nel costruttore di servizi prima della chiamata al metodo GetLogger. Vedo che ** LogManager.GetRepository(). Configurato ** restituisce true, ma il servizio non scrive sul file. Ho inserito la mia configurazione nella mia domanda. – pyram

+1

La configurazione sembra OK. Stai facendo una registrazione? – stuartd

+0

una chiamata al metodo GetLogger? ..... sì, nel mio costruttore di servizi ho inserito il tuo codice, e subito dopo ho effettuato una chiamata al log in questo modo ** LogManager.GetLogger ("Initialise log4net from gli attributi dell'assieme corrente "); ** – pyram

Problemi correlati