Отключить весь вывод журнала на консоль?

Как настроить Logback для подавления всего его вывода на консоль (стандартный вывод)? В частности, я хочу подавлять (или перенаправлять) собственные журналы журнала, такие как:

16:50:25,814 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback-test.xml]
16:50:25,814 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Found resource [logback.xml] at [file:/opt/dap/domains/ap0491/uat1/domain/instance-config/logback.xml]
16:50:25,816 |-WARN in ch.qos.logback.classic.LoggerContext[default] - Resource [logback.xml] occurs multiple times on the classpath.
16:50:25,816 |-WARN in ch.qos.logback.classic.LoggerContext[default] - Resource [logback.xml] occurs at [file:/opt/dap/domains/ap0491/uat1/domain/instance-config/logback.xml]
16:50:25,816 |-WARN in ch.qos.logback.classic.LoggerContext[default] - Resource [logback.xml] occurs at [file:/opt/dap/domains/ap0491/uat1/domain/instance-config/logback.xml]
16:50:25,923 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - debug attribute not set
16:50:25,924 |-INFO in [email protected] - Will scan for changes in file [/opt/dap/domains/ap0491/uat1/domain/instance-config/logback.xml] every 60 seconds. 

Мне нужно отключить все протоколирование до стандартного вывода, потому что наша производственная среда запрещает приложениям печатать сообщения на стандартный вывод.

Примечание. Я использую Logback 0.9.21, SLF4J 1.6.0, и наше приложение работает в WebLogic 10.3.2.

Ответ 1

Хольгер Хоффштетт был прав в своем диалоге , что дублирующее сообщение о входе в класс пути является симптомом ошибка в том, как Logback подсчитывает записи в классе. Роберт Эллиот также охарактеризовал проблему в thread on журнал список рассылки пользователей. Согласно Роберту и другим в этом связанном disussion в списке рассылки SLF4J, когда приложение, использующее Logback, запускается в контейнере WebLogic, из-за как работает загрузчик классов WebLogic, отчеты об ошибках дублируют записи в классе для конфигурационного файла logback.xml. Однако, независимо от того, должен ли загрузчик классов WebLogic должен или не должен указывать только уникальные записи в classpath, Logback должен обязательно подсчитывать только уникальные записи pathpath, чтобы он не печатал это запутанное ложное сообщение.

Я применил fix для LBCLASSIC-159 что по существу делает то, что Роберт Эллиот рекомендует и использует набор вместо списка для хранения ресурсов, возвращаемых загрузчиком классов, эффективно устраняя любые дублированные ресурсы класса. Я успешно протестировал исправление с помощью Logback 0.9.24, SLF4J 1.6.1 и WebLogic 10.3.2. Как предсказал Thorbjørn в своем ответе , с этим исправлением в журнале Logback больше не отображается дублирующее сообщение о статусе пути пути (или любое другое информационное сообщение) к стандартным выводам.

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

Ответ 2

Эти сообщения показывают, действительно ли хотя бы одно из следующих значений:

  • У вас есть отладка включена в файле logback.xml
  • у вас есть ошибка в вашей конфигурации. В этом случае - logback жалуется на обнаружение нескольких файлов конфигурации.
  • существует проблема с classpath, если ваша среда предоставляет конфликтующие файлы. (вчера это произошло со мной и было настоящей причиной этого вопроса).
  • (есть ошибка в logback - произошло)

Исправить проблему, и эти сообщения должны исчезнуть.

Ответ 3

Это ответ "я тоже", извините!

К счастью, я нашел решение (см. UPDATE) ниже.

Вопреки некоторым другим ответам, я получаю поток конфигурационных сообщений LogBack INFO, несмотря на отсутствие ERROR или WARN на фазе конфигурации.

Вот мои сообщения:

13:39:20,457 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.groovy]
13:39:20,457 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback-test.xml]
13:39:20,457 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Found resource [logback.xml] at [file:/home/carl/workspace-LSY/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/IceProfile/WEB-INF/classes/logback.xml]
13:39:20,496 |-INFO in [email protected] - Will scan for changes in file [/home/carl/workspace-LSY/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/IceProfile/WEB-INF/classes/logback.xml] every 60 seconds. 
13:39:20,496 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - Adding ReconfigureOnChangeFilter as a turbo filter
13:39:20,497 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.ConsoleAppender]
13:39:20,501 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [STDOUT]
13:39:20,510 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for [encoder] property
13:39:20,510 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Pushing component [encoder] on top of the object stack.
13:39:20,537 |-INFO in ch.qos.logback.classic.joran.action.RootLoggerAction - Setting level of ROOT logger to DEBUG
13:39:20,537 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [STDOUT] to Logger[ROOT]
13:39:20,538 |-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting level of logger [ch.qos.logback] to OFF
13:39:20,538 |-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting additivity of logger [ch.qos.logback] to false
13:39:20,538 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - End of configuration.

