모든 로그가 시작될 때 로그 백이 자체 상태를 출력하지 못하게하는 방법은 무엇입니까?


145

이것은 부주의 오류처럼 보이지만 원인을 찾을 수없는 것 같습니다. logback / slf4j로 로깅 (가장 최근 버전 slf4j-api-1.6.1, logback core / 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">이에 영향을 미치지 않는 구성 매개 변수 가 있습니다.

이것을 끄는 방법을 아는 사람이 있습니까?


최신 버전의 로그 백은 % L을 계산할 때 훨씬 빠릅니다.
Thorbjørn Ravn Andersen은

@ ThorbjørnRavnAndersen 문서는 "L / line : 줄 번호 정보를 생성하는 것이 특히 빠르지 않으므로 실행 속도가 문제가되지 않는 한 사용을 피해야합니다." FWIW : logback.qos.ch/manual/layouts.html (아마도 빠르지 만 여전히 빠르지는 않지만 ...)
rogerdpack

@ rogerdpack 예. 예외의 스택 추적을 분석하여 발견됩니다. 더 빨라졌습니다.
Thorbjørn Ravn Andersen '12

답변:


249

요소 의 debug속성 을로 설정하면 모든 상태 정보가 콘솔에 표시됩니다. 이것이 문제라면 false로 설정하거나 제거하십시오.configurationtrue

레벨 WARN이상의 구성 문제가있는 경우 모든 상태 정보 (레벨의 메시지 포함)를 콘솔에 기록합니다 INFO. 이 문제에 대한 가장 좋은 해결책은 문제를 해결하는 것입니다 (귀하의 경우 <layout>요소를 요소로 교체 <encoder>).

어떤 이유로 문제를 해결할 수 없지만 콘솔에서 상태 정보를 제거하려는 경우 다른 방법을 대신 구성 할 수 있습니다 StatusListener. 를 사용하여 NopStatusListener상태 정보를 완전히 제거하십시오.

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

9
정답입니다. 더 많이 찬성해야합니다. 감사합니다. (
로그 백

3
이것은 효과가 있었다. INFO로그 메시지도 사라질지 는 확실하지 않지만 실제로는 사라집니다. 나는 대답이 이것을 알고 있지만 어떤 이유로 든 나에게 분명하지 않았습니다. 명확하게 말하면 : 인코더 / 레이아웃 문제를 해결하고 경고 메시지가 사라질뿐만 아니라 정보 메시지도 문제와 관련이 없더라도 사라집니다.
Jason

3
디버그 속성으로 작동하지 않았지만 상태 리스너에서는 결함이있었습니다.
Ameba Spugnosa 2016 년

감사합니다-필요한 상태 리스너.
에스겔 빅터

2
이 방법을 신중하게 사용하면 작동하는 것처럼 보이지만 파일에 구성 오류가 있다는 사실을 숨 깁니다. 실제 문제는 WARN 로그이며 이러한 문제는 구성에서 수정 한 다음 모든 로그를 수정해야합니다. 정보가 사라집니다.
teknopaul

45

따라 해당 문서에 설명 된 경고 나 오류가 구성 파일의 구문 분석하는 동안 발생하는 경우, logback 자동으로 콘솔에 상태 데이터를 인쇄합니다.

http://logback.qos.ch/codes.html#layoutInsteadOfEncoder, 즉 경고 메시지에서 logback이 언급 한 링크를 따르십시오 . 여기에 언급 된 단계, 즉 <layout> 요소를 <encoder>로 바꾸면 로그 백은 콘솔에서 메시지 인쇄를 중지합니다.


4
당신이 나를 올바른 방향으로 지적했지만, 일종의 맞습니다. logback.xml에서 경고를 일으킨 다른 줄을 제거하면 트릭이 발생했지만 효과없이 해당 인코더 구문으로 변경했습니다. 그것에 대한기만적인 사실은 출력이 실제로 로그 백 파일을 구문 분석하기 전에 내려진 결정을 출력하는 것 같습니다 (1> 리소스 [logback.groovy], 2> 발견 된 리소스 [logback-test.xml]). 로그 백 테스트의 수정으로 인해 구문 분석되기 전에 발생하는 상황에 대한 상태 메시지를 숨기는 것은 상당히 혼란 스럽습니다. 그러나 포인터 주셔서 감사합니다.
Steve B.

5
Steve B.가 의미하는 바는 구성에서 나중에 오류가 발생하지 않는 한 Logback이 구성 파일을로드하기 전에 오는 모든 상태 메시지를 포함하여 모든 상태 메시지를 억제해야한다는 것은 직관적이지 않다는 것입니다. 이 규칙에 익숙하지 않고 먼저 이러한 상태 메시지 (구성 경고 또는 오류를 암시 함)를 볼 때 대부분의 사용자는 일단 오류가 해결되면 Logback이 더 이상 관련 오류 메시지를 인쇄하지 않지만 다른 오류 메시지는 계속 인쇄 할 것으로 예상합니다. 상태 메시지.
Derek Mahar

6
FWIW, 나는 또한 매우 혼란스러운 행동을 발견합니다. 정보 수준 메시지의 유출은 실제로 수정해야 할 내용을 알려주는 ERROR 메시지를 숨기는 데 도움이됩니다. DTD가 없거나 구성 파일 구문의 다른 사양이 없어서 메시지를 발견 한 후에도 디버깅하는 것이 상당히 재판적이었습니다.
Tom Anderson

4
@ Ceki : 마침내 알아 냈습니다.이 메시지를 트리거하는 두 번째 방법 debug="true"은의 configuration요소에 속성을 갖는 것입니다 logback.xml. 이 구멍에 빠진 다른 사람들의 이익을 위해 이것을 언급하십시오!
Carl Smotricz

6
아마도 첫 번째 INFO 문 전에 '경고가 감지되어 모든 과거 상태 정보를 출력합니다. 이 메시지를 중지하려면 경고 / 오류를 수정하십시오 '
David Roussel

7

Ceki 답변은 정확합니다.

(...) 구성 파일을 구문 분석하는 동안 경고 또는 오류가 발생하면 로그 백은 콘솔에 자동으로 상태 데이터를 인쇄합니다.

일단 당신이 그것을 올바르게 찾으면, 더 이상 로그의 첫 줄에 오염이 없을 것입니다.

2015 년 3 월 기준 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

Steve가 수정 프로그램을 찾았다는 사실을 깨달았지만 스레드에 대해서는 언급하지 않았습니다. 다른 사람이 같은 문제를 겪는 경우 여기에 해결책이 있습니다.

대체 "<레이아웃>" 와 엘리먼트 "<인코더> .. </ 인코더>"

범인은 다음과 같습니다. <layout class = "ch.qos.logback.classic.PatternLayout">


1
해당 메시지를 완전히 제거하려면 Rasmus에 설명 된대로 NopStatusListener를 사용하십시오. 인코더 대 레이아웃 방식은 예를 들어 'logback.groovy를 찾을 수 없음'과 같은 메시지를 표시하지 않습니다. 나는 logback 고전 1.1.3 (2015 월) 사용하고 있습니다
크리스티안 Botiza

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" />

로그 백에서 성공적으로 작동했습니다.


이것은 작동하지만 ERROR 메시지 출력도 방지합니다. 심각한 로그 백 구성 문제가 발생하면 출력이 생성되지 않습니다.
혼자

0

나는 모든 것을 시도했지만 아무것도 나를 위해 일하지 않았다. 내 문제는 클래스 경로에 여러 logback.xml 파일이 있기 때문입니다. 이것은 다중 모듈 프로젝트에서 일반적입니다. 클래스 경로에 logback.xml 파일이 하나만 있으면 모호성이없고 문제가 해결됩니다.


어떤 결과를 얻었습니까?
rogerdpack

0

은 Using logback.groovy:statusListener(NopStatusListener) 합니다 (의 src/test/resources/logback.groovy작품).

(유효한 유스 케이스는 예를 들어, Eclipse에서 ANT로 작업하는 경우 로그 백 로깅, 그루비 클래스 및 단위 테스트에서 단위 테스트를 수행하는 단위 테스트를 사용 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>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.