2009-02-23 9 views
20

Estaba intentando 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 anexada dos veces.¿Por qué se agrega la fecha dos veces en los nombres de archivo cuando se usa Log4Net?

Por ejemplo, en lugar de log.2009-02-23.log, me sale log.2009-02-23.log.2009-02-23.log.

Lo encontré tan raro y fyi, este es un código muy simple. No es como si lo tuviera funcionando en un entorno de subprocesos múltiples.

Mi log4net config:

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

Cualquier idea por qué? .

Editar: Quiero añadir la información sobre el medio ambiente que estoy probando esto en
- asp.net
- .NET Framework 2.0
- servidor de Windows 2003 de 64 bits Service Pack 2
- log4net 1.2.10

Respuesta

5

es un problema de permisos. Al menos eso es lo que me está sucediendo.

Soy nuevo en el uso de Log4Net, así que no sabía que tenía un registro interno, pero lo encontré, así que intenté activar internal logging. No estaba muy seguro de lo que está diciendo, pero esto es lo que me parece que está haciendo: 1. Agregue la fecha al nombre del archivo. 2. Intente acceder al archivo para escribir en él (error). 3. Agregue la fecha al nombre de archivo nuevamente. 4. Acceda al archivo con éxito (que ahora tiene el nombre de archivo raro)

Antes de saber esto, estaba buscando la solución a este problema con palabras clave como lo que tengo como título en esta pregunta de stackoverflow. No había mucha información por ahí. Encontré tal vez a un tipo que dijo que le pasa a algunas personas, pero nunca explicó realmente por qué ni la solución. Con esta nueva información (+ el mensaje de error interno de Log4Net), estaba viendo diferentes hilos de los motores de búsqueda. Con eso encontré indicios 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 el control total 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 editarlo.

+0

Control total permite al usuario cambiar el conjunto de permisos en un archivo, tomar posesión del archivo y realizar acciones permitidas por todos los otros permisos de archivo . – graffic

0

try <datePattern value=".yyyy-MM-dd.lo\g" /> No entiendo para qué sirve \ g.

+1

datePattern tag acepta cadena con formato de fecha y hora como valor. "g" es un patrón de formato de fecha y hora válido (google DateTimeFormatInfo) así que tengo que "escapar" para que no se interprete. –

+0

me puede decir más acerca de la versión de log4net que está utilizando y el resto de su entorno (sistema operativo, versión de .net, etc.). Nunca he tenido problemas para tener que escapar del registro g. – olle

+0

- Windows Server 2003 x64 Service Pack 2 - .NET Framework 2.0 - log4net 1.2.10 Acerca de tener que escapar de la g, mira mi comentario para devinb. –

1

Como señaló Olle. su problema está relacionado con '\ g', que su log4net está interpretando como otro formato de fecha. Intente eliminar el ".yyyy-MM-dd.lo \ g" y reemplazándolo con "aaaa-MM-dd"

El ".log" no pertenece en el dateformat

+0

Si no coloco el ".log", obtendré nombres de archivos como este: "log.2009-02-23" sin extensión o puede decir, la fecha es la extensión. Quiero acceder a la carpeta de registros desde el navegador, así que necesitaba agregar ".log" a la lista de tipos MIME de la carpeta en IIS. –

+0

¿Lo ha probado sin el ".lo \ g" y simplemente ".log" para ver si el problema es "\"? – DevinB

+0

también, el "." al principio. – DevinB

1

utilizo el siguiente:

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

Con este recibo nombres de archivo como: 2009.02.23.log

+0

Realmente no necesitas para escapar de la l y la o, pero no creo que solucione mi problema. –

10

Esto ocurre si hay un problema al 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 se está ejecutando otra copia y está escribiendo en el archivo de registro, o si está editando el archivo de registro en un editor de texto. Básicamente cualquier cosa que provoque un bloqueo de escritura en el archivo de registro cuando se ejecuta log4net init.

Revise su código para llamadas duplicadas a log4net init - quizás esté inicializando en un constructor en lugar de en un constructor estático o init global, por ejemplo.

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

1

Me encuentro con el mismo problema. Para mí, fue una combinación de usar RollingFileAppender para mis registros de prueba y ejecutar mis pruebas de NUnit con ReSharper.

Resulta que ReSharper utiliza dos procesos para ejecutar las pruebas:

2 TaskRunners

que crea una condición de carrera en el archivo de registro.

Ahora, si cambiamos el nombre de archivo de registro para incluir el identificador de proceso:

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

se resuelve el problema. Cada archivo tiene su propio nombre único:

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

Nota el uso de PatternString para 'tipo'.

Espero que ayude.

Cuestiones relacionadas