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.로그 통합
  • slf4j 의 로 그 는 자동 으로 slf4j-log4j 12-xxx.jar 에 따라 로그 4j 로 출력 되 며 설정 할 필요 가 없습니다
  • comons-log 의 로 그 는 jcl-over-slf4j 에 따라 로그 4j 로 자동 으로 출력 되 며,설정 할 필요 가 없습니다
  • jdk14-logger 의 로그 출력(예 를 들 어 tomcat,restlet 등 소프트웨어)은 jl-toslf4j 가 제공 하 는 Handler 에 따라 로 그 를 slf4j 로 옮 긴 다음 에 slf4j 에서 log 4j 로 출력 할 수 있 습 니 다.그러나 설정 이나 프로 그래 밍 방식 설정 이 필요 합 니 다
  • 설정 방식 통합:
    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!~
     
     
     
     
     
     
     
     
     

    좋은 웹페이지 즐겨찾기