2009-11-10 10 views
12

Aquí está la configuración de mi apéndice de mi app.config. Esto simplemente imprime la cadena literal en lugar de traducirla a la fecha (es decir, literalmente imprime "[INICIAR:% fecha {MM/dd/aH HH: mm}]").¿Cómo uso un patrón de fecha en un encabezado/pie de página?

<appender name="RollingLogFileAppender" 
      type="log4net.Appender.RollingFileAppender"> 
    <file value="C:\somelog" /> 
    <appendToFile value="true" /> 
    <rollingStyle value="Date" /> 
    <datePattern value="-yyyy-MM-dd'.txt'" /> 
    <layout type="log4net.Layout.PatternLayout"> 
    <header value="[START: %date{MM/dd/yy HH:mm} ]&#13;&#10;" /> 
    <conversionPattern value="%date{yyyy-MM-dd HH:mm:ss} - %message" /> 
    <footer value="[END]&#13;&#10;&#13;&#10;" /> 
    </layout> 
</appender> 

¿Cómo puedo hacer para imprimir la fecha/hora en el encabezado?

Respuesta

14

Una forma fácil de hacerlo es subclase log4net.Layout.PatternLayout y anule encabezado y pie de página. A continuación, puede añadir lo que quiera a su cabecera: sello de la fecha, nombre del equipo, nombre de usuario, la versión de montaje, o lo que su corazón desea:

using System; 
using log4net.Layout; 

namespace MyAssembly 
{ 
    class MyPatternLayout : PatternLayout 
    { 
     public override string Header 
     { 
      get 
      { 
       var dateString = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); 
       return string.Format("[START: {0} ]\r\n", dateString); 
      } 
     } 
    } 
} 

Incluir esta nueva clase en su montaje, y utilizar el nuevo tipo de su archivo, así:

<layout type="MyAssembly.MyPatternLayout"> 
    <conversionPattern value="%date{yyyy-MM-dd HH:mm:ss} - %message" /> 
</layout> 

Desde sustituimos encabezado y pie de página, que ni siquiera tiene que añadir aquí. El encabezado se agregará cada vez que se inicie la aplicación, y cada vez que el archivo se transfiera.

+0

¿Tiene alguna enlaces a ejemplos de la subclasificación de la clase PatternLayout? – User

+0

He agregado un ejemplo a la respuesta para usted. – pduncan

+0

¿Hay alguna manera de anular el encabezado de manera que use el atributo de valor del elemento del encabezado en la configuración xml, como lo hace la clase PatternLayout? – User

1

Encontré este problema y una solución rápida que utilicé es solo usar un encabezado y pie de página fijo. A continuación, hacer esto tan pronto como usted tiene el objeto de ILOG:

log.Info(string.Format("[START: {0} ]\r\n", dateString))

Así que justo debajo de la cabecera obtendrá la información que desea.

por ejemplo

===Start=== 
[START: 2012-02-23 12:12:12 ] 

logs... 
17

Respuesta de here.

<header value="[BEGIN LOGGING AT %date]%newline" type="log4net.Util.PatternString" /> 
<footer value="[END LOGGING AT %date]%newline" type="log4net.Util.PatternString" /> 

Funciona para mí como un encanto. No es necesario escribir un fragmento de código.

También en proyectos que suelen utilizar:

<header type="log4net.Util.PatternString" value="Our Application Name version %property{Assembly.Version}, .NET version %property{Runtime.Version}, %date ***%newline"/> 

Tome un vistazo a PatternString doc también.

También he notado que el archivo de registro no aparecerá hasta que escriba la primera declaración de registro.

+0

Acabo de probar esto y parece que estos patrones se resuelven tanto al inicio, lo que da como resultado un pie de página exactamente al mismo tiempo (diferencia de 2 ms) que en el encabezado. – sluki

+2

@sluki: use '' en lugar de 'PatternLayout' – Wizou

0

Construyendo en @Wizou's comentario. Consulte la documentación DynamicPatternLayout Class.

En realidad estoy usando esta diferencia de comportamiento a una hora de inicio y fin

Una diferencia importante entre PatternLayout y DynamicPatternLayout es el tratamiento de los parámetros Encabezado y pie en la configuración. Los parámetros de Encabezado y Pie de página para DynamicPatternLayout deben ser sintácticamente en forma de PatternString, pero no deben marcarse como tipo log4net.Util.PatternString. Si lo hace, el patrón se convertirá estáticamente en el momento de la configuración y hará que DynamicPatternLayout realice lo mismo que PatternLayout.

Ajuste del tipo en la cabecera para PatternString pero dejando de pie de página tan dinámico

<layout type="log4net.Layout.DynamicPatternLayout"> <param name="Header" value="%newline**** Trace Opened Local: %date{yyyy-MM-dd HH:mm:ss.fff} UTC: %utcdate{yyyy-MM-dd HH:mm:ss.fff} ****%newline" type="log4net.Util.PatternString" /> <param name="Footer" value="**** Trace Closed %date{yyyy-MM-dd HH:mm:ss.fff} ****%newline" /> </layout>

Cuestiones relacionadas