2013-02-26 15 views
11

Non succede nulla con la seguente configurazione.log4net con EventLogAppender non registra

App.config

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> 
    </configSections> 
    <startup> 
     <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> 
    </startup> 
    <log4net> 
    <appender name="EventLogAppender" type="log4net.Appender.EventLogAppender" > 
     <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> 
     </layout> 
    </appender> 
    </log4net> 
</configuration> 

Form1.cs (Esempio)

public partial class Form1 : Form 
{ 
    private static readonly ILog log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 

    public Form1() 
    { 
     InitializeComponent(); 

     log.Fatal("Test!"); 
    } 
} 
+0

Quale versione di studio? –

+0

Visual Studio 2012 + Windows 8. – timmkrause

risposta

13

vi manca la configurazione di root quindi è necessario qualcosa di simile

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
     <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> 
    </configSections> 
    <startup> 
     <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/> 
    </startup> 
    <log4net debug="true"> 
     <appender name="EventLogAppender" type="log4net.Appender.EventLogAppender" > 
     <applicationName value="MyApp" /> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> 
     </layout> 
     </appender> 


     <root> 
     <level value="All" /> 
     <appender-ref ref="EventLogAppender" /> 
     </root> 


    </log4net> 
</configuration> 

Si noti inoltre che se il programma si chiama app.exe, allora avete bisogno di una fonte di eventlog chiamato app.exe. Se questo non esiste, Log4net tenterà di crearlo, ma ciò richiede diritti di amministratore, quindi potrebbe essere necessario eseguire il programma come amministratore almeno una volta per creare questa origine evento. Per evitare ciò, l'origine evento verrebbe normalmente creata come parte della procedura di installazione che sarebbe già in esecuzione come amministratore.

+0

In combinazione con la peer line di codice ha finalmente funzionato. Grazie! :) C'è un ultimo difetto: le voci di registro vengono visualizzate solo se avvio il file .exe stesso ma non quando raggiungo f5. Qualche idea su quest'ultimo? – timmkrause

+0

Sono presenti messaggi di errore nella finestra di output di Visual Studio? La sezione debug = "true" della configurazione precedente dovrebbe darti informazioni su cosa sta facendo log4net e dovrebbe includere messaggi di errore se fallisce. (Probabilmente si desidera disabilitare la modalità di debug quando si ha il logging funzionante) – sgmoore

+0

"log4net: ERRORE [EventLogAppender] ErrorCode: GenericFailure Catturato un SecurityException cercando di accedere a EventLog. Molto probabilmente la sorgente di eventi Log4NetEventViewer.vshost.exe non esiste e deve essere creato da un amministratore locale. " - Ho avviato l'exe come amministratore per creare la fonte dell'evento ma non il VS o l'edizione vshost. Anche l'esecuzione di .vshost.exe come admin non era sufficiente, perché ha avviato un file .exe con un suffisso "-clr2" o qualcosa del genere. Esecuzione di VS come amministratore una volta risolto. GRAZIE! – timmkrause

5

si dovrebbe aggiungere:

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

nelle AssemblyInfo.cs del progetto . Questo inizializzerà il logger. E metti il ​​log4net in un file chiamato log4net.config.

+0

L'ho provato e l'ho eliminato di nuovo perché non aveva alcun effetto. – timmkrause

+0

Scusa, avevi ragione. Dopo aver aggiunto l'elemento fornito da sgmoore, non funzionava ancora, ma dopo aver aggiunto la tua linea in AssemblyInfo.cs ha funzionato. – timmkrause

0

Assicurarsi che ti ha dato i permessi di scrittura per l'utente a:

HKEY_LOCAL_MACHINE \ SYSTEM \ ControlSet001 \ Services \ EventLog \ MyApp

e se si desidera aggiungere più famiglia Loger dover seguire questa nomenclatura:

<root name="EventLog"> 
<level value="ALL"/> 
<appender-ref ref="FirstLog"/> 
</root> 

<logger name="FileLogger" additivity="false"> 
<level value="ALL" /> 
<appender-ref ref="Secong_Log" /> 
</logger> 

Buona fortuna.

Problemi correlati