2009-02-23 10 views
67

En this thread muchas personas han indicado que usan log4net. Soy un fan de TraceSources y me gustaría saber por qué se usa log4net.log4net versus TraceSource

Aquí es por eso que me gusta orígenes de seguimiento:

  • oyentes conectables - XML, archivo de texto, Consola, EventLog, rodar su propia
  • interruptores traza personalizable (error, advertencia, información, prolijo, inicio, fin , personalizado)
  • configuración adaptable
  • El Logging Application Block es sólo un gran conjunto de TraceListeners
  • Correlación de actividades/alcances (por ejemplo, asociado todos los registros dentro de un ASP.NET r equest con un cliente determinado
  • Service Trace Viewer le permite visualizar eventos contra estas actividades individualmente
  • Todo se puede configurar en app.config/web.config.

Dado que .NET framework usa internamente TraceSources, también me proporciona una forma consistente de configurar el rastreo: con log4net, tengo que configurar log4net y TraceSources.

¿Qué me proporciona log4net que TraceSources no (o que no podría hacerse escribiendo un par de TraceListeners personalizados)?

+22

Encontré esta pregunta digna de SO, y también encontré varias respuestas para ser lo suficientemente informativas como para que ya no tenga que buscar más información. Quien haya cerrado esta pregunta como "no constructivo", me pregunto si se hizo o no por un sesgo hacia log4net y una insatisfacción general con la línea de respuestas recibidas. Esta pregunta y muchas respuestas ayudan a aclarar el miedo, la incertidumbre, la duda y la simple información errónea que rodean log4net y .NET Tracing. –

+3

También he encontrado esta pregunta útil. Y de hecho coincidía exactamente con lo que estaba buscando. – Darkonekt

Respuesta

9

Creo que log4net está haciendo todo lo que enumeró para mí.

Los oyentes conectables suenan como apéndices: hay muchos de ellos y, de hecho, incluso pirateé el archivo de registro rodante para terminar siempre en .log (para asociaciones de archivos), agregué un campo cc al appendidor de correo electrónico y finalmente sintonicé mis valores favoritos para el appender de consola de color. Si me permite el atrevimiento - mi color felicidad consola:

<appender name="ColoredConsoleAppender" type="log4net.Appender.ColoredConsoleAppender"> 
<!-- Can Use: 
     Blue 
     Green 
     Red 
     White 
     Yellow 
     Purple 
     Cyan 
     HighIntensity 
     --> 
<mapping> 
    <level value="FATAL" /> 
    <foreColor value="Yellow, HighIntensity" /> 
    <backColor value="Red" /> 
</mapping> 
<mapping> 
    <level value="ERROR" /> 
    <foreColor value="White" /> 
    <backColor value="Purple, HighIntensity" /> 
</mapping> 
<mapping> 
    <level value="WARN" /> 
    <backColor value="Blue" /> 
    <foreColor value="White" /> 
</mapping> 
<mapping> 
    <level value="INFO" /> 
    <backColor value="Green" /> 
    <foreColor value="White" /> 
</mapping> 
<mapping> 
    <level value="DEBUG" /> 
    <foreColor value="White" /> 
</mapping> 
<layout type="log4net.Layout.PatternLayout"> 
    <!--<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />--> 
    <!--<conversionPattern value="%-5level %file:%line - %message%newline" />--> 
    <conversionPattern value="%level %logger:%line %newline  %message%newline" /> 
</layout> 

interruptores traza personalizables: Log4net sólo viene con FATAL ERROR WARN información de depuración con el fin de aumentar la verbosidad. El único que realmente echo de menos es AUDITAR para quién hizo qué registro.

configuración personalizable: Yo uso un archivo log4net.config la que me carga hasta en tiempo de ejecución (o escribir un registro en c:. \ Lloriqueo que no puedo encontrar la configuración)

Try 
     ' Get log4net configuration from file 
     Dim logConfigFile As FileInfo 
     logConfigFile = New FileInfo(".\log4net.config") 

     If logConfigFile.Exists Then 
      XmlConfigurator.Configure(logConfigFile) 
     Else 
      CreateEmergenceLogFile(logConfigFile.FullName) 
     End If 

    Catch ex As Exception 
     Console.Out.WriteLine("Could not load the log4net config file") 
    End Try 

sólo un gran conjunto de TraceListeners: lo siento omitiendo ese - Voy a tomar su palabra para ello.

Correlación de actividades/ámbitos: quiere decir que cada archivo (clase de lectura) obtiene su propio registro con nombre que puede tener umbrales de nivel de registro por separado. De hecho se puede registro de segmento, incluso en una sola clase (que en realidad puede haber crecido a hacer demasiado ...)

en un archivo de clase:

Private Shared _logger As log4net.ILog = _ 
log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType) 

