Log4net rolliert den täglichen Dateinamen mit dem Datum im Dateinamen


Antworten:


102

Verwenden Sie in Ihrer Log4net-Konfigurationsdatei den folgenden Parameter mit dem RollingFileAppender:

<param name="DatePattern" value="dd.MM.yyyy'.log'" />

27
Anscheinend wurde dies zu einem Konfigurationselement heraufgestuft: <datePattern value = "dd.MM.yyyy'.log '" /> Prost!
Longda

3
@mstaessen <preserveLogFileNameExtension value="true" />ist die richtige Syntax und dies ist eine großartige Antwort. Wie ist der Verlust entstanden, darf ich fragen?
Larry B

1
Wenn ich mich richtig erinnere, ging es so. Beim Start würde log4net den ersten Dateinamen in der fortlaufenden Sequenz generieren. Es würde erkennen, dass diese Datei bereits vorhanden ist, und dann entscheiden, in die zweite Datei zu rollen, aber wenn diese ebenfalls bereits existiert, entscheidet es sich nicht, zu rollen, sondern löscht sie und überschreibt alles in dieser zweiten Protokolldatei. Es geht völlig unbemerkt vorbei, bis Sie Protokolle des gelöschten Zeitrahmens benötigen ...
mstaessen

206
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
  <lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
  <file value="logs\" />
  <datePattern value="dd.MM.yyyy'.log'" />
  <staticLogFileName value="false" />
  <appendToFile value="true" />
  <rollingStyle value="Composite" />
  <maxSizeRollBackups value="10" />
  <maximumFileSize value="5MB" />
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
  </layout>
</appender>

Ich denke, Sie sollten den Hauptpunkt des Parameters hervorheben, um das Problem zu lösen, wie es @Mun getan hat. Ich habe jedoch auch für Ihre Antwort gestimmt.
RDeveloper

1
Es war das datePattern-Element in Verbindung mit dem staticLogFileName-Element (und beachten Sie das value-Attribut für das
Dateielement

Die vollständige Antwort!
Nagesh

32

Für einen RollingLogFileAppender benötigen Sie außerdem folgende Elemente und Werte:

<rollingStyle value="Date" />
<staticLogFileName value="false" />

3
Dies funktioniert, hängt jedoch das Datum nach der Dateierweiterung an. Zum Beispiel bekomme ich Protokolldateien wie Error.log20111104 - Kennt jemand eine Möglichkeit, den Dateinamen etwas besser zu formatieren?
LostNomad311

So formatieren Sie den Dateinamen besser: stackoverflow.com/questions/615092/…
LostNomad311

Wofür wird staticLogFileName verwendet? Ich möchte erst, dass die Protokolldatei nach Tagesende in einen neuen Namen umgewandelt wird. Ich möchte einen Protokollmonitor verwenden, der jedes Mal einen bestimmten betrachtet.
So

21

Mit Log4Net 1.2.13 verwenden wir die folgenden Konfigurationseinstellungen, um die Datums- und Uhrzeitangabe im Dateinamen zuzulassen.

<file type="log4net.Util.PatternString" value="E:/logname-%utcdate{yyyy-MM-dd}.txt" />

Welche Dateien in der folgenden Konvention bereitstellen: logname-2015-04-17.txt

Daher ist es normalerweise am besten, Folgendes zu haben, um sicherzustellen, dass Sie 1 Protokoll pro Tag halten.

<rollingStyle value="Date" />
<datePattern value="yyyyMMdd" />

Wenn die Dateigröße ein Problem darstellt, können im Folgenden 500 Dateien mit einer Größe von 5 MB verwendet werden, bis ein neuer Tag erscheint. CountDirection ermöglicht die aufsteigende oder absteigende Nummerierung von Dateien, die nicht mehr aktuell sind.

 <maxSizeRollBackups value="500" />
 <maximumFileSize value="5MB" />
 <rollingStyle value="Composite" />
 <datePattern value="yyyyMMdd" />
 <CountDirection value="1"/>
 <staticLogFileName value="true" />

18

Am Ende habe ich Folgendes verwendet (beachten Sie den Dateinamen '.log' und die einfachen Anführungszeichen um 'myfilename_'):

  <rollingStyle value="Date" />
  <datePattern value="'myfilename_'yyyy-MM-dd"/>
  <preserveLogFileNameExtension value="true" />
  <staticLogFileName value="false" />
  <file type="log4net.Util.PatternString" value="c:\\Logs\\.log" />

Das gibt mir:

myfilename_2015-09-22.log
myfilename_2015-09-23.log
.
.

preserveLogFileNameExtensionfunktioniert nicht für frühere Versionen von log4net (z. B. v1.2.10), wie hier
Dmitry Karpenko

13

Ich habe alle Antworten ausprobiert, aber es fehlte immer etwas und funktionierte nicht wie erwartet für mich.

Dann habe ich ein bisschen mit den Hinweisen in jeder Antwort experimentiert und war mit der folgenden Einstellung erfolgreich:

<appender name="RollingActivityLog" type="log4net.Appender.RollingFileAppender">
  <file type="log4net.Util.PatternString" value="C:\temp\LOG4NET_Sample_Activity.log" />
  <appendToFile value="true" />
  <rollingStyle value="Date" />
  <staticLogFileName value="false" />
  <preserveLogFileNameExtension value="true" />
  <datePattern value="-yyyyMMdd" />
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%date %-5level - %message%newline" />
  </layout>
</appender>

Das Problem mit anderen Parameterkombinationen war, dass die neueste Datei nicht über das Zeitmuster verfügte oder dass das Zeitmuster so angehängt wurde, dass .log20171215eine neue Dateizeit (und ein neuer Dateityp) erstellt wurde! jeden Tag ) - oder beide Probleme auftraten.

