Log4net rodando el nombre de archivo diario con la fecha en el nombre del archivo

Respuestas:

103

En su archivo de configuración de Log4net, use el siguiente parámetro con RollingFileAppender:

<param name="DatePattern" value="dd.MM.yyyy'.log'" />
Mun
fuente
28
Parece que esto ha sido promovido a un elemento de configuración: <datePattern value = "dd.MM.yyyy'.log '" /> ¡Salud!
Longda
3
@mstaessen <preserveLogFileNameExtension value="true" />es la sintaxis correcta y esta es una gran respuesta. ¿Cómo ocurrió la pérdida, puedo preguntar?
Larry B
1
Si mal no recuerdo, fue así. Al inicio, log4net generaría el primer nombre de archivo en la secuencia continua. Detectaría que ese archivo ya existe y luego decidiría pasar al segundo archivo, pero cuando ese también ya existe, no decide hacerlo, sino que lo borra y sobrescribe todo en ese segundo archivo de registro. Se conoce por completo desapercibida hasta que necesite los registros de los plazos aclarado ...
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>
Nonkichi
fuente
1
Creo que debería resaltar el punto principal de qué parámetro para resolver el problema como lo hizo @Mun. Sin embargo, también voté a favor de su respuesta.
RDeveloper
1
Fue el elemento datePattern, junto con el elemento staticLogFileName (y tenga en cuenta el atributo de valor para el elemento de archivo) lo que funcionó para mí
Michhes
¡La respuesta completa!
Nagesh
32

Para un RollingLogFileAppender también necesita estos elementos y valores:

<rollingStyle value="Date" />
<staticLogFileName value="false" />
BobD
fuente
3
Esto funciona, pero agrega la fecha después de la extensión del archivo. Por ejemplo, obtengo archivos de registro como Error.log20111104: ¿Alguien conoce una forma de formatear el nombre del archivo un poco mejor?
LostNomad311
Aquí se explica cómo formatear mejor el nombre del archivo: stackoverflow.com/questions/615092/…
LostNomad311
¿Para qué se utiliza staticLogFileName? Solo quiero que el archivo de registro se transfiera a un nuevo nombre después de que termine el día. Quiero usar un monitor de registro que mire un específico cada vez.
Sun
22

Usando Log4Net 1.2.13 usamos los siguientes ajustes de configuración para permitir la fecha y hora en el nombre del archivo.

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

Que proporcionará archivos en la siguiente convención: logname-2015-04-17.txt

Con esto, generalmente es mejor tener lo siguiente para asegurarse de tener 1 registro por día.

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

Si el tamaño del archivo es una preocupación, lo siguiente permite 500 archivos de 5 MB de tamaño hasta que aparezca un nuevo día. CountDirection permite la numeración ascendente o descendente de archivos que ya no son actuales.

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

Terminé usando (tenga en cuenta el nombre de archivo '.log' y las comillas simples alrededor de '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" />

Esto me da:

myfilename_2015-09-22.log
myfilename_2015-09-23.log
.
.
Njal
fuente
preserveLogFileNameExtensionno funciona para versiones anteriores de log4net (por ejemplo, v1.2.10) como se describe aquí
Dmitry Karpenko
13

Probé todas las respuestas, pero siempre faltaba algo y no funcionaba como esperaba.

Luego experimenté un poco con las sugerencias dadas en cada respuesta y tuve éxito con la siguiente configuración:

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

El problema con otras combinaciones de parámetros era que el último archivo no tenía el patrón de tiempo, o que el patrón de tiempo se adjuntaba como lo .log20171215que creaba un nuevo tiempo de archivo (¡y un nuevo tipo de archivo! ) Cada día, o aparecían ambos problemas.

Ahora, con esta configuración, obtienes archivos como este:

LOG4NET_Sample_Activity-20171215.log

que es lo que quería.


Para resumir:

  • No ponga el patrón de fecha en el <file value=...atributo, simplemente defínalo en el datePattern.

  • Asegúrese de tener el atributo de preserveLogFileNameExtension valor establecido en true.

  • Asegúrese de tener el staticLogFileName valor configurado en false.

  • Establezca el valor del rollingStyleatributo en .Date

Mate
fuente
También puede establecer rollingStyle en Composite, que se muestra tanto en la fecha como en el tamaño.
Simon Tewsi
1
Funciona genial. También agregaría el resumen: asegúrese de tener el valor staticLogFileName establecido en falso
Randall Flagg
5

Para conservar la extensión del archivo:

<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>
Fourat
fuente
¿Por qué hay %date{yyyyMM}y value="ddMMyyyy" ? ¿Cuál es el patrón de fecha de vigencia?
Allan Ruin
Creo que datePattern es para el nombre del archivo pero% date {yyyyMM} es para el directorio principal (lo quería de esa manera)
Fourat
El atributo datePattern establece el período continuo para Date rollingStyle. Consulte logging.apache.org/log4net/release/config-examples.html en RollingFileAppender. "Por ejemplo, un patrón de fecha de" aaaaMMdd "aparecerá todos los días. Consulte System.Globalization.DateTimeFormatInfo para obtener una lista de patrones disponibles".
Ryan Buddicom
@rbuddicom sí, pero la pregunta es cómo conservar la extensión del archivo.
Fourat
Lo sé, Allan cuestionó el propósito de 'value = "ddMMyyyy"'. Su comentario "Creo que datePattern es para el nombre del archivo" es incorrecto en ese sentido.
Ryan Buddicom
0

La sección de configuración extendida en una respuesta anterior con

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

trabajos enumerados pero no tuve que usar

<staticLogFileName value="false" /> 

. Creo que RollingAppender debe (lógicamente) ignorar esa configuración ya que, por definición, el archivo se reconstruye cada día cuando la aplicación se reinicia / reutiliza. Quizás sea importante para la renovación inmediata CADA vez que se inicie la aplicación.

AllenM
fuente
Para mí, no funcionaría sin el <staticLogFileName value = "false" />
nurettin
yo también, tuve que establecer staticLogFileName en falso, de lo contrario no se registraría
oonyalo
0

Moví la configuración al código para permitir una fácil modificación desde CI usando la variable del sistema. Usé este código para el nombre del archivo y el resultado es '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);
Parag Bangad
fuente