Java 로깅 API를 사용하는 동안 기본 콘솔 핸들러를 비활성화하려면 어떻게해야합니까?
안녕하세요, 내 응용 프로그램에서 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. ??");
}
}
기본 콘솔 핸들러는 사용자를 포함한 다른 모든 로거의 상위 인 루트 로거에 연결됩니다. 따라서 문제를 해결하는 두 가지 방법이 있습니다.
If this is only affects this particular class of yours, the simplest solution would be to disable passing the logs up to the parent logger:
logger.setUseParentHandlers(false);
If you want to change this behaviour for your whole app, you could remove the default console handler from the root logger altogether before adding your own handlers:
Logger globalLogger = Logger.getLogger("global");
Handler[] handlers = globalLogger.getHandlers();
for(Handler handler : handlers) {
globalLogger.removeHandler(handler);
}
Note: if you want to use the same log handlers in other classes too, the best way is to move the log configuration into a config file in the long run.
Just do
LogManager.getLogManager().reset();
This is strange but Logger.getLogger("global")
does not work in my setup (as well as Logger.getLogger(Logger.GLOBAL_LOGGER_NAME)
).
However Logger.getLogger("")
does the job well.
Hope this info also helps somebody...
Do a reset of the configuration and set the root level to OFF
LogManager.getLogManager().reset();
Logger globalLogger = Logger.getLogger(java.util.logging.Logger.GLOBAL_LOGGER_NAME);
globalLogger.setLevel(java.util.logging.Level.OFF);
You must instruct your logger not to send its messages on up to its parent logger:
...
import java.util.logging.*;
...
Logger logger = Logger.getLogger(this.getClass().getName());
logger.setUseParentHandlers(false);
...
However, this should be done before adding any more handlers to logger.
'IT story' 카테고리의 다른 글
Eclipse ctrl + right는 아무것도하지 않습니다. (0) | 2020.09.08 |
---|---|
C ++ 전 처리기 __VA_ARGS__ 인수 개수 (0) | 2020.09.08 |
비활성화 된 입력 필드의 값 제출 (0) | 2020.09.08 |
SQL에서 StringBuilder를 사용하는 올바른 방법 (0) | 2020.09.08 |
ASP.NET Web Api : 요청 된 리소스가 http 메서드 'GET'을 지원하지 않습니다. (0) | 2020.09.08 |