Java logging API를 사용하는 동안 기본 콘솔핸들러를 디세블로 하려면 어떻게 해야 하나요?
안녕하세요. 어플리케이션에 자바 로깅을 구현하려고 합니다.핸들러를 2개 사용하고 싶습니다.파일 핸들러와 내 콘솔 핸들러내 핸들러는 둘 다 잘 작동합니다.로그는 파일과 콘솔로 전송됩니다.로그는 기본 콘솔핸들러에도 송신됩니다.이 핸들러는 필요 없습니다.내 코드를 실행하면 콘솔로 두 줄 더 전송됩니다.기본 콘솔 핸들러를 사용하지 않습니다.디폴트 콘솔핸들러를 디세블로 하는 방법을 알고 있는 사람이 있습니까?작성한 핸들러 2개만 사용합니다.
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. ??");
}
}
그냥 해
LogManager.getLogManager().reset();
기본 콘솔 핸들러는 루트 로거에 연결되어 있으며 루트 로거는 사용자를 포함한 다른 모든 로거의 부모입니다.두 가지 방법으로 문제를 해결할 수 있습니다.
이것이 특정 클래스에만 영향을 미치는 경우 가장 간단한 해결책은 로그를 부모 로거에 전달하지 않도록 설정하는 것입니다.
logger.setUseParentHandlers(false);
전체 앱에서 이 동작을 변경하려면 자체 핸들러를 추가하기 전에 루트 로거에서 기본 콘솔 핸들러를 모두 제거할 수 있습니다.
Logger globalLogger = Logger.getLogger("global");
Handler[] handlers = globalLogger.getHandlers();
for(Handler handler : handlers) {
globalLogger.removeHandler(handler);
}
주의: 다른 클래스에서도 동일한 로그핸들러를 사용하는 경우 로그 설정을 장기적으로 설정 파일로 이동하는 것이 가장 좋습니다.
하지만 이 this이 this this Logger.getLogger("global")
셋업에서는 동작하지 않습니다(또한Logger.getLogger(Logger.GLOBAL_LOGGER_NAME)
를 참조해 주세요.
, <고객명>님Logger.getLogger("")
그 일을 잘 한다.
이 정보가 누군가에게 도움이 되길...
구성을 리셋하고 루트 레벨을 OFF로 설정합니다.
LogManager.getLogManager().reset();
Logger globalLogger = Logger.getLogger(java.util.logging.Logger.GLOBAL_LOGGER_NAME);
globalLogger.setLevel(java.util.logging.Level.OFF);
로거가 부모 로거에 메시지를 보내지 않도록 지시해야 합니다.
...
import java.util.logging.*;
...
Logger logger = Logger.getLogger(this.getClass().getName());
logger.setUseParentHandlers(false);
...
단, 이는 핸들러를 로거에 추가하기 전에 실행해야 합니다.
언급URL : https://stackoverflow.com/questions/2533227/how-can-i-disable-the-default-console-handler-while-using-the-java-logging-api
'programing' 카테고리의 다른 글
laravel composer update : 요청된 PHP 확장자 dom이 시스템에 없습니다. (0) | 2022.11.07 |
---|---|
mysql2 설치 오류: gem 네이티브 확장을 빌드하지 못했습니다. (0) | 2022.11.07 |
Laravel Archent가 변경된 경우에만 업데이트 (0) | 2022.11.07 |
다시 그리기 위해 캔버스를 지우는 방법 (0) | 2022.11.07 |
(String) or .toString()? (0) | 2022.11.07 |