[英]Why are some logs not caught by log4j?
我已經將log4j配置為在容器中記錄后端,但是顯然不是所有日志都通過log4j進行了過濾。
來自應用程序的日志將按預期寫入到我的控制台/日志文件。
例如,我使用的是openwebbeans,即使該庫內部在使用log4j,該庫中的日志仍采用默認格式並寫入系統。
為什么我的log4j配置沒有將那些日志語句定向到我的控制台/日志文件? 我希望它們至少會被寫入根記錄器,但是它們不會通過根記錄器寫入的附加程序。
log4j.appender.Stdout=org.apache.log4j.ConsoleAppender
log4j.appender.Stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.Stdout.layout.conversionPattern=%d{yyyy-MM-dd HH:mm:ss}|%-5p|%c|%m%n
log4j.rootLogger=DEBUG,Stdout
log4j.logger.org.apache.wicket=INFO
log4j.logger.org.apache.webbeans=WARN
...
感謝上面Mark的評論,我設法通過配置java.util.logging重定向到slf4j來解決我的問題。 這不是一個優雅的解決方案,但出於我需要的目的,它已足夠:
private static void configureJavaUtilLogging() {
final java.util.logging.Logger rootLogger = java.util.logging.Logger.getLogger("");
for (final java.util.logging.Handler handler : rootLogger.getHandlers()) {
handler.setLevel(Level.OFF);
}
rootLogger.setLevel(Level.INFO);
rootLogger.addHandler(new java.util.logging.Handler() {
@Override
public void publish(final LogRecord record) {
final Logger log = LoggerFactory.getLogger(record.getSourceClassName());
if (record.getLevel() == Level.SEVERE) {
if (record.getThrown() == null) {
log.error(record.getMessage());
} else {
log.error(record.getMessage(), record.getThrown());
}
} else if (record.getLevel() == Level.WARNING) {
log.warn(record.getMessage());
} else if (record.getLevel() == Level.INFO) {
log.info(record.getMessage());
} else {
log.debug(record.getMessage());
}
}
@Override
public void flush() {
}
@Override
public void close() throws SecurityException {
}
});
}
這樣,我可以在一個配置中為每個人配置日志輸出。 基本上,上面的代碼將覆蓋存儲在jdk或jre中某個位置的java.util.logging的默認配置。
我不確定該使用flush
和close
方法。 在生產環境中使用此類東西之前,需要先進行檢查。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.