Як запобігти виведенню власного статусу вхідного журналу на початку кожного журналу?


145

Це здається помилковою необережністю, але я не можу знайти причину. Ведення журналу за допомогою logback / slf4j (остання версія slf4j-api-1.6.1, ядро ​​зворотного зв'язку / класичний 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]

який, відповідно до документів, використовує стандартний зворотний зв'язок за замовчуванням. Потім він закінчує читання конфігурації (яка налаштована для виведення іншого формату) і продовжує правильно відформатований вихід. Існує параметр config, <configuration debug="false">який на це не впливає.

Хтось знає, як це вимкнути?


Останні версії зворотного зв'язку значно швидші при обчисленні% L.
Thorbjørn Ravn Andersen

@ ThorbjørnRavnAndersen документи говорять: "L / line: Генерування інформації про номер рядка не є особливо швидким. Таким чином, його слід уникати, якщо швидкість виконання не є проблемою". FWIW: logback.qos.ch/manual/layouts.html (так, можливо, це швидше, але все-таки не надто швидко чи щось ...)
rogerdpack

@rogerdpack так. Він виявляється шляхом аналізу сліду стека винятку. Це стало швидше.
Thorbjørn Ravn Andersen

Відповіді:


249

Якщо встановити debugатрибут configurationелемента true, ви отримаєте всю інформацію про стан на консолі. Якщо це ваша проблема, просто встановіть її на помилку або видаліть її.

Якщо у вас виникли проблеми з налаштуваннями рівня WARNабо вище, ви також отримаєте всю інформацію про стан, записану на консоль (включаючи повідомлення рівня INFO). Найкраще рішення цієї проблеми - це виправити проблему (у вашому випадку замініть <layout>елемент на <encoder>елемент).

Якщо ви з якихось причин не можете усунути проблему, але хочете видалити інформацію про стан з консолі, можете замість цього налаштувати альтернативну StatusListener. Використовуйте NopStatusListenerдля повного видалення інформації про стан:

<configuration>
  <statusListener class="ch.qos.logback.core.status.NopStatusListener" />
  <!-- etc -->
</configuration>

9
Це правильна відповідь, слід більше звертати увагу, дякую. (зворотний зв'язок 1.0.11)
Якуб Кулхан

3
Це спрацювало. Я не був повністю зрозумілий, що INFOповідомлення журналу теж зникнуть, але насправді вони є. Я знаю, що відповідь говорить це, але мені чомусь це було не ясно. Щоб бути чітким: вирішіть проблему з кодером / макетом, і не тільки попереджувальні повідомлення відійдуть, але й інформаційні повідомлення також відійдуть, навіть якщо вони не пов'язані з проблемою.
Джейсон

3
Не працював з атрибутом налагодження, але працював бездоганно зі слухачем статусу.
Амеба Спуньоса

Спасибі - потрібний слухач статусу.
Єзекіїль Віктор

2
Обережно при використанні цього підходу він, здається, працює, але він приховує той факт, що у вашому файлі помилка конфігурації. Справжньою проблемою є журнали WARN, ці проблеми слід виправити в config, тоді всі журнали inc. ІНФО відійти.
текнопаул

45

Як описано в документах , якщо під час розбору конфігураційного файлу трапляються попередження або помилки, зворотний зв'язок автоматично надрукує дані про стан на консолі.

Дотримуйтесь http://logback.qos.ch/codes.html#layoutInsteadOfEncoder, тобто посилання, яке згадується при вході в своєму попереджувальному повідомленні. Після того, як ви будете виконувати вказані в ній кроки, тобто якщо ви заміните елемент <layout> на <encoder>, зворотний зв'язок припинить друкувати повідомлення на консолі.


4
Начебто праворуч, хоча ти мене вказував у правильному напрямку. Я змінив синтаксис цього кодера без ефекту, хоча виявилося, що видалення іншого рядка в logback.xml, що викликало попередження, зробило свою справу. Обманлива річ у тому, що на виході здається, що виводиться рішення, прийняті до того, як він насправді аналізує ваш файл зворотного зв'язку, (1> Не вдалося знайти ресурс [logback.groovy], 2> Знайдений ресурс [logback-test.xml]). Це досить заплутане виправлення в тесті зворотного зв'язку, щоб приховати повідомлення про стан того, що відбувається до того, як воно буде проаналізовано. Але дякую за вказівник.
Стів Б.

5
Я думаю, що Стів Б. мав на увазі те, що протизаконний (або, принаймні, нетрадиційний) спосіб Logback повинен придушувати всі повідомлення про стан, включаючи (і особливо) ті, що передують завантаженню конфігураційного файлу, якщо пізніше в конфігурації не трапляється помилка. Якщо ви не знайомі з цим правилом і вперше бачите ці повідомлення про стан (які мають на увазі попередження про помилку конфігурації або помилку), більшість користувачів очікують, що після усунення помилки Logback більше не надрукує відповідні повідомлення про помилки, але продовжить друкувати інші повідомлення про стан
Дерек Махар

6
FWIW, я також вважаю це досить заплутаною поведінкою. Зростання повідомлень рівня INFO робить досить непоганою роботою приховування повідомлень про ПОМИЛУ, що повідомляють мені, що мені насправді потрібно виправити. Відсутність DTD або будь-яка інша специфікація синтаксису файлу конфігурації зробила досить пробним налагодження навіть після того, як я помітив повідомлення.
Том Андерсон

4
@Ceki: Нарешті я зрозумів: Другий спосіб запустити ці повідомлення - це debug="true"атрибут у configurationелементі logback.xml. Будь ласка, згадайте про це на благо інших людей, які потрапляють у цю діру!
Карл Смотрич

6
Можливо, перед першим твердженням про INFO повинно бути "Попередження виявлено, виводиться вся попередня інформація про стан. Щоб припинити це повідомлення, виправте свої попередження / помилки '
Девід Руссель

7

Відповідь Чекі правильна:

(...) якщо під час розбору файлу конфігурації трапляються попередження або помилки, зворотний зв'язок автоматично надрукує дані про стан на консолі.

Як тільки ви правильно це зробите, в перших рядках вашого журналу більше не буде забруднень.

Станом на березень 2015 року в Logback 1.1.2 вам потрібно використовувати <encoder>підкомпонент - <layout>тепер застарілий, і якщо його використовувати, з’являться повідомлення про помилки. Ви не можете контролювати це, це поведінка за замовчуванням у режимі " Зворотний зв'язок" .

Деякі внутрішні класи теж були перейменовані, і навіть приклади на їхній сторінці керівництва застаріли!

Ось фрагмент коду зі сторінки довідки про помилки коду , яка має правильний спосіб налаштування реєстратора. Це повністю вирішило це питання в моєму проекті. 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

Я зрозумів, що Стів знайшов виправлення, але він не згадував про це в потоці. У випадку, якщо будь-яка інша людина потрапила на ту саму проблему, тут це виправлення.

Замініть елементи "<layout>" на "<encoder> .. </encoder>"

Винуватець: <layout class = "ch.qos.logback.classic.PatternLayout">


1
Якщо ви хочете повністю видалити ці повідомлення, використовуйте NopStatusListener, як описано в Rasmus. Підхід кодер-макет не пригнічує такі повідомлення, як "logback.groovy not found", наприклад. Я використовую класичний зворотній зв'язок 1.1.3 (березень 2015 року)
Крістіан Ботіза

3

Я і сам зіткнувся з тією ж проблемою, тобто на початку було купі рядків, які не були пов'язані з моїм кодом. Ось як я це виправив.

<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

Здається, це зафіксовано в 0.9.29. Просто зробив кілька тестів. Більше немає жодної ІНФОРМАЦІЇ Я думаю, що це фіксуюча фіксація.


2

У мене була така ж проблема, я додав цей рядок

        <!-- Stop output INFO at start -->
        <statusListener class="ch.qos.logback.core.status.NopStatusListener" />

під час реєстрації, і він успішно працював


Це працює, однак це також запобігає виведенню повідомлень про ПОМИЛКУ - не виникає жодного виходу, коли виникає серйозна проблема конфігурації входу.
Хонза

0

Я все пробував, і мені нічого не вийшло. Моя проблема була через кілька файлів logback.xml у моєму класі. Це звичайний випадок у мультимодульних проектах. Якщо у класі class є лише один файл logback.xml, то неоднозначності немає і проблема вирішена.


який вихід вам дав?
rogerdpack

0

Використання logback.groovy:statusListener(NopStatusListener)src/test/resources/logback.groovy) робіт.

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


0

Я вважаю за краще використовувати слухач статусу, щоб вимкнути власні журнали входу:

<configuration>
  <statusListener class="ch.qos.logback.core.status.NopStatusListener" />
  ...
</configuration>

Але, як згадувалося, NopStatusListener також запобігає показу попередження та помилок. Таким чином, ви можете написати власний слухач статусу та змінити рівень журналу для нього вручну:

package com.your.package;

import ch.qos.logback.core.status.OnConsoleStatusListener;
import ch.qos.logback.core.status.Status;

import java.util.List;

public class PrintOnlyWarningLogbackStatusListener extends OnConsoleStatusListener {

    private static final int LOG_LEVEL = Status.WARN;

    @Override
    public void addStatusEvent(Status status) {
        if (status.getLevel() == LOG_LEVEL) {
            super.addStatusEvent(status);
        }
    }

    @Override
    public void start() {
        final List<Status> statuses = context.getStatusManager().getCopyOfStatusList();
        for (Status status : statuses) {
            if (status.getLevel() == LOG_LEVEL) {
                super.start();
            }
        }
    }

}    

Потім використовуйте його у файлі logback.xml:

<configuration>
  <statusListener class="com.your.package.PrintOnlyWarningLogbackStatusListener" />
  ...
</configuration>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.