2010-02-17 8 views
14

Puedo registrar mensajes de información sin ningún problema, pero no puedo encontrar la forma de registrar mensajes detallados. Cualquier ayuda sería bienvenida.Log4net, cómo registrar un mensaje detallado?

Mi problema es:

loggingEvent.Level se puede comprobar en la función Format. Los posibles valores son entre otros, Info, Debug, Error, Verbose, hay más, pero estos son los que usaré principalmente.

El objeto de registro real solamente tiene los siguientes métodos:

Log.Info Log.DEBUG Log.Warn log.error

Como se puede ver - no detallado!

Entonces, ¿cómo puedo registrar un mensaje detallado, esto es diferente para depurar

Gracias de antemano

+0

La respuesta corta es: no se puede hacer a menos que haga algún trabajo en las cañerías. Esto posiblemente podría cambiar en versiones posteriores. Esta pregunta fue hecha con la versión 1.2 del producto en mente. –

Respuesta

29

Puede agregar un Detallado (o nivel de seguimiento) a log4net utilizando los métodos de extensión. Esto es lo que estoy usando: ejemplo

public static class ILogExtentions 
{ 
    public static void Trace(this ILog log, string message, Exception exception) 
    { 
     log.Logger.Log(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType, 
      log4net.Core.Level.Trace, message, exception); 
    } 

    public static void Trace(this ILog log, string message) 
    { 
     log.Trace(message, null); 
    } 

    public static void Verbose(this ILog log, string message, Exception exception) 
    { 
     log.Logger.Log(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType, 
      log4net.Core.Level.Verbose, message, exception); 
    } 

    public static void Verbose(this ILog log, string message) 
    { 
     log.Verbose(message, null); 
    } 

} 

Uso:

public class ClientDAO 
{ 
    private static readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(ClientDAO)); 

    public void GetClientByCode() 
    { 
     log.Trace("your verbose message here"); 
     //.... 
    } 
} 

Fuente:

http://www.matthewlowrance.com/post/2010/07/14/Logging-to-Trace-Verbose-etc-with-log4net.aspx

+6

El enlace está muerto ... – Vaccano

3

Apache log4net tiene los siguientes niveles de registro:

DEBUG < INFO < WARN < ERROR < FATAL

Para mensajes considerados rojo más detallado que mensajes informativos (INFO), el nivel DEBUG es la opción a seguir. Escribir mensajes de depuración debe ser tan simple como:

myLog.Debug("This is a pretty verbose message"); 

Si se escribe muy muchos mensajes de depuración y/o los mensajes son costosos de producir (por ejemplo, implica la concatenación de cadenas pesada), considerar la adición de un condicional en torno a la explotación forestal:

if (myLog.IsDebugEnabled) 
{ 
    myLog.Debug("This is a pretty verbose message"); 
} 

Si usted se encuentra haciendo esto a menudo y quieren secar su código, considere el uso extension methods for deferred message formatting, que a su vez, la declaración anterior en esto:

Log.Debug(() => "This is a pretty verbose message"); 
+0

por favor vea la pregunta actualizada ... explica en mayor profundidad el problema. –

+0

Ouch, eso cambia la pregunta dramáticamente. Me temo que no tengo ni idea de qué responder ahora = \ –

+0

Tenga en cuenta que los métodos 'ILog.xxxxFormat()' hacen la verificación '.IsxxxxEnabled' internamente –

3

No se puede entender porque AFAIK no tiene un nivel "detallado" en log4net. ¿Hay alguno en log4j?

Los siguientes son los niveles

TODO DEBUG INFO WARN ERROR FATAL OFF

mensajes informativos son aquellos en los que especifique lo que está haciendo actualmente en su aplicación. Esos mensajes escupidos por comandos o herramientas del SO cuando dices -verbose, serían este tipo de mensajes.

Los mensajes de depuración son en su mayoría para los programadores y que le permiten escribir información tal como la creación de variables, ciclo de vida, seguimientos de pila excepción etc. Algo que sólo el personal programador/soporte estaría interesado en.

[Editar ] Sólo pensé en esto.Puede agregar un elemento de cambio o configuración a su aplicación denominada "detallado" y luego escupir los mensajes informativos si se establece en verdadero. O ajuste el registro en un método de ayuda, que iniciará sesión en log4net y enviará el mismo mensaje a la consola. Además, puede usar ConsoleAppender para registrar mensajes en la consola. Nunca lo he usado sin embargo. Esto es lo que estabas buscando?

Espero que esto ayude.

+0

Actualicé la pregunta ... observe que LoggingEvent tiene una propiedad de nivel. Un posible valor es detallado. –

+1

Lo siento, no veo ese posible valor en el SDK. http://logging.apache.org/log4net/release/sdk/log4net.Core.Level.html ¿Podría especificar dónde la obtiene? – Tanmay

+0

Creo que entiendo lo que dices. OOB (fuera de la caja) Log4net no tiene un nivel detallado por decir, sino que se refiere a cualquier cosa sobre la información, que para todos los propósitos prácticos significa depuración. esta es la razón por la que solo puedes verificarlo, durante el formateo del diseño ¿verdad? –

2

No lo probé, pero creo que debería ser bastante directo: internamente log4net sabe un nivel "detallado"; solo la interfaz ILog no lo expone. Por lo tanto, debería ser bastante simple agregar un método IsVerboseEnabled y Verbose() a esta interfaz. Por supuesto, debe estar dispuesto a cambiar el código fuente de log4net ...

1

En caso de que alguien todavía necesitan la respuesta (sin utilizar System.Reflection) No es necesario establecer DeclaringType, simplemente configure null (resolución automática en Lo4Net)

public bool IsVerboseEnable { get { return _log.Logger.IsEnabledFor(Level.Verbose); } } 

public string Verbose(string text) 
{ 
    _log.Logger.Log(null, Level.Verbose, text, null); 
    return text; 
} 

Probado & Validado

uso Código de log4net

public virtual void Log(Type callerStackBoundaryDeclaringType, Level level, object message, Exception exception) 
{ 
    try 
    { 
     if (this.IsEnabledFor(level)) 
     { 
      this.ForcedLog((callerStackBoundaryDeclaringType != null) ? callerStackBoundaryDeclaringType : Logger.declaringType, level, message, exception); 
     } 
    } 
    catch (Exception exception2) 
    { 
     LogLog.Error(Logger.declaringType, "Exception while logging", exception2); 
    } 
} 
2

He probado con log4net BasicConfigurator, y los mensajes de registro de escritura elaborada de salida para todos los niveles de la emergencia abajo de depurar, pero no para TRACE o VERBOSE.

Necesitaba ejecutar el siguiente código para que inicien el registro.

var logRepository = LogManager.GetRepository(Assembly.GetEntryAssembly()); 
((Hierarchy)logRepository).Root.Level = Level.All; 
Cuestiones relacionadas