Private Shared _loggerAttribute As log4net.ILog = _ 
log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.FullName & ".Attribute") 

Private Shared _loggerCache As log4net.ILog = _ 
log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.FullName & ".Cache") 

El seguimiento de servicio Visor: en el log4net .config:

<logger name="NipissingU.ADWrapper.EntryTools.Attribute"> 
    <level value="INFO" /> 
    </logger> 
    <logger name="NipissingU.ADWrapper.EntryTools.Cache"> 
    <level value="WARN" /> 
    </logger> 

Todo es configurable en app.config/web.config: bueno, tal vez eso es una buena cosa en ASP.NET, no sé, pero al hacer aplicaciones de conteo rica frijol cliente Me gusta un archivo de configuración separado.

Todo aquí es solo mi propio pequeño truco de uso.

HTH, -Mike

+0

gracias Mike. La correlación es un poco diferente: puede asociar un guid y metadatos sobre un "contexto" de registro: todos los rastros desde allí hasta que el contexto está "cerrado" se relacionan con ese contexto. hace que sea fácil ver todos los registros relacionados con un pedido o cliente en particular, por ejemplo –

+0

por el contrario, tener diferentes archivos de registro por cliente/orden podría ser bastante molesto –

+0

los contextos también admiten anidamiento de lo que puedo decir, aunque no lo he intentado esto –

3

La razón por la que prefiero Log4Net para usar Trace uno de targeting - con Log4Net, puedo instrumentar independientemente diferentes capas de mi aplicación (Acceso a datos, Servicios, Business Logic, etc.) y diferentes subsistemas (Autenticación, Procesamiento, etc.) y activar/desactivar el registro de cada subsistema de forma independiente.

Esta flexibilidad me permite configurar el registro detallado para un subsistema sin encender el firehose para todo el sistema.

Los métodos estáticos proporcionados en la clase Trace [como TraceInformation()] no proporcionan ninguna forma de especificar de qué subsistema es el registro, por lo que esto no es algo fácil de proporcionar al escribir mi propio TraceListener.

Otra razón es el rendimiento: hay partes de mi aplicación que potencialmente pueden registrar varios miles de mensajes por segundo. Log4Net impone una baja sobrecarga. Por el contrario, la última vez que lo miré, el bloque de la aplicación de registro reparsed su configuración XML para cada mensaje registrado, haciendo que el bloque sea muy pesado y lento.

+12

Re: orientación - TraceSource proporciona esto.Puede tener múltiples TraceSources configurados y sintonizar cada uno individualmente. –

+1

Re: rendimiento. Me sorprendería si este sigue siendo el caso, pero sin duda será algo que investigaré. ¿Cómo soportan las personas la lectura de mil mensajes de registro por segundo? :) –

+1

Sabía que el curso de lectura rápida sería útil – stimms

0

Mientras Im solamente al tanto de la forma en que funciona log4net, una ventaja evidente para el uso de ese marco es la familiaridad inmediata para aquellos acostumbrados a utilizar log4j.

Otra pequeña ventaja es que el registro de conducción de prueba con log4net es extremadamente simple; los registradores implementan log4net.ILog. De nuevo, no estoy familiarizado con la solución de Microsoft, pero me pregunto cómo se haría esto sin escribir primero una fachada en la clase System.Diagnostics.Trace.

