¿Por qué la fecha se adjunta dos veces en los nombres de archivo cuando se usa Log4Net?

StackOverflow https://stackoverflow.com/questions/579688

  •  06-09-2019
  •  | 
  •  

Pregunta

Estaba tratando de agregar la fecha a mi nombre de archivo de registro y pude hacer que funcionara siguiendo las pocas sugerencias que he encontrado en StackOverflow. Todo funciona bien, pero por alguna razón, el primer archivo siempre tiene la fecha agregada dos veces.

Por ejemplo, en lugar de log.2009-02-23.log, Yo obtengo log.2009-02-23.log.2009-02-23.log.

Lo encontré tan extraño y para su información, este es un código muy simple. No es como si lo tuviera ejecutando en un entorno múltiple.

Mi configuración log4net:

<log4net>
<appender name="MyLog" type="log4net.Appender.RollingFileAppender">
    <file value="../../Logs/Mylog"/>
    <staticLogFileName value="false" />
    <appendToFile value="true"/>
    <rollingStyle value="Date"/>
    <datePattern value=".yyyy-MM-dd.lo\g" />
    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%d{DATE} [%t] %-5p %c - %m%n"/>
    </layout>
</appender>
<root>
    <level value="INFO"/>
    <appender-ref ref="MyLog"/>
</root>
</log4net>

¿Alguna idea por qué?

Editar: quiero agregar la información sobre el entorno en el que estoy probando esto.
- ASP.NET
- .NET Framework 2.0
- Windows Server 2003 Pack de servicio de 64 bits 2
- Log4net 1.2.10

¿Fue útil?

Solución 2

Es un problema de permiso. Al menos eso es lo que me está pasando.

Soy nuevo en usar log4net, así que no sabía que tiene registro interno, pero lo encontré, así que intenté girar registro interno en. No estaba muy seguro de lo que está diciendo, pero así es lo que me parece, está haciendo: 1. Agregue la fecha al nombre del archivo. 2. Intente acceder al archivo para escribirle (fallido). 3. Agregue la fecha al nombre del archivo otra vez. 4. Acceda correctamente al archivo (que tiene el nombre de archivo extraño ahora)

Antes de saber esto, estaba en Google para la solución a este problema con palabras clave como lo que tengo como título en esta pregunta de StackOverflow. No había tanta información por ahí. Encontré tal vez un tipo que le dijo que le sucede a algunas personas, pero nunca explicó por qué ni la solución. Con esta nueva información (+el mensaje de error interno de log4net), estaba buscando diferentes hilos de los motores de búsqueda. Con eso encontré pistas de que podría ser un problema de permiso.

Parece que la aplicación de escritura no tiene suficiente permiso para la carpeta de registros. La identidad predeterminada de la aplicación suele ser Network_Service. Después de dar más permiso (le di todo el control, pero no sé cuál es el mínimo para que funcione) a la carpeta, funciona bien.

Si alguien puede explicar esto mejor que yo, no dude en editar.

Otros consejos

Esto sucede si hay un problema para acceder al archivo de registro cuando inicializa el sistema de registro. Puede suceder si inicializa el sistema de registro dos veces, si ejecuta su programa mientras otra copia se ejecuta y escribe en el archivo de registro, o si está editando el archivo de registro en un editor de texto. Básicamente, cualquier cosa que cause un bloqueo de escritura en el archivo de registro cuando se ejecuta log4net init.

Verifique su código para obtener llamadas duplicadas al init de Log4Net: tal vez se está inicializando en un constructor en lugar de en el constructor estático de un singleton o init global, por ejemplo.

Esto también puede suceder si se está ejecutando en una configuración de 'jardín web' y no incluye el PID en el nombre de archivo, porque cada proceso de servidor web diferente intenta escribir en el mismo archivo. Si usa los jardines web y la escritura a los archivos, agregue el PID al patrón de nombre de archivo para que cada proceso de servidor obtenga su propio archivo.

I run into the same problem. For me, it was a combination of using RollingFileAppender for my test logs, and running my NUnit tests with ReSharper.

It turns out that ReSharper uses two processes to run the tests:

2 TaskRunners

which creates a race condition on the log file.

Now, if we change the log file name to include the process id:

<appender name="MyLog" type="log4net.Appender.RollingFileAppender">
  <file type="log4net.Util.PatternString" value="MyLog.pid.%processid" />
  <appendToFile value="true" />
  <rollingStyle value="Composite" />
  <maxSizeRollBackups value="10" />
  <maximumFileSize value="10MB" />
  <staticLogFileName value="false"/>
  <datePattern value="_yyyy-MM-dd'.log'"/>
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%d{HH:mm:ss.fff} [%15.15t] %-5p '%40.40c' - %m%n" />
  </layout>
</appender>

the problem is solved. Each file gets its own, unique name:

MyLog.pid.5440_2010-10-13.log
MyLog.pid.1496_2010-10-13.log

Note the use of PatternString for 'type'.

Hope that helps.

As olle pointed out. your problem is related to the '\g', which your log4net is interpreting as another dateformat. Try deleting the ".yyyy-MM-dd.lo\g" and replacing it with "yyyy-MM-dd"

The ".log" doesn't belong in the dateformat

I use the following:

<param name="DatePattern" value="yyyy.MM.dd.\l\o\g"/>

With this I get filenames like: 2009.02.23.log

try <datePattern value=".yyyy-MM-dd.lo\g" /> I don't understand what the \g is for.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top