如何停止显示log4net输出的记录器名称的Visual Studio Output窗口?

时间:2012-02-07 10:40:57

标签: .net visual-studio visual-studio-2010 log4net trace

我正在使用log4net DebugAppender(或TraceAppender)。我已经配置了这样的appender:

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

代码中的记录器以通常的每类方式声明:

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

“输出”窗口中的输出如下所示:

  

Acme.Common.Configuration.TradingApiRouteCollectionExtensions:DEBUG为服务Acme.Session.SessionService注册路由前缀'session'   Acme.Common.Configuration.TradingApiRouteCollectionExtensions:为类型Acme.Session.SessionService找到的DEBUG Web方法:   Acme.Common.Configuration.TradingApiRouteCollectionExtensions:DEBUG session /

注意每行是如何以记录器类型名称开头的。我想压制这个,因为我没有在配置中要求它,我不想要它。我看不出任何明显的方法来做到这一点。有可能吗?

6 个答案:

答案 0 :(得分:15)

您需要创建自己的appender。您正在使用的那个做如下:

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

因此,您总是在输出窗口中以类(记录器)名称结束。您可以从log4net Debug appender派生并覆盖Append方法。

答案 1 :(得分:10)

或者,您可以使用%newline开始布局转换模式。从我的配置:

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

优点:它比创建自己的appender更快

缺点:它显示您登录2行。

注意行开头的%file (%line)是由Visual Studio解释的格式。它允许您单击输出窗口中的日志消息,并直接进入生成它的代码。

答案 2 :(得分:4)

如果您阅读TraceAppender source code,您实际上会发现记录器名称被写为默认&#34;类别&#34;跟踪的名称。因此,如果您已设置此值,则记录器名称将不会显示在输出中。

所以使用下面的配置:

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

输出将是:

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

但你可能会发现每一行都以&#34;:&#34;开头,这很难看。所以我的类别配置是:

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

输出是:

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

注意:DebugAppender不提供覆盖类别的方法。只有TraceAppender可以工作。

答案 3 :(得分:2)

请注意,从v2.0.8开始,您可以关闭类别名称的输出:

https://logging.apache.org/log4net/release/release-notes.html

var debugger = new DebugAppender();
debugger.Category = null;

答案 4 :(得分:1)

我对答案的编辑遭到拒绝,因此单独提供其他有用信息。以下是完整的实现:

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在派生类中是不可访问的,因此您需要使用ImmediateFlush属性。

另外,请注意,如果使用log.config文件,则需要指定在新程序集中提供Appender。 (由this SO answer提供。)

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

答案 5 :(得分:1)

使用现代的log4net可以做到这一点:

<appender name="DebugAppender" type="log4net.Appender.DebugAppender" >

    <!-- Add the <category> tag as below, this will remove %logger prefix in the output -->
    <category type="log4net.Layout.PatternLayout">
        <conversionPattern value="" />
    </category>

    <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="...whatever normal pattern you need there..." />
    </layout>
</appender>

DebugAppender的“ category”属性的默认值为new PatternLayout("%logger"),log4net使用其格式化结果作为category的{​​{1}}参数。不知道为什么要这么做,但是无论如何,上面的配置让log4net知道不需要类别,并且它开始使用Debug.Write(string, string)重载,即没有类别内容的重载。