Con una mirada superficial a la documentación de fuentes de rastreo, no pude encontrar un equivalente a los diseños, y me interesaría saber si existe un equivalente. PatternLayout es muy útil para formatear entradas de registro con datos comunes como fechas, información de hilos, contexto de registro, etc. Log4net PatternLayout docs: http://logging.apache.org/log4net/release/sdk/log4net.Layout.PatternLayout.html

Además, dado que escribir extensiones en un marco de trabajo es probablemente un clásico 'meta-problema' , log4net trae una gran lista de equivalentes de escucha conectables a la tabla.

Lista de appenders: http://logging.apache.org/log4net/release/config-examples.html

+0

Consulte el proyecto de Essential Diagnostics en Codeplex (http://essentialdiagnostics.codeplex.com/) para un System.Diagnostics TraceListener con soporte de patrón/formato, así como una interfaz y fachada para TraceSource (aunque puede probar simplemente adjuntando un detector de rastreo de prueba). –

54

En los primeros días (.NET 1.0) de rastreo en el .NET Framework era bastante limitada.

Por ejemplo, el particionamiento de TraceSource no llegó hasta .NET 2.0 y solo tenía cuatro niveles (Error, Advertencia, Información, Detallado), aunque podía usar media docena de modificadores booleanos para particionar si lo deseaba.

log4j es popular en Java, por lo que recibió una gran cantidad de soporte para un puerto .NET, y una vez que se hizo popular, se mantuvo de esa manera, aunque las personas ni siquiera lo usan correctamente (por ejemplo, envolverlo en un registrador singleton y perder su característica principal).

Aún así, creo que log4net y otros marcos (por ejemplo, NLog, Common.Logging e incluso EntLib) fueron mal implementando su propio sistema de registro desde cero, es decir, cambiando incluso la forma en que escribe las sentencias de registro en El primer lugar.

Hubiera preferido mucho esfuerzo, especialmente desde .NET 2.0, para extender la sólida base de lo que ya está en .NET. Para un proyecto que extiende lo que ya está allí, eche un vistazo al proyecto de Essential Diagnostics en CodePlex (http://essentialdiagnostics.codeplex.com/).

Algunos puntos fuertes de log4net:

  • Es similar a log4j, si ejecuta un entorno mixto y desea registro consistente.

  • La jerarquía del registrador automático que hereda la configuración es bastante clara, en comparación con la cantidad de orígenes de rastreo que implementa y tiene que configurar cada uno. (aunque probablemente exagerado en algunos casos).

  • log4net ya tiene alrededor de 28 appenders (equivalente a trazar oyentes), mientras que solo tiene 10 System.Diagnostics (pero ver el proyecto Essential.Diagnostics para más), así que si realmente piensa que puede necesitar el RemoteSyslogAppender, NetSendAppender, AnsiColorTerminalAppender o TelnetAppender, entonces estás de suerte.

Inconvenientes (en comparación con System.Diagnostics):

  • Es necesario utilizar una sintaxis diferente de registro, por lo que si usted ya está usando source.TraceEvent(), tiene que ir a través y reemplazar todo.

  • Esto también se extiende a la sintaxis diferente para la correlación, por lo que debe cambiar de CorrelationManager a log4net contexts.

  • No se integra fácilmente con el seguimiento de Framework (por ejemplo, WCF).

  • Soporte deficiente para Event ID's (necesidad de utilizar un proyecto de extensión separado IEventLog).

  • Aún no es compatible con el seguimiento de eventos para Windows (Vista) o el formato XML del Visor de rastreo de servicio.

4

Otra razón para usar en lugar de TraceSources Log4net está trazando en sí: Log4net sólo puede ser empleada para la identificación (mensajes) pero la forma de rastrear un objeto (múltiples informaciones al mismo tiempo)? Por supuesto, Log4Net tiene una gran cantidad de oyentes implementados, pero ¿necesito todo esto? En la mayoría de los casos no. Y si necesito un oyente especial, no es tan difícil implementar el mío propio, ¿no es así? Por ejemplo, necesito un oyente para rastrear en una base de datos (no solo mensajes, sino información diferente {cadena, int, etc.} al mismo tiempo).

¿Estoy en lo cierto?

+0

De hecho, creo que eres (al menos en el lado de TraceSource) – Mark