Как остановить окно вывода Visual Studio, отображающее имя регистратора вывода log4net?

Я использую 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.Общий.Конфигурация.TradingApiRouteCollectionExtensions: отладка регистрации префикса маршрута "сеанс" для службы Acme.Сессия.SessionService Вершина.Общий.Конфигурация.TradingApiRouteCollectionExtensions: отладка веб-методов, найденных для типа Acme.Сессия.SessionService: Вершина.Общий.Конфигурация.TradingApiRouteCollectionExtensions: сеанс отладки/

обратите внимание, как каждая строка начинается с имени типа логгер. Я хочу подавить это, поскольку я не просил об этом в конфигурации, и я этого не хочу. Я не вижу никакого очевидного способа сделать это. Возможно ли это?

6 ответов


вам нужно создать свой собственный appender. Тот, который вы используете делает следующее:

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

поэтому вы всегда заканчиваете с именем класса (регистратора) в окне вывода. Вы можете наследовать от log4net Debug 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

минусы: он показывает, что вы входите в 2 строки.

обратите внимание:%file (%line) в начале строки находится формат, интерпретируемый Visual Studio. Это позволяет вам щелкнуть по сообщению журнала в окне вывода и перейти прямо к сгенерированному коду он.


если вы читали исходный код TraceAppender, вы найдете на самом деле имя регистратора записывается как имя "категории" по умолчанию трассировки. Поэтому, если вы уже установили это значение, имя регистратора не будет отображаться в выходных данных.

Итак, с конфигурацией ниже:

<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

но вы можете обнаружить, что каждая строка начинается с":", что уродливо. Итак, моя конфигурация для категории:

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

и выход есть:

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

Примечание: DebugAppender не предоставляет способ перезаписи категории. Работает только TraceAppender.


мое редактирование ответа было отклонено, поэтому предоставление дополнительной полезной информации отдельно. Вот как будет выглядеть полная реализация:

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.

кроме того, обратите внимание, что при использовании журнала.файл конфигурации нужно будет указать, что ваш приемщика в новой сборке. (Любезность это так ответ.)

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

обратите внимание, что с v2.0.8, вы можете отключить вывод имени категории:

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

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

С современным 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>

свойство" category " DebugAppender имеет значение по умолчанию new PatternLayout("%logger"), а log4net использует отформатированный результат как