2014-04-11 12 views
9

Zunächst einmal habe ich viele Antworten und Tipps in anderen Themen gesehen (am ähnlichsten: Log4Net: Multiple loggers), aber es gibt keine anwendbare Antwort.Log4Net Mehrere Logger

Ich möchte 2 Logger mit verschiedenen Dateiapplikatoren haben und jeden beschränken, um in Root-Logger zu schreiben. Es ist eine Konsolen-App. Ganze Code unten:

using System; 
using System.Diagnostics; 
using System.Linq; 
using log4net; 

namespace Test_log4net 
{ 
class Program 
{ 
    static void Main(string[] args) 
    { 
     log4net.Config.XmlConfigurator.Configure(); 

     ILog logger = LogManager.GetLogger("Async"); 
     logger.Info("started async"); 
     Console.WriteLine("Logger: {0}", (logger as log4net.Core.LogImpl).Logger.Name); 
     Console.WriteLine("Appenders: {0}", string.Join(", ", (logger as log4net.Core.LogImpl).Logger.Repository.GetAppenders().ToList().Select(appendr => appendr.Name))); 


     ILog logger2 = LogManager.GetLogger("Sync"); 
     logger2.Info("started sync"); //changed: from logger -> to logger2 on 10/21/2014 
     Console.WriteLine("Logger: {0}", (logger2 as log4net.Core.LogImpl).Logger.Name); 
     Console.WriteLine("Appenders: {0}", string.Join(", ", (logger2 as log4net.Core.LogImpl).Logger.Repository.GetAppenders().ToList().Select(appendr => appendr.Name))); 

     Console.ReadKey(); 
    }  
} 
} 

Und App.config-Datei:

<?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> 
    <root> 
     <level value="All"/> 
    </root> 

    <appender name="FileInfoAppenderA" type="log4net.Appender.RollingFileAppender"> 
     <file value="D:\\temp\\AsyncTest.log"/> 
     <filter type="log4net.Filter.LevelRangeFilter"> 
      <levelMin value="DEBUG"/> 
      <levelMax value="FATAL"/> 
     </filter> 
     <appendToFile value="true"/> 
     <rollingStyle value="Size"/> 
     <maxSizeRollBackups value="10"/> 
     <maximumFileSize value="100MB"/> 
     <staticLogFileName value="true"/> 
     <datePattern value="yyyyMMdd"/> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="%d - %m%n"/> 
     </layout> 
    </appender> 

    <appender name="FileInfoAppenderS" type="log4net.Appender.RollingFileAppender"> 
     <file value="D:\\temp\\SyncTest.log"/> 
     <filter type="log4net.Filter.LevelRangeFilter"> 
      <levelMin value="DEBUG"/> 
      <levelMax value="FATAL"/> 
     </filter> 
     <appendToFile value="true"/> 
     <rollingStyle value="Size"/> 
     <maxSizeRollBackups value="10"/> 
     <maximumFileSize value="100MB"/> 
     <staticLogFileName value="true"/> 
     <datePattern value="yyyyMMdd"/> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="%d - %m%n"/> 
     </layout> 
    </appender> 

    <logger Name="Sync" additivity="false"> 
     <level value="INFO"/> 
     <appender-ref ref="FileInfoAppenderS"/> 
    </logger> 

    <logger Name="Async" additivity="false"> 
     <level value="INFO"/> 
     <appender-ref ref="FileInfoAppenderA"/> 
    </logger> 

</log4net> 
</configuration> 

Und Konsolenausgabe:

Logger: Async 
Appenders: FileInfoAppenderA 
Logger: Sync 
Appenders: FileInfoAppenderA 

Dateien erstellt wurden, aber beide sind leer. Wenn ich Appen in root angeben, wie:

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

dann Konsole:

log4net:ERROR [RollingFileAppender] Attempted to append to closed appender named [FileInfoAppenderS] 
Logger: Async 
Appenders: FileInfoAppenderA, FileInfoAppenderS 
Logger: Sync 
Appenders: FileInfoAppenderA, FileInfoAppenderS 

Und nur in AsyncTest.log:

2014-04-11 17:26:58,142 - started async 
2014-04-11 17:26:58,151 - started sync 

Was mache ich falsch?

UPD (2014.10.21): Mit neuesten log4net verfügbar über Nuget ich folgende Ausgabe der Konsole haben:

Logger: Async 
Appenders: FileInfoAppenderA 
Logger: Sync 
Appenders: FileInfoAppenderA 

Und beide Dateien (AsyncTest.log, SyncTest.log) sind leer.

UPD (08/4/2015): Lösung ist Kleinbuchstaben zu verwenden, wenn Sie die Attribute für alles im log4net-Bereich einstellen. Also, ich sollte nur geändert folgende Zeilen in app.config haben:

...... 
<logger name="Sync" additivity="false"> 
...... 
<logger name="Async" additivity="false"> 
...... 

Beachten Sie den Unterschied: Attribut ‚name‘ in Kleinbuchstaben ist.

+0

für die Lösung muss ich bis zum Ende Ihrer Frage lesen. Kleinschreibung. –

Antwort

13

Sie haben mehrere Tippfehler in Ihrem Beispiel. Erstens ist Sie nicht über die Konfigurations-Tag schließen, und warum bist du nur in einer Datei bekommen, ist, weil Sie rufen:

logger.Info("started async"); 

und nach, dass Sie überraschend tun:

