Как запретить logback выводить свой собственный статус в начале каждого журнала? - PullRequest
122 голосов
/ 15 июля 2010

Это похоже на ошибку по неосторожности, но я не могу найти причину.Ведение журнала с помощью logback / slf4j (последняя версия slf4j-api-1.6.1, ядро ​​logback / classic 0.9.24).Простейшая конфигурация журнала для тестирования:

<configuration>
 <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
  <layout class="ch.qos.logback.classic.PatternLayout">
   <!-- DONT USE THIS FORMATTER FOR LIVE LOGGING THE %L LINE NUMBER OUTPUTTER IS SLOW -->
   <pattern>%le %-1r [%c{1}:%L] %m%n</pattern>
  </layout>
 </appender>
 <root level="DEBUG">
  <appender-ref ref="stdout" />
 </root>
</configuration>

Каждая настройка журнала начинается с внутренних строк состояния журнала:

11:21:27,825 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.groovy]
11:21:27,826 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Found resource [logback-test.xml] at [file:.../logback-test.xml]
11:21:28,116 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - debug attribute not set
11:21:28,124 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.ConsoleAppender]
11:21:28,129 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [stdout]
11:21:28,180 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Pushing component [layout] on top of the object stack.
11:21:28,206 |-WARN in ch.qos.logback.core.ConsoleAppender[stdout] - This appender no longer admits a layout as a sub-component, set an encoder instead.
11:21:28,206 |-WARN in ch.qos.logback.core.ConsoleAppender[stdout] - To ensure compatibility, wrapping your layout in LayoutWrappingEncoder.
11:21:28,206 |-WARN in ch.qos.logback.core.ConsoleAppender[stdout] - See also http://logback.qos.ch/codes.html#layoutInsteadOfEncoder for details
11:21:28,207 |-INFO in ch.qos.logback.classic.joran.action.RootLoggerAction - Setting level of ROOT logger to DEBUG
11:21:28,207 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [stdout] to Logger[ROOT]

, который, согласно документам, формат журнала использует по умолчанию.Затем он завершает чтение конфигурации (которая настроена на вывод в другом формате) и продолжает вывод в правильно отформатированном виде.Там есть параметр конфигурации <configuration debug="false">, который не влияет на это.

Кто-нибудь знает, как это отключить?

Ответы [ 8 ]

212 голосов
/ 09 октября 2013

Если вы установите атрибут debug элемента configuration на true, вы получите всю информацию о состоянии на консоль.Если это ваша проблема, просто установите его в false или удалите.

Если у вас есть какие-либо проблемы с конфигурацией уровня WARN или выше, вы также получите всю информацию о состоянии, записанную на консоль (включая сообщенияуровень INFO).Лучшее решение этой проблемы - решить проблему (в вашем случае замените элемент <layout> на элемент <encoder>).

Если вы по какой-то причине не можете решить проблему, но хотите удалитьИнформация о состоянии из консоли, вы можете вместо этого настроить альтернативный StatusListener.Используйте NopStatusListener для полного удаления информации о статусе:

<configuration>
  <statusListener class="ch.qos.logback.core.status.NopStatusListener" />
  <!-- etc -->
</configuration>
45 голосов
/ 16 июля 2010

Как и , описанное в документации , если во время синтаксического анализа файла конфигурации возникают предупреждения или ошибки, logback автоматически распечатывает данные о состоянии на консоли.

Следуйте http://logback.qos.ch/codes.html#layoutInsteadOfEncoder т.е. ссылка, упомянутая logback в его предупреждающем сообщении. После того, как вы выполните указанные шаги, то есть, если вы замените элемент на , logback остановит печать сообщений на консоли.

7 голосов
/ 07 марта 2015

Ceki ответ правильный:

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

Как только вы все сделаете правильно, в первых строках вашего журнала больше не будет загрязнения.

По состоянию на март 2015 года в Logback 1.1.2 вам необходимо использовать субкомпонент <encoder> - теперь <layout> устарел, и при его использовании будут появляться сообщения об ошибках. Вы не можете управлять этим, это Logback поведение по умолчанию.

Некоторые внутренние классы также были переименованы, и даже примеры на их странице руководства устарели!

Вот фрагмент кода с их страницы справки по кодам ошибок , в которой указан правильный способ настройки регистратора. Это решило проблему полностью в моем проекте. http://logback.qos.ch/codes.html#layoutInsteadOfEncoder

<appender name="FILE" class="ch.qos.logback.core.FileAppender">
  <file>testFile.log</file>
  ...
  <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
    <pattern>%msg%n</pattern>
  </encoder>
</appender>
4 голосов
/ 15 января 2013

Я понял, что Стив нашел исправление, но он не упомянул об этом в ветке.В случае, если кто-то другой столкнулся с той же проблемой, вот исправление.

Замените элементы "" на " .. ", это виновник ..

2 голосов
/ 14 июля 2017

Сам боролся с той же проблемой, т. Е. В самом начале было записано несколько строк, не связанных с моим кодом. Вот как я это исправил.

<configuration debug="false">

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <!-- <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level 
        %logger{36} - %msg%n</pattern> </encoder> -->
    <encoder>
        <pattern>%d{HH:mm:ss.SSS} %-5level %logger{10} - %msg%n</pattern>
    </encoder>
</appender>

<root level="error">
    <appender-ref ref="STDOUT" />
</root>

<logger name="fun.n.games" level="DEBUG" />

Это выполняется со следующей записью в файле pom.xml

        <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.2.3</version>
    </dependency>
2 голосов
/ 17 ноября 2011

Это, кажется, исправлено в 0.9.29. Просто сделал несколько тестов. Нет больше информации о Джоране. Я думаю это это фиксация фиксации.

0 голосов
/ 18 апреля 2018

Использование logback.groovy: statusListener(NopStatusListener)src/test/resources/logback.groovy) работает.

(Допустимый вариант использования, например, если вы работаете с ANT в Eclipse, используете ведение журнала обратной связи, классы groovy и модульные тесты, где модульные тесты принимают src/test/resources/logback.groovy, но также будут отображаться src/main/resources/logback.groovy (или аналогичные), которые вы не можете исключить (если говорят, что путь к классам ANT использует путь к классам проектов).

0 голосов
/ 22 января 2015

Я перепробовал все, и у меня ничего не получалось.Моя проблема была из-за нескольких файлов logback.xml в моем classpath.Это распространенный случай в мультимодульных проектах.Когда в classpath есть только один файл logback.xml, двусмысленность отсутствует, и проблема решена.

...