5

Possiedo un numero di applicazioni ASP.NET che utilizzano log4net senza problemi. Non sono stato in grado di ottenere log4net per registrare qualcosa in nessuno dei servizi che ho scritto utilizzando le librerie MVC. Ho la configurazione identica (a parte il nome del file di log) in tutti i servizi. Ogni servizio è in esecuzione come lo stesso utente e utilizza lo stesso pool di applicazioni.L'applicazione non registra

Ecco la configurazione che sto usando:

<log4net> 
     <appender name="XMLAppender" type="log4net.Appender.RollingFileAppender"> 
      <file value="C:\logs\SERVICENAME.Log.xml"/> 
      <appendToFile value="true"/> 
      <rollingStyle value="Composite"/> 
      <datePattern value="yyyyMM"/> 
      <maxSizeRollBackups value="10"/> 
      <maximumFileSize value="100MB"/> 
      <layout type="log4net.Layout.XmlLayoutSchemaLog4j"> 
       <locationInfo value="false"/> 
      </layout> 
    </appender> 
     <root> 
      <level value="INFO"/> 
      <appender-ref ref="XMLAppender"/> 
     </root> 
    </log4net> 

ho la voce configSection in tutto, come segue:

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

Ho anche acceso il debug log4net e impostare System.Diagnostics a scrivi la traccia su un file. Qui è dove vedo una differenza nell'output tra le applicazioni MVC e non MVC.

MVC:

log4net: log4net assembly [log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=1b44e1d426115821]. Loaded from [C:\Windows\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\MVCSERVICENAME\25c1b478\883641ac\assembly\dl3\707a9005\e1887c7f_5040ca01\log4net.DLL]. (.NET Runtime [2.0.50727.3074] on Microsoft Windows NT 6.0.6002 Service Pack 2, v.286) 
log4net: DefaultRepositorySelector: defaultRepositoryType [log4net.Repository.Hierarchy.Hierarchy] 
log4net: DefaultRepositorySelector: Creating repository for assembly [MVCSERVICENAME, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null] 
log4net: DefaultRepositorySelector: Assembly [MVCSERVICENAME, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null] Loaded From [C:\Windows\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\MVCSERVICENAME\25c1b478\883641ac\assembly\dl3\13a19b30\fdb642f4_937dca01\MVCSERVICENAME.DLL] 
log4net: DefaultRepositorySelector: Assembly [MVCSERVICENAME, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null] does not have a RepositoryAttribute specified. 
log4net: DefaultRepositorySelector: Assembly [MVCSERVICENAME, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null] using repository [log4net-default-repository] and repository type [log4net.Repository.Hierarchy.Hierarchy] 
log4net: DefaultRepositorySelector: Creating repository [log4net-default-repository] using type [log4net.Repository.Hierarchy.Hierarchy] 
log4net: Hierarchy: Shutdown called on Hierarchy [log4net-default-repository] 

non-MVC (in esercizio):

log4net log4net assembly [log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=1b44e1d426115821]. Loaded from [C:\Windows\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\SERVICENAME\33034378\c825df91\assembly\dl3\fe97001a\e1887c7f_5040ca01\log4net.DLL]. (.NET Runtime [2.0.50727.3074] on Microsoft Windows NT 6.0.6002 Service Pack 2, v.286) 
log4net DefaultRepositorySelector: defaultRepositoryType [log4net.Repository.Hierarchy.Hierarchy] 
log4net DefaultRepositorySelector: Creating repository for assembly [SERVICENAME, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null] 
log4net DefaultRepositorySelector: Assembly [SERVICENAME, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null] Loaded From [C:\Windows\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\SERVICENAME\33034378\c825df91\assembly\dl3\827ed068\1a38e2eb_fc7cca01\SERVICENAME.DLL] 
log4net DefaultRepositorySelector: Assembly [SERVICENAME, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null] does not have a RepositoryAttribute specified. 
log4net DefaultRepositorySelector: Assembly [SERVICENAME, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null] using repository [log4net-default-repository] and repository type [log4net.Repository.Hierarchy.Hierarchy] 
log4net DefaultRepositorySelector: Creating repository [log4net-default-repository] using type [log4net.Repository.Hierarchy.Hierarchy] 
log4net XmlConfigurator: configuring repository [log4net-default-repository] using .config file section 
log4net XmlConfigurator: Application config file is [C:\content\SERVICENAME\web.config] 
log4net XmlConfigurator: Configuring Repository [log4net-default-repository] 
log4net XmlHierarchyConfigurator: Configuration update mode [Merge]. 
log4net XmlHierarchyConfigurator: Logger [root] Level string is [INFO]. 
log4net XmlHierarchyConfigurator: Logger [root] level set to [name="INFO",value=40000]. 
log4net XmlHierarchyConfigurator: Loading Appender [XMLAppender] type: [log4net.Appender.RollingFileAppender] 
log4net XmlHierarchyConfigurator: Setting Property [File] to String value [C:\Windows\Temp\SERVICENAME.Log.xml] 
log4net XmlHierarchyConfigurator: Setting Property [AppendToFile] to Boolean value [True] 
log4net XmlHierarchyConfigurator: Setting Property [RollingStyle] to RollingMode value [Composite] 
log4net XmlHierarchyConfigurator: Setting Property [DatePattern] to String value [yyyyMM] 
log4net XmlHierarchyConfigurator: Setting Property [MaxSizeRollBackups] to Int32 value [10] 
log4net XmlHierarchyConfigurator: Setting Property [MaximumFileSize] to String value [100MB] 
log4net XmlHierarchyConfigurator: Setting Property [LocationInfo] to Boolean value [False] 
log4net XmlHierarchyConfigurator: Setting Property [Layout] to object [log4net.Layout.XmlLayoutSchemaLog4j] 
log4net RollingFileAppender: Type = [0], r0 = [197001], r1 = [197001] 
log4net RollingFileAppender: Type = [1], r0 = [197001], r1 = [197001] 
log4net RollingFileAppender: Type = [2], r0 = [197001], r1 = [197001] 
log4net RollingFileAppender: Type = [3], r0 = [197001], r1 = [197001] 
log4net RollingFileAppender: Type = [4], r0 = [197001], r1 = [197001] 
log4net RollingFileAppender: Type = [5], r0 = [197001], r1 = [197002] 
log4net RollingFileAppender: Searched for existing files in [C:\Windows\Temp] 
log4net RollingFileAppender: curSizeRollBackups starts at [0] 
log4net RollingFileAppender: [200912] vs. [200912] 
log4net FileAppender: Opening file for writing [C:\Windows\Temp\SERVICENAME.Log.xml] append [True] 
log4net XmlHierarchyConfigurator: Created Appender [XMLAppender] 
log4net XmlHierarchyConfigurator: Adding appender named [XMLAppender] to logger [root]. 
log4net XmlHierarchyConfigurator: Hierarchy Threshold [] 
log4net DefaultRepositorySelector: Creating repository for assembly [SERVICENAME.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null] 
log4net DefaultRepositorySelector: Assembly [SERVICENAME.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null] Loaded From [C:\Windows\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\SERVICENAME\33034378\c825df91\assembly\dl3\d74dc9d5\8aa6a7e8_fc7cca01\SERVICENAME.Core.DLL] 
log4net DefaultRepositorySelector: Assembly [SERVICENAME.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null] does not have a RepositoryAttribute specified. 
log4net DefaultRepositorySelector: Assembly [SERVICENAME.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null] using repository [log4net-default-repository] and repository type [log4net.Repository.Hierarchy.Hierarchy] 
log4net DefaultRepositorySelector: repository [log4net-default-repository] already exists, using repository type [log4net.Repository.Hierarchy.Hierarchy] 

