log4j 로그 통합 출력(slf4j+commonslog+log4j+jdklogger)
7544 단어 commons
J2EE 프로젝트 에 서 는 제3자 의 오픈 소스 구성 요소 와 소프트웨어 를 자주 사용 합 니 다.이 구성 요소 들 은 모두 각자 의 로그 구성 요 소 를 사용 합 니 다.slf4j,common-log,log4j 등 을 많이 사용 합 니 다.오래된 오픈 소스 소프트웨어(TOMCAT 포함)는 JDK 14-LOGER 를 사용 합 니 다.이 로그 들 은 모두 자신 만 의 독립 적 인 설정 이 있 거나 그 중 일부 만 통합 할 수 있 습 니 다.그러나 프로젝트 를 실제 배치 할 때 모든 오픈 소스 소프트웨어 와 프로젝트 프로그램의 각종 로 그 를 로그 파일 에 통합 하여 출력 해 야 합 니 다.tomcat 를 포함 합 니 다.
본 고 는 로그 구성 요소 로 log4j 를 사용 하고 comons-log,slf4j 를 통합 기로 하 며 slf4j 브리지 jdk14-logger 를 사용 하여 log4j 로그 기 에 출력 하 는 것 을 소개 합 니 다.전체적으로 말 하면 프로젝트 에서 이 4 중 로그 출력 을 사용 하 는 모든 것 은 log 4 j 출력 을 통일 적 으로 사용 합 니 다.
1.로그 에 필요 한 가방 의존(maven dependency):
<properties>
<slf4j.version>1.7.2</slf4j.version>
<log4j.version>1.2.17</log4j.version>
</properties>
<!-- LOGGING begin -->
<!-- slf4j -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<!-- slf4j-log4j -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
</dependency>
<!-- common-logging slf4j -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>${slf4j.version}</version>
</dependency>
<!-- java.util.logging slf4j -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jul-to-slf4j</artifactId>
<version>${slf4j.version}</version>
</dependency>
<!-- log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<!-- LOGGING end -->
2.log4j 설정
log4j 의 설정 은 간단 합 니 다.일반적인 log4j.properties 파일 설정 을 사용 하면 됩 니 다.보통 classes 아래 에 놓 으 면 OK 입 니 다.웹.xml 에 상수 설정 파일 경 로 를 추가 할 수 있 습 니 다.이 상수 가 filter 로 불 러 올 때 로그 설정 을 불 러 옵 니 다.
<!--tomcat ,filter Log4j -->
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>/WEB-INF/log4j.properties</param-value>
</context-param>
<!--Spring Log4j , millisecond, log4j -->
<context-param>
<param-name>log4jRefreshInterval</param-name>
<param-value>30000</param-value>
</context-param>
일반적으로 Spring 에서 제공 하 는 org.springframework.web.util.Log4jConfigListener 를 사용 하여 tomcat 가 시 작 될 때 log4j 설정 위탁 관리 spring 의 로그 출력 설정 을 불 러 옵 니 다.
log4j.properties
log4j.rootCategory=INFO,stdout,logfile
# Spring framework log level
log4j.logger.org.springframework=INFO
# spring modules log level
#log4j.logger.org.springmodules=DEBUG
# Hibernate log level
# log4j.logger.org.hibernate=DEBUG
log4j.logger.org.hibernate.SQL=DEBUG
# Quartz log level
#log4j.logger.org.quartz=INFO
# Tomcat,commons... etc log level
#log4j.logger.org.apache=INFO
# Application log level
#sql and execute time
# log4jdbc
log4j.logger.jdbc.sqltiming=INFO
log4j.logger.jdbc.audit=OFF
log4j.logger.jdbc.resultset=OFF
log4j.logger.jdbc.sqlonly=INFO
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - <%m>%n
#\u4e3b\u65e5\u5fd7\u6587\u4ef6
log4j.appender.logfile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.logfile.File=logs/intergration.log
log4j.appender.logfile.DatePattern=.yyyy-MM-dd
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - <%m>%n
3.로그 통합
jdk14-logger 설정 파일 logger.properties 를 만 듭 니 다.Hander 설정 추가:
handlers = org.slf4j.bridge.SLF4JBridgeHandler
그리고 프로그램 이나 용 기 를 시작 할 때 JVM 인자 설정 JDK 로 그 를 SLF4JBridgeHandler 로 만 처리 합 니 다.
-Djava.util.logging.config.file=/path/logger.properties
나 는 이런 방식 을 그다지 좋아 하지 않 는 다.외부 수정 이 필요 하고 번 거 롭 고 결합 성 이 강하 다.그래서 프로 그래 밍 방식 을 추천 합 니 다.
프로 그래 밍 방식:
Spring 에서 제공 하 는 org.springframework.web.util.Log4jConfigListener 를 확장 합 니 다.TOMCAT 가 시 작 될 때 JDK 로 그 를 프로 그래 밍 방식 으로 설정 하 는 것 은 SLF4JBridgeHandler 로 만 처 리 됩 니 다.WEB 프로그램 이 아니라면 더 쉬 워 집 니 다.프로그램 MAIN 방식 으로 설정 하면 됩 니 다.
APP 프로그램 데모:
public class CommonLogAndLog4j {
private static final Log log = LogFactory.getLog(CommonLogAndLog4j.class);
private static final Logger log4jLogger = Logger.getLogger(CommonLogAndLog4j.class);
private static final java.util.logging.Logger jdkLogger = java.util.logging.Logger
.getLogger(CommonLogAndLog4j.class.getName());
private static final org.slf4j.Logger slf4jLogger = org.slf4j.LoggerFactory.getLogger(CommonLogAndLog4j.class);
// -Djava.util.logging.config.file=D:/workshop/log-intergration/src/logging.properties
public static void main(String[] args) {
installJulToSlf4jBridge();
log.info("CommonsLog ");
log4jLogger.info("Log4j ");
jdkLogger.info("JDK14 ");
slf4jLogger.info("slft4j ");
}
public static void installJulToSlf4jBridge() {
SLF4JBridgeHandler.removeHandlersForRootLogger();
SLF4JBridgeHandler.install();
}
}
웹 앱 프로그램:
LoggerIntergrationListener.class
/**
* Spring Log4jConfigListener, , JDK14 slf4j-logger
*
* @author zhangpu
*/
public class LoggerIntergrationListener extends Log4jConfigListener {
@Override
public void contextInitialized(ServletContextEvent event) {
installJulToSlf4jBridge();
event.getServletContext().log("Install Jdk-util-logger to slf4j success.");
super.contextInitialized(event);
}
private void installJulToSlf4jBridge() {
SLF4JBridgeHandler.removeHandlersForRootLogger();
SLF4JBridgeHandler.install();
}
}
웹.xml 설정
<!--Intergration log4j/slf4j/commons-logger/jdk14-logger to log4j -->
<listener>
<listener-class>com.feinno.framework.common.web.support.LoggerIntergrationListener</listener-class>
</listener>
OK,over!~