Mit dieser Einstellung erhalten Sie jetzt Dateien wie diese:

LOG4NET_Sample_Activity-20171215.log

Welches ist, was ich wollte.


Zusammenfassen:

  • Fügen Sie das Datumsmuster nicht in das <file value=...Attribut ein, sondern definieren Sie es einfach im datePattern.

  • Stellen Sie sicher, dass Sie das preserveLogFileNameExtension Wertattribut auf gesetzt haben true.

  • Stellen Sie sicher, dass Sie den staticLogFileName Wert auf eingestellt haben false.

  • Stellen Sie den AttributwertrollingStyle auf .Date


Sie können rollingStyle auch auf Composite setzen, das sowohl nach Datum als auch nach Größe rollt.
Simon Tewsi

1
Funktioniert super. Ich würde auch in der Zusammenfassung hinzufügen: Stellen Sie sicher, dass Sie den Wert staticLogFileName auf false gesetzt haben
Randall Flagg

5

So behalten Sie die Dateierweiterung bei:

<log4net>
    <root>
      <level value="DEBUG"/>
      <appender-ref ref="RollingLogFileAppender"/>
    </root>
    <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
      <file type="log4net.Util.PatternString" value="D:\\LogFolder\\%date{yyyyMM}\\SchT.log" />
      <appendToFile value="true" />
      <rollingStyle value="Date" />
      <maximumFileSize value="30MB" />
      <staticLogFileName value="true" />
      <preserveLogFileNameExtension value="true"/>
      <datePattern value="ddMMyyyy" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
      </layout>
    </appender>
  </log4net>

warum gibt es %date{yyyyMM}und value="ddMMyyyy" ? Welches ist das Datum des Inkrafttretens?
Allan Ruin

Ich denke, datePattern ist für den Dateinamen, aber% date {yyyyMM} ist für das übergeordnete Verzeichnis (ich wollte es so)
Fourat

Das Attribut datePattern legt die fortlaufende Periode für Date rollingStyle fest. Siehe logging.apache.org/log4net/release/config-examples.html unter RollingFileAppender. "Beispielsweise wird jeden Tag ein Datumsmuster von" yyyyMMdd "angezeigt. Eine Liste der verfügbaren Muster finden Sie unter System.Globalization.DateTimeFormatInfo."
Ryan Buddicom

@rbuddicom Ja, aber die Frage ist, wie die Dateierweiterung erhalten werden kann.
Fourat

Ich weiß, Allan hat den Zweck von 'value = "ddMMyyyy"' in Frage gestellt. Ihr Kommentar "Ich denke, datePattern ist für den Dateinamen" ist in dieser Hinsicht falsch.
Ryan Buddicom

0

Der erweiterte Konfigurationsabschnitt in einer vorherigen Antwort mit

 ...
 ...
 <rollingStyle value="Composite" />
 ...
 ...

aufgelistete Werke, aber ich musste nicht verwenden

<staticLogFileName value="false" /> 

. Ich denke, der RollingAppender muss diese Einstellung (logisch) ignorieren, da die Datei per Definition jeden Tag neu erstellt wird, wenn die Anwendung neu gestartet / wiederverwendet wird. Möglicherweise ist es für einen sofortigen Rollover jedes Mal wichtig, wenn die Anwendung gestartet wird.


Für mich würde es ohne den <staticLogFileName value = "false" />
nurettin

Ich musste auch staticLogFileName auf false setzen, sonst würde es nicht protokollieren
oonyalo

0

Ich habe die Konfiguration in den Code verschoben, um eine einfache Änderung von CI mithilfe der Systemvariablen zu ermöglichen. Ich habe diesen Code für den Dateinamen verwendet und das Ergebnis ist 'Log_03-23-2020.log'.

            log4net.Repository.ILoggerRepository repository = LogManager.GetRepository(Assembly.GetEntryAssembly());
            Hierarchy hierarchy = (Hierarchy)repository;
            PatternLayout patternLayout = new PatternLayout();
            patternLayout.ConversionPattern = "%date %level - %message%newline%exception";
            patternLayout.ActivateOptions();

            RollingFileAppender roller = new RollingFileAppender();
            roller.AppendToFile = true;
            roller.File = "Log_";
            roller.DatePattern = "MM-dd-yyyy'.log'";
            roller.Layout = patternLayout;
            roller.MaxFileSize = 1024*1024*10;
            roller.MaxSizeRollBackups = 10;
            roller.StaticLogFileName = false;
            roller.RollingStyle = RollingFileAppender.RollingMode.Composite;
            roller.ActivateOptions();
            hierarchy.Root.AddAppender(roller);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.