Propiedad log4net personalizada PatternLayoutConverter (con índice)

¿Es posible crear un PatternLayoutConverter personalizado de log4net que permita configurar un valor de "índice"? Sé acerca de la cadena de conversión de "propiedad" que le permite escribir código como este:

ThreadContext.Properties["ID"] = yourID;

Y especifique así:

%property{ID} 

Que el valor debe incluirse 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 log4net y luego simplemente usar el incorporado%property simbólico. ¿Qué sucede si deseo que log4net registre los valores directamente desde mi propio "diccionario" basado en un valor de índice especificado en el archivo de configuración?

¿Puedo escribir mi propio PatternLayoutConverter que me permita configurar algo como esto:

%myproperty{ID}

¿Y luego extraer el valor de "ID" correspondiente de mi propio "diccionario"?

Para cualquiera que esté interesado, es bastante fácil 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 así:

Informe a NLog sobre cualquier ensamblaje con extensiones:

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

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

  <layout="${longdate} | ${MyGDC:item=name} | ${message}"/>

En este ejemplo, en realidad 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] Recibí la respuesta que quería. He incluido el código de mi PatternLayoutRenderer de muestra aquí. En mi prueba, tengo un diccionario estático en mi clase de formulario principal donde podría almacenar la "configuración de la aplicación". He creado un PatternLayoutConverter que puede aceptar una clave como parámetro para que el convertidor pueda buscar el valor correcto en el diccionario. Es posible que pueda 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 al salida de registro. Dado que ya estará en una estructura de búsqueda, sería bueno poder hacer referencia a los datos directamente 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>

Respuestas a la pregunta(1)

Su respuesta a la pregunta