2009-06-17 13 views
7

estoy teniendo un tiempo difícil encontrar documentación sobre los diferentes 'en la caja de' patrones como¿Existe un patrón log4net para machineName

%logger 
%level 
%timestamp 

Hay, por supuesto the example page pero no estoy seguro de que es el pleno lista de opciones

También sé que es posible que los parámetros de MDC salgan de la aplicación para el registrador, pero eso implica un cambio de código que es una bestia diferente de un cambio de configuración.

¿Existe la opción %machineName o la opción machineIP? El problema es que tenemos todos nuestros servidores en el registro de la granja de servidores web en el mismo registro de la base de datos, y ahora estamos pensando que una cantidad desproporcionada de mensajes proviene de una máquina.

Respuesta

2

Mira el PatternString API, parece que necesitarías usar la propiedad% en tu patrón. También consulte this article, puede necesitar inyectar el nombre de la máquina en el contexto global al inicio de la aplicación.

+0

@AgileJon - ¡ese artículo era exactamente lo que estaba buscando! ¡¡¡Gracias!!! –

10
%property{log4net:HostName} 
11

Lo que acabo de tropiezo a través de es

<layout type="log4net.Layout.PatternLayout" value="${COMPUTERNAME}"/> 

y que parece estar funcionando --- preguntarse cuál es la diferencia entre esta y las otras opciones sugeridas. como %property{log4net:HostName}

+1

$ {...} depende de las variables de entorno. –

+1

que funciona en todas las máquinas de Windows en las que probé. ¡Muy útil! –

+0

Me gusta, ¿por qué tomar una dependencia en una clase personalizada si no es necesario? –

3

Crear una clase que recibe el nombre de la máquina:

using System; 
using System.IO; 
using log4net.Layout.Pattern; 

namespace YourNameSpace.Converters 
{ 
    public class MachinePatternConverter : PatternLayoutConverter 
    { 
     protected override void Convert(TextWriter writer, log4net.Core.LoggingEvent loggingEvent) 
     { 
      writer.Write(Environment.MachineName);    
     } 
    } 
} 

continuación, establezca su log4net configuración como ésta:

<layout type="log4net.Layout.PatternLayout"> 
    <converter> 
     <name value="machine" /> 
     <type value="YourNameSpace.MachinePatternConverter" /> 
    </converter> 
    <conversionPattern value="%date [%thread] %level %logger %machine" /> 
</layout> 

me gusta este enfoque, ya que puede ser reutilizado y que puede gestionar la información como quiero . Si desea registrar la dirección IP, por ejemplo, acaba de hacer lo mismo y crear el convertidor de este modo:

public class IPPatternConverter : PatternLayoutConverter 
{ 
    protected override void Convert(TextWriter writer, log4net.Core.LoggingEvent loggingEvent) 
    { 
     if (HttpContext.Current == null) 
      return; 

     writer.Write(HttpContext.Current.Request.UserHostAddress); 
    } 
} 

Más información en el enlace: http://devstuffs.wordpress.com/2012/01/12/creating-your-own-pattern-layout-converter-for-log4net/

2

Usando esta respuesta https://stackoverflow.com/a/2096452/1224858 sobre la adición de propiedades GlobalContext, me fue capaz de hacer que esto funcione.

he añadido el código siguiente en mi archivo de clase:

log4net.GlobalContext.Properties["hostname"] = Environment.MachineName; 

Y luego en el archivo de configuración que puedo hacer referencia a nombre de host y aparecerá

<layout type="log4net.Layout.PatternLayout"> 
    <conversionPattern value="%date [%thread] %-5level %logger [%property{hostname}] - %message%newline" /> 
</layout> 

Espero que esto ayude.

Cuestiones relacionadas