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

.net 如何停止显示log4net输出的记录器名称的Visual Studio输出窗口?,.net,visual-studio,visual-studio-2010,log4net,trace,.net,Visual Studio,Visual Studio 2010,Log4net,Trace,我正在使用log4net调试程序(或TraceAppender)。我将appender配置为: <appender name="DebugAppender" type="log4net.Appender.DebugAppender"> <immediateFlush value="true" /> <layout type="log4net.Layout.PatternLayout"> <conversionPat

我正在使用log4net调试程序(或TraceAppender)。我将appender配置为:

<appender name="DebugAppender" type="log4net.Appender.DebugAppender">
    <immediateFlush value="true" />
        <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%level %message%newline" />
    </layout>
</appender>
输出窗口中的输出如下所示:

<appender name="DebugAppender" type="log4net.Appender.DebugAppender">
    <immediateFlush value="true" />
        <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%level %message%newline" />
    </layout>
</appender>
Acme.Common.Configuration.TradingApiRouteCollectionExtensions:调试为服务Acme.session.SessionService注册路由前缀“session” Acme.Common.Configuration.tradingAprouteCollectionExtensions:为类型Acme.Session.SessionService找到的调试Web方法: Acme.Common.Configuration.TradingApiRouteCollectionExtensions:调试会话/


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

您需要创建自己的appender。您正在使用的软件执行以下操作:

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

因此,在输出窗口中始终以类(记录器)名称结束。您可以从log4net调试appender派生并重写
Append
方法。

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

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

优点:这比创建自己的appender要快

缺点:它显示你登录了两行

请注意,行开头的
%文件(%line)
是如何由Visual Studio解释的格式。它允许您单击输出窗口中的日志消息,并直接转到生成该消息的代码。

如果您阅读,您会发现记录器名称实际上是作为跟踪的默认“类别”名称写入的。因此,如果您已经设置了此值,记录器名称将不会显示在输出中

因此,使用下面的配置:

<appender name="TraceAppender" type="log4net.Appender.TraceAppender">
  <category value="" />
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%date [%thread] %level - %message%newline%exception" />
  </layout>
</appender>
但你可能会发现每一行都以“:”开头,这很难看。因此,我的类别配置为:

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

注意:DebugAppender不提供覆盖类别的方法。只有TraceApender有效。

我对答案的编辑被拒绝,因此需要单独提供其他有用信息。以下是完整实施的情况:

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。(提供人)


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


使用现代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将其格式化结果用作
Debug.Write(string,string)
category
参数。不知道他们为什么这样做,但无论如何,上面的配置让log4net知道类别是不需要的,并且它开始使用
Debug.Write(string)
重载,即没有类别的东西。

谢谢!编辑您的答案以添加完整的实现,包括即时刷新处理。我按照你的建议添加了这个,效果很好。使用“%file(%line)”的文件/行格式的最后一条注释允许你在调试窗口中单击该行并跳转到代码是非常棒的。需要注意的一点是,这需要是第一件事。请注意,
%file
%line
非常昂贵,因为它们使用StackTrace功能。在发布版本中也可能有误导性/缺失。这非常有效。很高兴我们不再需要扩展DebugAppender!
public class MyDebugAppender : log4net.Appender.DebugAppender
{
    protected override void Append(LoggingEvent loggingEvent)
    {
        System.Diagnostics.Debug.Write(RenderLoggingEvent(loggingEvent));
        if (ImmediateFlush)
        {
            System.Diagnostics.Debug.Flush();
        }
    }
}
<appender name="AppenderRef" type="MyNamespace.MyDebugAppender, MyAppenderAssembly">
var debugger = new DebugAppender();
debugger.Category = null;
<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>