Konfigurieren Sie Log4net so, dass in mehrere Dateien geschrieben wird

130

Ich möchte ein Protokoll aus demselben Prozess in zwei verschiedene Protokolldateien schreiben.

ist das mit log4net möglich?

Ich muss separate Nachrichten in jede Protokolldatei schreiben. Wie kann ich eine Nachricht an einen bestimmten Appender schreiben?

ofer
quelle
3
Sie können sich nicht bei separaten Appendern anmelden. Sie müssen verschiedene Logger konfigurieren und jedem den entsprechenden Appender zuordnen. Protokollieren Sie dann verschiedene Nachrichten an die verschiedenen Logger.
Vinay Sajip
So habe ich es mit Code-as-Configuration gemacht: stackoverflow.com/questions/27846157/…
Jay Sullivan

Antworten:

82

Ja, fügen Sie Ihrem Logger einfach mehrere FileAppender hinzu. Beispielsweise:

<log4net>
    <appender name="File1Appender" type="log4net.Appender.FileAppender">
        <file value="log-file-1.txt" />
        <appendToFile value="true" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date %message%newline" />
        </layout>
    </appender>
    <appender name="File2Appender" type="log4net.Appender.FileAppender">
        <file value="log-file-2.txt" />
        <appendToFile value="true" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date %message%newline" />
        </layout>
    </appender>

    <root>
        <level value="DEBUG" />
        <appender-ref ref="File1Appender" />
        <appender-ref ref="File2Appender" />
    </root>
</log4net>
Vinay Sajip
quelle
5
Schön .. :) Ich muss jedoch separate Nachrichten in jede Protokolldatei schreiben. Wie kann ich eine Nachricht an einen bestimmten Appender schreiben? Vielen Dank. ofer
ofer
2
@ ofer- siehe meine Antwort dazu.
RichardOD
1
Was ist, wenn File1Appender DEBUG-Fehler und File2Appender ERROR-Fehler protokollieren soll?
JsonStatham
Ich versuche ähnliche Dinge zu erreichen. Würde mich freuen, wenn Sie meine Frage beantworten können: stackoverflow.com/questions/24886364/…
Ashish Charan
202

Diese Antworten waren hilfreich, aber ich wollte meine Antwort sowohl mit dem Teil app.config als auch mit dem Teil c # code teilen, damit für die nächste Person weniger geraten wird.

<log4net>
  <appender name="SomeName" type="log4net.Appender.RollingFileAppender">
    <file value="c:/Console.txt" />
    <appendToFile value="true" />
    <rollingStyle value="Composite" />
    <datePattern value="yyyyMMdd" />
    <maxSizeRollBackups value="10" />
    <maximumFileSize value="1MB" />
  </appender>
  <appender name="Summary" type="log4net.Appender.FileAppender">
    <file value="SummaryFile.log" />
    <appendToFile value="true" />
  </appender>
  <root>
    <level value="ALL" />
    <appender-ref ref="SomeName" />
  </root>
  <logger additivity="false" name="Summary">
    <level value="DEBUG"/>
    <appender-ref ref="Summary" />
  </logger>
</log4net>

Dann im Code:

ILog Log = LogManager.GetLogger("SomeName");
ILog SummaryLog = LogManager.GetLogger("Summary");
Log.DebugFormat("Processing");
SummaryLog.DebugFormat("Processing2"));

Hier enthält c: /Console.txt "Processing" ... und \ SummaryFile.log "Processing2".

Gary
quelle
57
Ich wollte nur auf das Attribut additivity = "false" im Logger aufmerksam machen, das verhindert, dass alles im Stammverzeichnis protokolliert wird.
Jason Hernandez
1
Dies ist ein großartiges Beispiel für die Leistungsfähigkeit von log4net. Vielen Dank!
Crush
5
Die obige Konfiguration fehlt <layout> ... </layout>, ohne sie habe ich keine Meldungen in der Protokolldatei gesehen.
CrnaStena
@CrnaStena Sind Sie sicher, dass dies die einzige Änderung ist, die Sie vorgenommen haben?
Gary
1
@Craig Siehe diese Frage für weitere Informationen zur Verwendung: stackoverflow.com/questions/1999382/…
Gary
60

Vinay ist richtig. Als Antwort auf Ihren Kommentar in seiner Antwort können Sie dies folgendermaßen tun:

<root>
    <level value="ALL" />
    <appender-ref ref="File1Appender" />
</root>
<logger name="SomeName">
    <level value="ALL" />
    <appender-ref ref="File1Appender2" />
</logger>

So habe ich es in der Vergangenheit gemacht. Dann so etwas für das andere Protokoll:

