2012-02-07 12 views
25

Estoy usando log4net DebugAppender (o TraceAppender). He configurado el appender así:¿Cómo detengo la ventana Visual Studio Output que muestra el nombre del registrador de la salida de log4net?

<appender name="DebugAppender" type="log4net.Appender.DebugAppender"> 
    <immediateFlush value="true" /> 
     <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%level %message%newline" /> 
    </layout> 
</appender> 

registradores en el código se declaran en la habitual forma por clase:

private static readonly ILog Log = 
    LogManager.GetLogger(typeof(TradingApiRouteCollectionExtensions)); 

de salida en las ventanas de resultados es el siguiente:

Acme.Common.Configuration.TradingApiRouteCollectionExtensions: DEBUG Registro del prefijo de ruta 'session' para el servicio Acme.Session.SessionService Acme.Common.Configuration.TradingApiRouteCollectionExten siones: métodos de depuración web encontrados para el tipo Acme.Session.SessionService: Acme.Common.Configuration.TradingApiRouteCollectionExtensions: sesión de depuración/

Aviso cómo cada línea comienza con el nombre del tipo registrador. Quiero suprimir esto ya que no lo pedí en la configuración y no lo quiero. No puedo ver ninguna forma obvia de hacer esto. ¿Es posible?

Respuesta

15

Necesita crear su propio appender. El que usted está usando hace lo siguiente:

System.Diagnostics.Debug.Write(RenderLoggingEvent(loggingEvent), loggingEvent.LoggerName); 
if (!this.m_immediateFlush) 
    return; 
System.Diagnostics.Debug.Flush(); 

lo tanto, siempre terminan con el nombre de la clase (registrador) en la ventana de salida. Puede derivar del apéndice loggnet Debug y anular el método Append.

+1

Gracias! Editó su respuesta para agregar la implementación completa, incluido el manejo inmediato del enjuague. Hice lo que sugirió con esto agregado y funcionó un regalo. –

9

Alternativamente, puede comenzar su patrón de conversión de diseño con %newline. Desde mi config:

<appender name="DebuggerAppender" type="log4net.Appender.DebugAppender"> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="%newline%file (%line): %level: %message%newline"/> 
     </layout> 
    </appender> 

Pros: es más rápido que la creación de su propia appender

Contras: demuestra que inicie sesión en 2 líneas.

Observe cómo el %file (%line) al principio de la línea es un formato interpretado por Visual Studio. Le permite hacer clic en el mensaje de registro en la ventana de salida y dirigirse directamente al código que lo generó.

+1

La nota final de usar el formato de archivo/línea de "% file (% line)" le permite hacer clic en la línea en la ventana de depuración y saltar al código es impresionante. Una cosa a tener en cuenta es que esto debe ser lo primero en la línea. – denver

+0

Tenga en cuenta que '% file' y'% line' son * caros * porque usan la funcionalidad de StackTrace. También puede ser engañoso/faltante en versiones de lanzamiento. –

1

Si lee TraceAppender source code, encontrará en realidad que el nombre del registrador se escribe como el nombre de "categoría" predeterminado de la traza. Entonces, si ya configura este valor, el nombre del registrador no se mostrará en la salida.

Así que con la configuración a continuación:

<appender name="TraceAppender" type="log4net.Appender.TraceAppender"> 
    <category value="" /> 
    <layout type="log4net.Layout.PatternLayout"> 
    <conversionPattern value="%date [%thread] %level - %message%newline%exception" /> 
    </layout> 
</appender> 

La salida será:

: 2017-02-27 22:53:26,335 [6] INFO - Task Ended 

pero es posible que cada línea comienza con ":", que es feo.Así que mi configuración para la categoría es:

... 
<category value="LOG" /> 
... 

Y la salida es:

LOG: 2017-02-27 22:53:26,335 [6] INFO - Task Ended 

NOTA: DebugAppender no proporciona el camino para sobrescribir categoría. Solo TraceAppender funciona.

0

Mi edición de la respuesta se rechazó, por lo que se proporciona información útil adicional por separado. Esto es lo que una implementación completa se vería así:

public class MyDebugAppender : log4net.Appender.DebugAppender 
{ 
    protected override void Append(LoggingEvent loggingEvent) 
    { 
     System.Diagnostics.Debug.Write(RenderLoggingEvent(loggingEvent)); 
     if (ImmediateFlush) 
     { 
      System.Diagnostics.Debug.Flush(); 
     } 
    } 
} 

m_immediateFlush es inaccesible en la clase derivada por lo que deberá utilizar la propiedad ImmediateFlush.

Además, tenga en cuenta que si utiliza un archivo log.config deberá especificar que su Appender se proporciona en un nuevo ensamblaje. (Cortesía de this SO answer.)

<appender name="AppenderRef" type="MyNamespace.MyDebugAppender, MyAppenderAssembly"> 
Cuestiones relacionadas