2010-01-16 8 views
24

Estoy tratando de crear una solución de registro que implique múltiples procesos en varias máquinas. Planeé usar UDPAppender para enviar todos los mensajes de registro a una sola máquina que los administraría. Tengo algunas preguntas sobre patternstrings vs patternlayouts.log4net información de identificación de proceso

Como necesito saber qué máquina y de qué proceso proviene ese mensaje de registro, también quiero incluirlo en el registro. Encontré% property {log4net: HostName} para nombre de host, y eso funciona muy bien. Sin embargo, no veo nada para la identificación del proceso en PatternLayouts. Sí, claro, veo algo así en PatternString. Desde el FAQ:

<appender name="LogFileAppender" type="log4net.Appender.FileAppender"> 
    <file type="log4net.Util.PatternString" value="log-file-[%processid].txt" /> 

    <layout type="log4net.Layout.PatternLayout" value="%date [%thread] %-5level %logger - %message%newline" /> 
</appender> 

Pero no estoy seguro de si o cómo mezclar y combinar los dos (o incluso si esta es la forma canónica para hacerlo).

Por lo tanto, mis preguntas son:

  1. ¿Cuál es la diferencia entre PatternString y PatternLayout? ¿Por qué ambos?

  2. Veo el% processid en PatternString, ¿cómo obtengo lo mismo en PatternLayout? Aquí está mi diseño de la prueba:

    <layout type="log4net.Layout.PatternLayout"> 
        <conversionPattern value="%date [%thread] [%property{log4net:HostName}] %-5level %logger - %message%newline" /> 
    </layout> 
    
  3. Por último, tiene sentido utilizar el diseño XML para el appender UDP. Parece que XmlLayoutSchemaLog4j ya agrega HostNameProperty al mensaje XML. Si deseo agregar este nuevo ID de proceso (y tal vez el Nombre del proceso) al mensaje XML, ¿cuál es la mejor manera de hacerlo? ¿Debo simplemente copiar src \ Layouts \ XmlLayoutSchemaLog4j.cs, modificarlo y dejar que log4net sepa que creé este nuevo Layout (como el SampleLayoutsApp)?

Gracias por su ayuda

Respuesta

39

Puede agregar cualquier propiedad que desee al GlobalContext.Yo uso este contexto para almacenar el identificador de proceso, así:

log4net.GlobalContext.Properties["pid"] = Process.GetCurrentProcess().Id; 

A continuación se hace referencia a esta propiedad de su appender usando un patrón regular, así:

<layout type="log4net.Layout.PatternLayout"> 
    <conversionPattern value="%date %property{pid} %level %logger - %message%newline" /> 
</layout> 

Puede añadir tantas propiedades como lo desea, pero debido a su naturaleza global, funciona mejor para las propiedades que no cambian durante la ejecución de su aplicación.

+0

Probado% pid todo, id_de_proceso% y muchos más, nada funcionó. Tu solución funciona Gracias. – Nemo

3

Al parecer PatternString sólo se puede utilizar para crear nombres de registro (es decir, los nombres de archivo, etc.), mientras que el diseño le permite formatear el mensaje real que se mete en el registro. Si no hay un patrón incorporado para la identificación del proceso en el diseño del proceso, entonces puede agregarlo fácilmente. Es mucho más simple que crear todo el diseño.

Aquí es cómo hacerlo:

Crear su propio convertidor de patrón personalizado (el ejemplo siguiente intenta obtener el nombre de la aplicación, no importa ganar o web):

internal sealed class ApplicationNamePatternConverter : PatternLayoutConverter 
{ 
    /// <summary> 
    /// Write the event application name to the output 
    override protected void Convert(TextWriter writer, LoggingEvent loggingEvent) 
    { 
     string name = string.Empty; 
     if(System.Web.HttpContext.Current != null) 
     { 
      string[] applicationPath = System.Web.HttpContext.Current.Request.ApplicationPath.Split('/'); 
      name = applicationPath[applicationPath.Length - 1]; 
     } 
     else 
     { 
      if(System.Reflection.Assembly.GetEntryAssembly() != null) 
      { 
       name = System.Reflection.Assembly.GetEntryAssembly().GetName().Name; 
      } 
     } 
     writer.Write(name); 
    } 
} 

agregar la entrada de el convertidor para el registro de la clase PatternLayout

static PatternLayout() 
{ 
... 
    s_globalRulesRegistry.Add("ApplicationName", typeof(ApplicationNamePatternConverter)); 
} 

ya se puede utilizar %ApplicationName en el valor PatternLayout a obtener lo que necesita.

Aconsejo no utilizar el diseño XmlLayoutSchemaLog4j ya que es muy pesado y puede soltar el rendimiento de su aplicación si se usa con frecuencia.

15

se puede alimentar a un PatternString en un PatternLayout:

<layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern type="log4net.Util.PatternString" value="%processid" /> 
    </layout> 
+0

Eso realmente funcionó. Gracias. –

+3

Recuerde escaparse del carácter de porcentaje para las propiedades que desea extraer del evento, p. Ej. para incluir la identificación del proceso como uno de los archivos de registro columnas – Pelle

Cuestiones relacionadas