2010-10-18 8 views
6

¿Es posible crear un logLnet PatternLayoutConverter personalizado que permita configurar un valor de "índice"? Yo sé de la cadena "propiedad" de conversión que le permite escribir código como este:Propiedad de log4net personalizada PatternLayoutConverter (con índice)

ThreadContext.Properties["ID"] = yourID; 

y especificar la siguiente manera:

%property{ID} 

Que el valor debe ser incluido en la salida.

¿Qué sucede si los valores que deseo registrar están en algún otro "diccionario"? Supongo que podría escribir algo de lógica para copiar esos valores del diccionario a uno de los contextos de log4net y luego usar el token incorporado %property. ¿Qué ocurre si quiero que log4net registre los valores directamente desde mi propio "diccionario" en función de un valor de índice especificado en el archivo de configuración?

¿Puedo escribir mi propio PatternLayoutConverter que permitiría que configure algo como esto:

%myproperty{ID} 

y luego tire el valor correspondiente "ID" de mi propia "diccionario"?

Para cualquier persona que esté interesada, es bastante fácil de hacer lo mismo con Nlog:

[LayoutRenderer("MyGDC")] 
    class GdcLayoutRenderer : LayoutRenderer 
    { 
    [RequiredParameter] 
    [DefaultParameter] 
    public string Item { get; set; } 

    protected override void Append(StringBuilder builder, LogEventInfo logEvent) 
    { 
     string msg = GDC.Get(this.Item); 
     builder.Append(msg); 
    } 

    protected override int GetEstimatedBufferSize(LogEventInfo logEvent) 
    { 
     return 10; 
    } 
    } 

y configurado de esta manera:

Dile Nlog sobre cualquier ensamblado con extensiones:

<extensions> 
    <add assembly="NLog.Extensions"/> 
    </extensions> 

Utilice la propiedad "indexada" en un diseño:

En este ejemplo estoy usando el objeto GDC de NLog como mi "diccionario", pero estoy demostrando cómo pude escribir mi propio LayoutRenderer "indexable" (más o menos equivalente al PatternLayoutConverter de log4net) para acceder a un valor indexado por un valor en el archivo de configuración.

[EDITAR] Obtuve la respuesta que quería. He incluido el código para mi muestra PatternLayoutRenderer aquí. En mi prueba, tengo un diccionario estático en mi clase de formulario principal donde podía almacenar "configuraciones de la aplicación". Creé un PatternLayoutConverter que puede aceptar una clave como parámetro para que el convertidor pueda buscar el valor correcto en el diccionario. Podría ser capaz de lograr la misma funcionalidad usando los objetos de contexto log4net (o NLog), pero en nuestra aplicación podríamos tener algunas configuraciones o información de sesión que la aplicación mantendrá para otros fines y queremos poder agregar eso a la salida de registro. Dado que ya estará en una estructura de búsqueda, sería bueno poder hacer referencia directamente a los datos en lugar de tener que copiarlos explícitamente a log4net (o contexto NLog).

De todos modos, aquí está el código:

namespace Log4NetTest 
{ 
    class KeyLookupPatternConverter : PatternLayoutConverter 
    { 
    protected override void Convert(System.IO.TextWriter writer, LoggingEvent loggingEvent) 
    { 
     //Use the value in Option as a key into the "application settings" stored on the main form. 
     string setting; 
     if (Form1.AppSettings.TryGetValue(Option, out setting)) 
     { 
     writer.Write(setting); 
     } 
    } 
    } 
} 

configuración de diseño:

//Log the "sessionid" and "userid" values from our "application settings" object 
    <layout type="log4net.Layout.PatternLayout"> 
    <param name="ConversionPattern" value="%d [%t] %-5p [session = %KLPC{sessionid}] [user = %KLPC{userid}] %m%n"/> 
    <converter> 
     <name value="KLPC" /> 
     <type value="Log4NetTest.KeyLookupPatternConverter" /> 
    </converter> 
    </layout> 

Respuesta

4

no lo probé, pero esto debería funcionar.En log4net puede pasar una cadena de opciones a un convertidor patrón de esta manera:

%converterName{converterOptions} 

El convertidor patrón de fecha, por ejemplo, se puede utilizar la siguiente manera:

%date{HH:mm:ss,fff} 

Esto significa que puede escribir su convertidor patrón de la forma en que sugirió Un ejemplo simple para un convertidor de este tipo se puede encontrar en here.

En el método Convert puede acceder a la cadena de propiedades con la propiedad 'Opción' (definida en la clase PatternConverter) y usar el contexto de subprocesos para obtener la entrada deseada del diccionario. También puede implementar la interfaz IOptionHandler si sus opciones consisten en más que solo la clave del diccionario: de esta manera puede analizar las opciones al activar la configuración de log4net.

+0

Gracias! Eso hizo exactamente lo que yo quería hacer. Agregaré mi prueba LayoutPatternConverter a mi pregunta para referencia en caso de que alguien más esté interesado. – wageoghe

Cuestiones relacionadas