Java 로깅 API를 사용하는 동안 기본 콘솔 핸들러를 비활성화하려면 어떻게해야합니까?


92

안녕하세요, 내 응용 프로그램에서 Java 로깅을 구현하려고합니다. 두 개의 핸들러를 사용하고 싶습니다. 파일 핸들러와 내 콘솔 핸들러. 내 핸들러 모두 잘 작동합니다. 내 로깅은 파일과 콘솔로 전송됩니다. 내 로깅은 내가 원하지 않는 기본 콘솔 핸들러로도 전송됩니다. 내 코드를 실행하면 콘솔에 추가로 두 줄이 전송되는 것을 볼 수 있습니다. 기본 콘솔 핸들러를 사용하고 싶지 않습니다. 누구든지 기본 콘솔 처리기를 비활성화하는 방법을 알고 있습니까? 내가 만든 두 개의 핸들러 만 사용하고 싶습니다.

Handler fh = new FileHandler("test.txt");
fh.setFormatter(formatter);
logger.addHandler(fh);

Handler ch = new ConsoleHandler();
ch.setFormatter(formatter);
logger.addHandler(ch);

import java.util.Date;
import java.util.logging.ConsoleHandler;
import java.util.logging.FileHandler;
import java.util.logging.Formatter;
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.LogManager;
import java.util.logging.LogRecord;
import java.util.logging.Logger;

public class LoggingExample {
    private static Logger logger = Logger.getLogger("test");

    static {
        try {
            logger.setLevel(Level.INFO);

            Formatter formatter = new Formatter() {

                @Override
                public String format(LogRecord arg0) {
                    StringBuilder b = new StringBuilder();
                    b.append(new Date());
                    b.append(" ");
                    b.append(arg0.getSourceClassName());
                    b.append(" ");
                    b.append(arg0.getSourceMethodName());
                    b.append(" ");
                    b.append(arg0.getLevel());
                    b.append(" ");
                    b.append(arg0.getMessage());
                    b.append(System.getProperty("line.separator"));
                    return b.toString();
                }

            };

            Handler fh = new FileHandler("test.txt");
            fh.setFormatter(formatter);
            logger.addHandler(fh);

            Handler ch = new ConsoleHandler();
            ch.setFormatter(formatter);
            logger.addHandler(ch);

            LogManager lm = LogManager.getLogManager();
            lm.addLogger(logger);
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        logger.info("why does my test application use the standard console logger ?\n" + " I want only my console handler (Handler ch)\n " + "how can i turn the standard logger to the console off. ??");
    }
}

1
나는 조심스럽게 사용하는 것이 좋습니다 수 b.append(formatMessage(arg0))대신 b.append(arg0.getMessage()). 이 formatMessage방법을 사용하면 포맷터를 사용 public void log(Level level, String msg, Object param1)및 유사한 방법과 호환됩니다 .
Victor

답변:


102

기본 콘솔 핸들러는 사용자를 포함한 다른 모든 로거의 상위 인 루트 로거에 연결됩니다. 따라서 문제를 해결하는 두 가지 방법이 있습니다.

이것이이 특정 클래스에만 영향을 미치는 경우 가장 간단한 해결책은 로그를 상위 로거로 전달하지 않는 것입니다.

logger.setUseParentHandlers(false);

전체 앱에 대해이 동작을 변경하려면 자체 핸들러를 추가하기 전에 루트 로거에서 기본 콘솔 핸들러를 모두 제거 할 수 있습니다.

Logger globalLogger = Logger.getLogger("global");
Handler[] handlers = globalLogger.getHandlers();
for(Handler handler : handlers) {
    globalLogger.removeHandler(handler);
}

참고 : 다른 클래스에서도 동일한 로그 핸들러를 사용하려는 경우 가장 좋은 방법은 장기적으로 로그 구성을 구성 파일로 이동하는 것입니다.


2
setUseParentHandlers 메서드가 작동합니다. 루트 로거에서 기본 콘솔 처리기를 제거하려면 어떻게해야합니까?
loudiyimo

10
Logger.getLogger ( "")를 사용할 수도 있습니다. "글로벌"이 아닌 곳에서 작동합니다 (믹스에서 SLF4J의 결과 일 수 있습니까?)
sehugg

2
당신은 SLF4J를 원하는 경우에 나는 당신이 사용하는 것이 좋습니다 LogManager.getLogManager().reset(); SLF4JBridgeHandler.install();
Somatik

8
""는 루트 로거의 식별자입니다. "글로벌"은 기본적으로 만들어집니다 및 간단한 로깅 시나리오에서 사용되어야한다 명명 된 로거 (루트의 하위)입니다
파올로 Fulgoni

1
이 대답은 나를 위해 작동하지 않고 도미니크에 의해 하나는 않습니다
BullyWiiPlaza

108

그냥 해

LogManager.getLogManager().reset();

1
감사합니다. 정답입니다. 정답으로 표시된 답변이 작동하지 않습니다.
Andreas L.

1
이것은 이것이 Logger더 복잡한 로그 시스템에 문제가 될 수 있도록 모든 명명 된 핸들러에 영향을 미칠 것이라는 점을 지적해야 합니다. 향후 로거가 영향을받지 않도록하려면 프로세스 시작시 한 번 호출해야합니다. 물론 콘솔이 필요한 사람 ConsoleHandler은 예상대로 to 를 받아야합니다 .
AxelH

20

이것은 이상하지만 Logger.getLogger("global") 내 설정에서 작동하지 않습니다 (뿐만 아니라 Logger.getLogger(Logger.GLOBAL_LOGGER_NAME)).

그러나 Logger.getLogger("")일을 잘합니다.

이 정보가 누군가에게 도움이되기를 바랍니다 ...


3
누군가 getLogger (Logger (Logger.GLOBAL_LOGGER_NAME)는 작동하지 않지만 getLogger ( "")는 작동하는 이유를 알려줄 수 있습니까?)
deinocheirus

2
@deinocheirus이 내 의견을 참조 대답
파올로 Fulgoni

9

구성을 재설정하고 루트 수준을 OFF로 설정합니다.

LogManager.getLogManager().reset();
Logger globalLogger = Logger.getLogger(java.util.logging.Logger.GLOBAL_LOGGER_NAME);
globalLogger.setLevel(java.util.logging.Level.OFF);

5

상위 로거까지 메시지를 보내지 않도록 로거에 지시해야합니다.

...
import java.util.logging.*;
...
Logger logger = Logger.getLogger(this.getClass().getName());
logger.setUseParentHandlers(false);
...

그러나 로거에 핸들러를 더 추가하기 전에이 작업을 수행해야합니다.


이 로거에 수동으로 핸들러를 추가해야했지만 제 경우에는 작동했습니다.
Sachin Gorade
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.