2013-02-26 19 views
11

Nic się nie dzieje z następującą konfiguracją.log4net z EventLogAppender nie loguje się

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 (przykład)

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

    public Form1() 
    { 
     InitializeComponent(); 

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

Jaką wersję studia? –

+0

Visual Studio 2012 + Windows 8. – timmkrause

Odpowiedz

13

Brakuje konfigurację korzeniowy więc trzeba coś takiego

<?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> 

Należy również pamiętać, że jeśli program jest nazywany app.exe, to trzeba źródło dziennik_zdarzeń nazwie app.exe. Jeśli to nie istnieje, Log4net spróbuje go utworzyć, ale wymaga to uprawnień administratora, więc aby utworzyć to źródło zdarzeń, konieczne może być uruchomienie programu jako administrator co najmniej raz. Aby tego uniknąć, źródło zdarzenia zwykle tworzy się w ramach procedury instalacji, która już działa jako administrator.

+0

W połączeniu z linią kodu peerów działało. Dziękuję Ci! :) Jest jedna ostatnia usterka: wpisy dziennika pojawiają się tylko wtedy, gdy sam uruchomię plik .exe, ale nie po naciśnięciu klawisza F5. Jakiś pomysł na ten ostatni? – timmkrause

+0

Czy są jakieś komunikaty o błędach w oknie wyjściowym Visual Studio? Sekcja debug = "true" powyższej konfiguracji powinna dostarczyć informacji o tym, co robi log4net i powinna zawierać komunikaty o błędach, jeśli się nie powiedzie. (Prawdopodobnie chcesz wyłączyć tryb debugowania, gdy działa twoje logowanie) – sgmoore

+0

"log4net: ERROR [EventLogAppender] ErrorCode: GenericFailure Złapano SecurityException próbujący uzyskać dostęp do EventLog. Najprawdopodobniej źródło zdarzeń Log4NetEventViewer.vshost.exe nie istnieje i musi zostać utworzony przez lokalnego administratora. " - Uruchomiłem .exe jako administrator, aby utworzyć źródło zdarzenia, ale nie wersję VS ani vshost. Uruchomienie .vshost.exe jako administratora również nie było wystarczające, ponieważ uruchomiło rozszerzenie .exe z sufiksem "-clr2" lub coś podobnego. Uruchamianie VS jako administrator po jego rozwiązaniu. DZIĘKUJĘ CI! – timmkrause

5

należy dodać:

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

w AssemblyInfo.cs Twojego projektu . Spowoduje to zainicjowanie rejestratora. I umieść log4net w pliku o nazwie log4net.config.

+0

Próbowałem już, a następnie usunąłem go ponownie, ponieważ nie przyniosło to efektu. – timmkrause

+0

Przepraszam, miałeś rację. Po dodaniu elementu dostarczonego przez sgmoore nadal nie działał, ale po dodaniu linii w AssemblyInfo.cs zadziałało. – timmkrause

0

Upewnij się, że dał uprawnienia do zapisu do użytkownika w celu:

HKEY_LOCAL_MACHINE \ SYSTEM \ ControlSet001 \ Services \ EventLog \ MojaApl

i jeśli chcesz dodać więcej logers musiał wykonać tę nomenklaturę:

<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> 

Powodzenia.

Powiązane problemy