Как остановить окно вывода Visual Studio, отображающее имя регистратора вывода log4net? - PullRequest
28 голосов
/ 07 февраля 2012

Я использую 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 Регистрация префикса маршрута 'session' для службы Acme.Session.SessionService Acme.Common.Configuration.TradingApiRouteCollectionExtensions: обнаружены веб-методы DEBUG для сеанса типа AcmeSec.Acme.Common.Configuration.TradingApiRouteCollectionExtensions: сеанс DEBUG /

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

Ответы [ 6 ]

15 голосов
/ 07 февраля 2012

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

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

Поэтому вы всегда получаете имя класса (logger) в окне вывода. Вы можете получить из приложения отладки log4net и переопределить метод Append.

10 голосов
/ 27 июля 2012

Кроме того, вы можете запустить шаблон преобразования макета с %newline.Из моей конфигурации:

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

Плюсы : это быстрее, чем создание собственного аппендера

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

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

4 голосов
/ 27 февраля 2017

Если вы прочитаете исходный код 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.

2 голосов
/ 04 октября 2017

обратите внимание, что начиная с версии 2.0.8 вы можете отключить вывод названия категории:

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

var debugger = new DebugAppender();
debugger.Category = null;
1 голос
/ 02 октября 2018

С помощью современного 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 использует его форматированный результат как category параметр Debug.Write(string, string).Не уверен, почему они это сделали, но в любом случае приведенная выше конфигурация позволяет log4net знать, что категория не нужна, и она начинает использовать перегрузку Debug.Write(string), то есть ту, у которой нет категории.

1 голос
/ 24 апреля 2017

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

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 предоставлен в новой сборке.(Предоставлено этот SO ответ .)

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