logger.Info("started sync"); 

Sie werden nicht in die zweite Datei schreiben, weil Sie sich nicht einloggen.

Und in der Konsole ich aus dem Code erhalten:

Logger: Async 
Appenders: FileInfoAppenderS, FileInfoAppenderA 
Logger: Sync 
Appenders: FileInfoAppenderS, FileInfoAppenderA 

Für zukünftige Informationen, haben Sie richtig durch additivity auf false setzen, weil dies bedeutet, dass die Holzfäller nicht von Root-Logger erben.Wie über die Aussage:

möchte ich 2 Logger mit unterschiedlichen Dateiappen haben und jede beschränken in root-Logger

Ich verstehe es nicht zu schreiben. Wenn Sie möchten, dass Ihre Logger in diese Dateien schreiben, während der Root-Logger zum Beispiel einen Konsolenappender hat, entfernen Sie einfach die Additivität und sie schreiben in die Konsole und ihre eigenen Dateien. Auch getestet und es funktioniert sehr gut.

Ich habe Ihren Kommentar gelesen. Nun füge ich den Code, den ich verwende und bekommen, was Sie brauchen:

class Program 
{ 
    static void Main(string[] args) 
    { 
     log4net.Config.XmlConfigurator.Configure(); 

     ILog logger = LogManager.GetLogger("Async"); 
     logger.Info("started async"); 
     Console.WriteLine("Logger: {0}", (logger as log4net.Core.LogImpl).Logger.Name); 
     Console.WriteLine("Appenders: {0}", string.Join(", ", (logger as log4net.Core.LogImpl).Logger.Repository.GetAppenders().ToList().Select(appendr => appendr.Name))); 


     ILog logger2 = LogManager.GetLogger("Sync"); 
     logger2.Info("started sync"); 
     Console.WriteLine("Logger: {0}", (logger2 as log4net.Core.LogImpl).Logger.Name); 
     Console.WriteLine("Appenders: {0}", string.Join(", ", (logger2 as log4net.Core.LogImpl).Logger.Repository.GetAppenders().ToList().Select(appendr => appendr.Name))); 

     Console.ReadKey(); 
    } 
} 

Und die 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="FileInfoAppenderA" type="log4net.Appender.RollingFileAppender"> 
     <file value="C:\\temp\\AsyncTest.log"/> 
     <filter type="log4net.Filter.LevelRangeFilter"> 
     <levelMin value="DEBUG"/> 
     <levelMax value="FATAL"/> 
     </filter> 
     <appendToFile value="true"/> 
     <rollingStyle value="Size"/> 
     <maxSizeRollBackups value="10"/> 
     <maximumFileSize value="100MB"/> 
     <staticLogFileName value="true"/> 
     <datePattern value="yyyyMMdd"/> 
     <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%d - %m%n"/> 
     </layout> 
    </appender> 

     <appender name="FileInfoAppenderS" type="log4net.Appender.RollingFileAppender"> 
     <file value="C:\\temp\\SyncTest.log"/> 
     <filter type="log4net.Filter.LevelRangeFilter"> 
      <levelMin value="DEBUG"/> 
      <levelMax value="FATAL"/> 
     </filter> 
     <appendToFile value="true"/> 
     <rollingStyle value="Size"/> 
     <maxSizeRollBackups value="10"/> 
     <maximumFileSize value="100MB"/> 
     <staticLogFileName value="true"/> 
     <datePattern value="yyyyMMdd"/> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="%d - %m%n"/> 
     </layout> 
     </appender> 

    <root> 
     <level value="INFO"/> 
    </root> 

    <logger name="Sync" additivity="false"> 
     <level value="INFO"/> 
     <appender-ref ref="FileInfoAppenderS"/> 
    </logger> 

    <logger name="Async" additivity="false"> 
     <level value="INFO"/> 
     <appender-ref ref="FileInfoAppenderA"/> 
    </logger> 
    </log4net> 
</configuration> 

Log4net Version: 1.2.13.0 mit .NET 4.0 Sagen Sie mir bitte wenn du bekommst, was du willst.

+0

XMight, thx für die Wiedergabe. Tippfehler wirken sich nicht auf die Anwendung aus, nur mein Post (jedenfalls - behoben). Ich habe das Projekt aus dem Code, den ich vorher gepostet habe, neu erstellt und mit log4net 1.2.13.0 funktioniert es überhaupt nicht - beide Dateien sind leer (obwohl ich auf logger2.Info ("starte sync") umgestiegen bin;). Außerdem ist nur "FileInfoAppenderA" in beiden Loggern aufgelistet. Und um mein Ziel zu verdeutlichen: 1) brauche logger1 -> logge dich nur in asyng.log ein 2) brauche logger2 -> logge dich nur in sync.log ein. 3) Nicht logger1, nicht logger2 sollte sich anmelden root logger (was auch immer dort registriert ist) – LaoR

+0

schließlich habe ich, was war das Problem) Sie werden lachen) Siehst du den Unterschied zwischen meinem ' und deins '? Ja, es wurde nur Groß- und Kleinschreibung beachtet Attributname 'Name! = Name'. Aus diesem Grund loggen sich meine Logger nicht in die richtigen Dateien ein und beide waren leer. – LaoR

+0

Ich bin froh, dass Sie das Problem gefunden haben;) – XMight

0

Diese Konfiguration ist für mich gearbeitet:

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

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

...appenders 
</logger> 

Good Luck!