In entrambi i casi sto creando l'oggetto ILOG come segue:

privato statico di sola lettura log Ilog = LogManager .GetLogger (typeof (CLASSNAME));

C'è qualcosa che mi manca o qualche cambiamento che devo fare per farlo funzionare per MVC? A questo punto sarei anche disposto a passare a un'altra soluzione di registrazione se è noto che funzioni correttamente con MVC.

Grazie Tim

+0

il processo di lavoro ha accesso in scrittura a c: \ logs? –

+0

Sì. Per quello che vale ho appena provato NLog e ha funzionato perfettamente. Dovrebbe essersi arreso su log4net qualche tempo fa. –

risposta

0

Usa NLog. Sembra che funzioni. Ho dovuto mettere il file NLog.config nella directory di base (lungo il web.config) e ha funzionato bene. È stato in grado di scrivere nella directory corretta, che per me dimostra che i permessi della directory sono stati impostati correttamente. Ci sono voluti circa 5 minuti dall'inizio alla fine per apportare le modifiche.

Sarebbe bello sapere perché log4net ha rifiutato di giocare.

+1

Oppure dai un'occhiata a ELMAH http://code.google.com/p/elmah/ – David

+0

Verificherò. Grazie David. –

+2

ELMAH è davvero bello ma non sostituisce log4net, lo integra. ELMAH è un'ottima risorsa per registrare eccezioni non gestite, ad esempio cose che per qualche motivo passano attraverso le tue chiamate lo4net (ad esempio uno sviluppatore ha dimenticato di aggiungere un try/catch o per registrare l'eccezione) –

10

So che questo post è piuttosto vecchio, ma mi è stato sempre questo problema (repository log4net default) in un progetto WCF anche. Stavo usando il web.config con una sezione log4net (non un file log4net.config separato).

per aggirare il problema ho messo il seguente nei miei AssemblyInfo.cs:

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

Lo stesso vale anche se si utilizza un file di configurazione esterno però. HTH, Ciaran

+0

Thankyou - Ho avuto esattamente lo stesso problema e questo lo ha risolto. – Justin

+0

Stavo usando il codice in app_statup, usando questo invece ho risolto il problema. – Clint

0

Nel mio caso, è stato perché le proprietà del progetto sono stati fissati per l'uscita a bin \ debug ma la dll log4net richiesto che il file log4net.config esiste nella cartella BIN. Ho modificato le proprietà del progetto in output nella cartella bin e il file log4net.config è stato quindi copiato al momento della compilazione nel posto giusto.

0

Inoltre, accertarsi che "copia locale" sia impostato per il file di configurazione log4net, eviterà anche molti problemi.

+0

Probabilmente questo dovrebbe essere un commento, non una risposta a pieno titolo ... – IronMan84

4

La mia applicazione Web è una MVC ASP.NET con un file log4net.config separato nella radice Web.

Dopo un sacco di googling e tirate di capelli ho fatto ricorso per l'inizializzazione log4net tramite il codice a Application_Start (in Global.asax):

protected void Application_Start() 
{ 
    var logConfigFilePath = Server.MapPath("~/log4net.config"); 

    log4net.Config.XmlConfigurator.ConfigureAndWatch(new System.IO.FileInfo(logConfigFilePath)); 
} 

Questo risolto il problema per me e log4net ha iniziato la registrazione in modo corretto.

+0

Nota, puoi mettere la configurazione di log4net in 'Web.config'. Usando 'Server.MapPath (" ~/Web.config ");' sembra puntare XmlConfigurator sul file. –