loglevel ejemplos conversionpattern coloredconsoleappender log4net

ejemplos - Información de identificación del proceso log4net



log4net table (3)

Aparentemente, PatternString solo se puede utilizar para crear nombres de registro (es decir, nombres de archivos, etc.), mientras que el diseño le permite formatear el mensaje real que se incluye en el registro. Si no hay un patrón integrado 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í está cómo hacerlo:

Cree su propio convertidor de patrones personalizado (el siguiente ejemplo intenta obtener el nombre de la aplicación sin importar si gana o por la 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); } }

Agregue la entrada para su convertidor al registro de la clase PatternLayout

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

Ahora puede usar %ApplicationName en el valor de PatternLayout para obtener lo que necesita.

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

Estoy tratando de crear una solución de registro que involucre múltiples procesos en múltiples máquinas. Planeé usar UDPAppender para enviar todos los mensajes de registro a una sola máquina que los administre. Tengo algunas preguntas acerca de las cadenas de patrones vs patrones de patrones.

Como necesito saber de qué máquina y de qué proceso proviene el mensaje de registro, también quiero incluir eso en el registro. Encontré% property {log4net: HostName} para el nombre de host, y eso funciona muy bien. Sin embargo, no veo nada para la identificación del proceso en PatternLayouts. Por supuesto, veo algo así en el PatternString. De las preguntas frecuentes:

<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 de hacerlo).

Entonces, mis preguntas son:

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

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

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

  3. Finalmente, tiene sentido usar el diseño XML para el appender UDP. Parece que XmlLayoutSchemaLog4j ya agrega la propiedad HostName al mensaje XML. Si no quiero agregar este nuevo ID de proceso (y tal vez Nombre de proceso) al mensaje XML, ¿cuál es la mejor manera de hacerlo? ¿Debo copiar src / Layouts / XmlLayoutSchemaLog4j.cs, modificarlo y dejar que log4net sepa que creé este nuevo diseño (como SampleLayoutsApp)?

Gracias por tu ayuda


Puede agregar cualquier propiedad que desee al GlobalContext. Utilizo este contexto para almacenar el id de proceso, como este:

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

Luego hace referencia a esta propiedad de su appender usando un patrón regular, como este:

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

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


Puede alimentar un PatternString en un PatternLayout:

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