Здесь моя конфигурация:

<configuration debug="true" scan="true"> 

  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
    <!-- encoders are  by default assigned the type
         ch.qos.logback.classic.encoder.PatternLayoutEncoder -->
    <encoder>
      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
  </appender>

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

  <logger name="ch.qos.logback" level="OFF" additivity="false" />

</configuration>

Это спам, которого я не хочу, я считаю себя невиновным из-за его провокации, и я был бы признателен за помощь в избавлении от него.

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

Версии:

  • Logback-классический 0.9.24.jar
  • Logback-ядро-0.9.24.jar
  • SLF4J-апи-1.6.1.jar
  • выполняется в приложении IceFaces 2.0, работающем в Tomcat 6.0 под Ubuntu 11.04

UPDATE

Наконец выяснилось, в чем проблема!

Из точное руководствоответ Thorbjørn):

Установка атрибута отладки внутри элемента будет выводить информацию о состоянии в предположении, что

  • найден файл конфигурации
  • конфигурационный файл имеет хорошо сформированный XML.

Моя ошибка была

<configuration debug="true" scan="true"> 

В ретроспективе, дух! Надеюсь, эта информация поможет другим.

Ответ 4

Итак, у меня была та же проблема, но обнаружил, что удаление неправильной записи < layout/" > , которая была устарела где-то около 0.9.4, и сообщения ушли...

Вы должны выглядеть примерно так:

<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">

 <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
  <level>info</level>
 </filter>

 <encoder>
  <pattern>%d{yyyy-MM-dd} %d{HH:mm:ss} %.-1level %thread %logger{36}: %m%n</pattern>
 </encoder>

</appender>

Я написал о более полное описание того, что я изменил, что сработало для меня

Ответ 5

Я не знаком с Logback. Но если он печатает до System.out или System.err, это просто публичные статические переменные PrintStream в классе System. Вы можете подклассифицировать PrintStream и установить системные выходные переменные в ваш подкласс, тем самым контролируя, как это работает.

Например:

public class NOPPrintStream extends PrintStream
{
    public NOPPrintStream() { super((OutputStream)null); }

    public void println(String s) { /* Do nothing */ }
    // You may or may not have to override other methods
}

public class MyClass
{
    public static void main(String[] args)
    {
        System.out = new NOPPrintStream();
        // Start program
    }
}

(Этот код не проверен)

Ответ 6

Фактически тот факт, что одно и то же имя logback.xml сообщается несколько раз, больше похоже на ошибку в logback, чем что-либо еще. Либо сообщите об этом в журнал JIRA (здесь), либо сначала проверьте, является ли рассматриваемая банка многократной переменной класса.

Ответ 7

В моем случае у меня был "logback-test.xml" в зависимом проекте, который развертывался как баннер webapp. Файл "logback-test.xml" начинался с

<configuration debug="false" scan="true">

Атрибут 'scan = "true" "сгенерировал эту ошибку:

ERROR in [email protected] - URL [jar:file:/C:/Local...cut.../WEB-INF/lib/My.Dev.jar!/logback-test.xml] is not of type file

что привело к 67 (!) более INFO-линиям.

Удалив атрибут "scan =" true "", журнал журнала исчез полностью.

Ответ 8

У вас, скорее всего, есть элемент, настроенный в вашем файле logback.xml. Вы можете удалить его, если вам не нужны какие-либо обновления консоли о состоянии самой системы ведения журнала. Несмотря на это, система резервирования рекомендует отключить ее для устранения неполадок.

Существует альтернатива слушателю консоли, называемому StatusListenerAsList, который сохраняет сообщения о состоянии как частный список. Вы можете разоблачить его через JMX, если необходимо, с небольшим количеством кода.

Ответ 9

Я просто хочу добавить информацию о сообщении заголовка по умолчанию, добавленном в logback 1.0.2:

#logback.classic pattern: %d [%thread] %-5level %logger{36} - %msg%n

Я обнаружил, что в новости журнала, но было действительно трудно найти.

Если вы хотите удалить это сообщение, вам нужно настроить outputPatternAsPresentationHeader на false:

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <pattern>%d %-5level [%thread] %logger{0}: %msg%n</pattern>
        <!-- do not print pattern as a header -->
        <outputPatternAsPresentationHeader>false</outputPatternAsPresentationHeader>
    </encoder>
</appender>