2009-11-05 2 views
8

Ich benutze log4net und in einer Klasse erfordert die Anmeldung an einem RollingFile Appender, aber dann in einer anderen Klasse, ich möchte protokollieren, um das Ereignisprotokoll + rollende Datei + Konsole appender.einloggen log4net zu verschiedenen Appenders basierend auf den Umständen

Was ist die beste Vorgehensweise? und könnte ich einen Beispielcode sehen?

Übrigens verwende ich Castle Windsor Logging Facility mit Log4net, um meine Logger-Instanz aufzulösen.

Wenn es hilft, dachte ich dies unten, haben aber keine Ahnung, ob das beste Vorgehensweise ist, oder wie eine bestimmte Logger zu aktivieren, basierend auf ‚name‘ noch meine aktuelle Logger Instanz von windsor Verwendung:

log4net.config:

... 
    <logger name="EventLogOnly"> 
     <level value="ALL" /> 
     <appender-ref ref="EventLogAppender" /> 
    </logger> 
    <logger name="ConsoleEventLog"> 
     <level value="ALL" /> 
     <appender-ref ref="ColoredConsoleAppender" /> 
     <appender-ref ref="EventLogAppender" /> 
    </logger> 
... 

Schloss windsor Container Bauer Klasse:

container.AddFacility("logging.facility", 
    new LoggingFacility(LoggerImplementation.Log4net, "log4net.config")); 

Klasse, in der die Anmeldung:

private ILogger Logger; 
public Test(ILogger logger) { 
    Logger.Info("Can I log under event log only?"); 
    Logger.Info("Now can I log under both?"); 
} 

Danke Jungs.

+0

Hier finden Sie eine Möglichkeit, eine benannte Logger-Instanz zu erstellen [tip] (http://kenegozi.com/blog/2009/12/11/windsorsquos-logging-facility-getting-a-named-instance) –

Antwort

12

Sie können dies tun, indem Sie einen Filter auf einen Appender anwenden. Nur wenn das Protokollereignis den Filter passiert, wird das Ereignis von diesem Appender protokolliert.

Diese Filterkonfiguration protokolliert nur die Ereignisse aus dem Logger namens "MyLogger" kommen:

<appender name="EventLogAppender" ... 
    <filter type="log4net.Filter.LoggerMatchFilter"> 
     <loggerToMatch value="MyLogger" /> 
    </filter>  
    <filter type="log4net.Filter.DenyAllFilter" /> 
</appender> 

... und dieser wird übereinstimmen Log-Meldungen mit bestimmten enthaltenen Text:

<filter type="log4net.Filter.StringMatchFilter"> 
    <stringToMatch value="database" /> 
</filter> 
<filter type="log4net.Filter.DenyAllFilter" /> 

Mit Filtern ist eine gute Konfiguration möglich. Weitere Informationen finden Sie im Abschnitt log4net SDK oder im Abschnitt Filter von manual.

+0

Danke Michael, aber ich bin mir immer noch nicht sicher, wie ich mit meinem Namen auf meinen Logger zugreifen kann. Mit der Logging-Funktion in Castle Windsor instanziiere ich keine neue Instanz mit LogManager.GetLogger ("loggerName"), eine Instanz wird für mich übergeben. – GONeale

+0

Haben Sie die Links in meiner Antwort gelesen? Es gibt eine Menge, die Sie neben dem Loggernamen filtern können. –

+0

Entschuldigung, ja, ich verstehe, dass Sie über Filter sprechen, aber um mit diesem Appender überhaupt arbeiten zu können, nahm ich an, dass ich immer noch auf den Logger zugreifen musste. Wie würde ich den Appender abholen lassen? Die Verwendung von um Appender funktionierte früher, sollte ich versuchen, diesen gefilterten Appender anstelle eines tatsächlich benannten Loggers einzupacken? – GONeale

Verwandte Themen