Log4net rolling daily filename con data nel nome del file


Risposte:


103

Nel file di configurazione di Log4net, utilizza il seguente parametro con RollingFileAppender:

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

28
Sembra che questo sia stato promosso a un elemento di configurazione: <datePattern value = "dd.MM.yyyy'.log '" /> Cheers!
longda

3
@mstaessen <preserveLogFileNameExtension value="true" />è la sintassi corretta e questa è un'ottima risposta. Come si è verificata la perdita, posso chiedere?
Larry B

1
Se ricordo bene, è andata così. All'avvio, log4net genera il primo nome di file nella sequenza continua. Rileva che quel file esiste già e quindi decide di passare al secondo file, ma quando anche quello esiste già, non decide di eseguire il roll ma lo cancella e sovrascrive tutto in quel secondo file di registro. Passa totalmente inosservato fino a quando non hai bisogno dei registri del periodo di tempo cancellato ...
mstaessen

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

1
Penso che dovresti evidenziare il punto principale di quale parametro per risolvere il problema come ha fatto @Mun. Tuttavia, ho anche votato a favore della tua risposta.
RDeveloper

1
È stato l'elemento datePattern, in combinazione con l'elemento staticLogFileName (e nota l'attributo value per l'elemento file) che ha funzionato per me
Michhes

La risposta completa!
Nagesh,

32

Per un RollingLogFileAppender sono necessari anche questi elementi e valori:

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

3
Funziona, ma aggiunge la data dopo l'estensione del file. Ad esempio, ottengo file di registro come Error.log20111104 - Qualcuno conosce un modo per formattare un po 'meglio il nome del file?
LostNomad311

Ecco come formattare il nome del file meglio: stackoverflow.com/questions/615092/...
LostNomad311

a cosa serve staticLogFileName? Voglio solo che il file di registro venga inserito in un nuovo nome al termine della giornata. Voglio utilizzare un monitor di registro che esamini uno specifico ogni volta.
domenica

22

Utilizzando Log4Net 1.2.13 utilizziamo le seguenti impostazioni di configurazione per consentire la data e l'ora nel nome del file.

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

Che fornirà i file nella seguente convenzione: logname-2015-04-17.txt

Con questo di solito è meglio avere quanto segue per assicurarti di tenere 1 registro al giorno.

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

Se la dimensione del file è un problema, quanto segue consente 500 file di 5 MB di dimensione fino a quando non viene generato un nuovo giorno. CountDirection consente la numerazione crescente o decrescente dei file che non sono più correnti.

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

18

Ho finito per usare (nota il nome del file ".log" e le virgolette singole attorno a "nomefile_"):

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

Questo mi dà:

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

preserveLogFileNameExtensionnon funziona per le versioni precedenti di log4net (ad es. v1.2.10) come descritto qui
Dmitry Karpenko

13

Ho provato tutte le risposte, ma c'era sempre qualcosa che mancava e non funzionava come previsto per me.

Quindi ho sperimentato un po 'con i suggerimenti forniti in ciascuna risposta e ho avuto successo con la seguente impostazione:

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

Il problema con altre combinazioni di parametri era che il file più recente non aveva lo schema temporale o che lo schema temporale veniva aggiunto in modo da .log20171215creare una nuova ora del file (e un nuovo tipo di file! ) Ogni giorno - o entrambi i problemi apparivano.

Ora con questa impostazione stai ottenendo file come questo:

LOG4NET_Sample_Activity-20171215.log

che è quello che volevo.


Riassumere:

  • Non inserire il modello di data <file value=...nell'attributo, definiscilo semplicemente nel file datePattern.

  • Assicurati di avere l' attributo preserveLogFileNameExtension value impostato su true.

  • Assicurati di avere il staticLogFileName valore impostato su false.

  • Imposta il valorerollingStyle dell'attributo su .Date


Puoi anche impostare rollingStyle su Composite, che si basa sia sulla data che sulla dimensione.
Simon Tewsi

1
Funziona alla grande. Vorrei anche aggiungere nel riepilogo: assicurati di avere il valore staticLogFileName impostato su false
Randall Flagg

5

Per preservare l'estensione del file:

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

perché ci sono %date{yyyyMM}e value="ddMMyyyy" ? qual è lo schema della data di validità?
Allan Ruin

Penso che datePattern sia per il nome del file ma% date {yyyyMM} è per la directory principale (volevo che fosse così)
Fourat

L'attributo datePattern imposta il periodo di rotazione per Date rollingStyle. Vedere logging.apache.org/log4net/release/config-examples.html sotto RollingFileAppender. "Ad esempio, un modello di data" aaaaMMgg "verrà eseguito ogni giorno. Consulta System.Globalization.DateTimeFormatInfo per un elenco dei modelli disponibili."
Ryan Buddicom

@ rbuddicom sì, ma la domanda è su come preservare l'estensione del file.
Fourat

Lo so, Allan ha messo in dubbio lo scopo di "value =" ddMMyyyy "". Il tuo commento "Penso che datePattern sia per il nome del file" non è corretto al riguardo.
Ryan Buddicom

0

La sezione di configurazione estesa in una risposta precedente con

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

elencato funziona ma non ho dovuto usare

<staticLogFileName value="false" /> 

. Penso che RollingAppender debba (logicamente) ignorare tale impostazione poiché per definizione il file viene ricostruito ogni giorno quando l'applicazione viene riavviata / riutilizzata. Forse è importante per il rollover immediato OGNI volta che l'applicazione viene avviata.


Per me, non funzionerebbe senza <staticLogFileName value = "false" />
nurettin

anche io, ho dovuto impostare staticLogFileName su false altrimenti non sarebbe stato registrato
oonyalo

0

Ho spostato la configurazione nel codice per consentire una facile modifica da CI utilizzando la variabile di sistema. Ho usato questo codice per il nome del file e il risultato è "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);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.