Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

В качестве альтернативы вы можете запустить шаблон преобразования макета с помощью %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. Он позволяет вам щелкнуть сообщение журнала в окне вывода и принять его прямо к коду, который сгенерировал его.

Ответ 3

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

Ответ 4

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

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

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