private static readonly ILog otherLog = LogManager.GetLogger("SomeName");

Und Sie können Ihren normalen Logger wie folgt erhalten:

private static readonly ILog log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);

Lesen Sie den Abschnitt Logger und Appender in der Dokumentation, um zu verstehen, wie dies funktioniert.

RichardOD
quelle
3
Ich habe das gleiche Setup in einer meiner Apps und es funktioniert nicht für mich :(
Román
1
Diese Diskussion ist sehr alt ... hoffe, Sie können antworten ... Ich habe Ihren Ansatz versucht, aber die beiden Logger protokollieren die gleichen Nachrichten. Wie in log.Info ("") und otherLog.Info ("") schreiben Sie gleichzeitig Nachrichten in beide Protokolldateien.
SutharMonil
1
@daniel_aren Ja, ich habe den Appender-Block verwendet, um zwei Appender mit separaten Dateipfaden zu erstellen (genau wie der über diesem). Wir haben also zwei Appender-Blöcke mit Namen: fileappender1 und fileappender2 ... .
SutharMonil
1
@SutharMonil fügt dem Logger-Knoten einfach 'additivity = "false" hinzu, wie von Gary beantwortet und von Jason Hernandez hervorgehoben. In diesem Fall werden weiterhin alle Nachrichten im Stammverzeichnis abgelegt, aber nur Nachrichten von otherLog.Info ("") werden in File1Appender2
Freedomn-M
Mit Abstand die genaueste Antwort.
Fabricio
41

Ich wollte alle Nachrichten im Root-Logger protokollieren und ein separates Protokoll mit Fehlern haben. So geht's:

<log4net>
    <appender name="FileAppender" type="log4net.Appender.FileAppender">
        <file value="allMessages.log" />
        <appendToFile value="true" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date  %-5level %logger  - %message%newline" />
        </layout>
    </appender>

    <appender name="ErrorsFileAppender" type="log4net.Appender.FileAppender">
        <file value="errorsLog.log" />
        <appendToFile value="true" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date  %-5level %logger  - %message%newline" />
        </layout>
        <filter type="log4net.Filter.LevelRangeFilter">
            <levelMin value="ERROR" />
            <levelMax value="FATAL" />
        </filter>
    </appender>

    <root>
        <level value="ALL" />
        <appender-ref ref="FileAppender" />
        <appender-ref ref="ErrorsFileAppender" />
    </root>
</log4net>

Beachten Sie die Verwendung des Filterelements.

Valentin Kuzub
quelle
0

Verwenden Sie die folgende XML-Konfiguration, um Protokolle in zwei oder mehr Dateien zu konfigurieren.

<log4net>
    <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
      <file value="logs\log.txt" />         
      <appendToFile value="true" /> 
      <rollingStyle value="Size" />
      <maxSizeRollBackups value="10" />
      <maximumFileSize value="10MB" />
      <staticLogFileName value="true" />
      <layout type="log4net.Layout.PatternLayout">           
        <conversionPattern value="%date [%thread] %level %logger - %message%newline" />
      </layout>
    </appender>
     <appender name="RollingLogFileAppender2" type="log4net.Appender.RollingFileAppender">
      <file value="logs\log1.txt" />         
      <appendToFile value="true" /> 
      <rollingStyle value="Size" />
      <maxSizeRollBackups value="10" />
      <maximumFileSize value="10MB" />
      <staticLogFileName value="true" />
      <layout type="log4net.Layout.PatternLayout">        
        <conversionPattern value="%date [%thread] %level %logger - %message%newline" />
      </layout>
    </appender>
    <root>
      <level value="All" />
      <appender-ref ref="RollingLogFileAppender" />
    </root>
     <logger additivity="false" name="RollingLogFileAppender2">
    <level value="All"/>
    <appender-ref ref="RollingLogFileAppender2" />
    </logger>
  </log4net>

Die obige XML-Konfiguration meldet sich in zwei verschiedenen Dateien an.

Um eine bestimmte Instanz des Loggers programmgesteuert abzurufen,

ILog logger = log4net.LogManager.GetLogger ("RollingLogFileAppender2");

Sie können zwei oder mehr Appender-Elemente innerhalb des log4net-Stammelements anhängen, um sich in mehreren Dateien anzumelden.

Weitere Informationen zur obigen XML-Konfigurationsstruktur oder zu dem für Ihre Anwendung am besten geeigneten Appender finden Sie unter dem folgenden Link.

https://logging.apache.org/log4net/release/manual/configuration.html https://logging.apache.org/log4net/release/sdk/index.html

Hoffe das wird helfen.

Rakesh Chaudhari
quelle