我正在使用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 /
注意每行是如何以记录器类型名称开头的。我想压制这个,因为我没有在配置中要求它,我不想要它。我看不出任何明显的方法来做到这一点。有可能吗?
答案 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)
重载,即没有类别内容的重载。