Log4j를 사용하여 서로 다른 패키지의 로그를 다른 파일로 내보내는 방법

6989 단어 log4jPackage로그
앞말
프로젝트의 규모가 점점 커지면서 새로운 모듈이 끊임없이 도입되고 서로 다른 모듈은 자신의 로그를 인쇄하기 때문에 결국 로그를 볼 수 없게 된다. 예를 들어 나의 프로젝트에 다음과 같은 로그가 존재한다.
  • 외부 소식을 수신하는 로그, 대외적으로 메시지를 보내는 로그;
  • 백그라운드 상주 라인의 처리 로그;
  • 외부 인터페이스 접근의 매개 변수, 반환 결과 등 인터페이스 로그;
  • Service가 데이터베이스에 액세스하여 생성한 SQL 로그
  • 그 중에서 메시지 로그와 백그라운드 루틴의 로그 데이터량은 매우 방대하다. 만약에 모든 로그를 한 파일에 인쇄하고 tail -f log.log 파일을 사용한다면 로그가 빠르게 굴러가는 것을 발견할 수 있고 구체적인 SQL이나 서비스 액세스 일지를 볼 수 없을 것이다.
    해결 방법은 서로 다른 로그를 분류하여 출력할 수 있기 때문에 서로의 로그는 영향을 주지 않는다. 특히 중요한 인터페이스가 로그에 접근하면 문제를 쉽게 포지셔닝하고 조사할 수 있다.
    단계 1: log4j.properties 구성
    먼저 내 모든 log4j.properties 설정을 붙여주세요.
    
    log4j.rootLogger=INFO, console, file
     
    log4j.appender.console=net.czt.log.AsyncConsoleAppender
    log4j.appender.console.layout=org.apache.log4j.PatternLayout
    log4j.appender.console.layout.ConversionPattern=%d [%t] %-5p crazyant-web %-17c{2} (%13F:%L) %X{USER_ID}|%X{USER_IP}|%X{SERVER_ADDRESS}|%X{SERVER_NAME}|%X{REQUEST_URI}|%X{SESSION_ID} - %m%n
    log4j.appender.console.bufferSize=10000
    log4j.appender.console.encoding=UTF-8
     
    log4j.appender.file=org.apache.log4j.RollingFileAppender
    log4j.appender.file.file=/home/work/apache-tomcat-6.0.39/logs/crazyant.log
    log4j.appender.file.MaxBackupIndex=5
    log4j.appender.file.MaxFileSize=1GB
    log4j.appender.file.layout=org.apache.log4j.PatternLayout
    log4j.appender.file.layout.ConversionPattern=[%-5p] crazyant-web %d{yyyy-MM-dd HH:mm:ss,SSS} %X{USER_ID}|%X{USER_IP}|%X{SERVER_ADDRESS}|%X{SERVER_NAME}|%X{REQUEST_URI}|%X{SESSION_ID} method:%l%n%m%n
    log4j.appender.file.bufferSize=10000
    log4j.appender.file.encoding=UTF-8
     
    log4j.logger.net.czt.crazyant.msg=DEBUG, message
    log4j.additivity.net.czt.crazyant.msg=false
    log4j.appender.message=org.apache.log4j.RollingFileAppender
    log4j.appender.message.File=/home/work/apache-tomcat-6.0.39/logs/crazyant_message.log
    log4j.appender.message.Append=true
    log4j.appender.message.MaxFileSize=1GB
    log4j.appender.message.MaxBackupIndex=5
    log4j.appender.message.layout=org.apache.log4j.PatternLayout
    log4j.appender.message.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%-5p][%c{1}] [%t] - %m%n
    log4j.appender.message.encoding=UTF-8
     
    log4j.logger.net.czt.crazyant.async.service=DEBUG, async
    log4j.additivity.net.czt.crazyant.async.service=false
    log4j.appender.async=org.apache.log4j.RollingFileAppender
    log4j.appender.async.File=/home/work/apache-tomcat-6.0.39/logs/crazyant_async.log
    log4j.appender.async.Append=true
    log4j.appender.async.MaxFileSize=1GB
    log4j.appender.async.MaxBackupIndex=5
    log4j.appender.async.layout=org.apache.log4j.PatternLayout
    log4j.appender.async.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%-5p][%c{1}] [%t] - %m%n
    log4j.appender.async.encoding=UTF-8
     
    log4j.logger.net.czt.orm.mybatis.SqlMonitorManager=DEBUG, showsql
    log4j.additivity.net.czt.orm.mybatis.SqlMonitorManager=false
    log4j.logger.net.czt.transaction.interceptor.SmartTransactionInterceptor=DEBUG, showsql
    log4j.additivity.net.czt.transaction.interceptor.SmartTransactionInterceptor=false
    log4j.appender.showsql=org.apache.log4j.RollingFileAppender
    log4j.appender.showsql.File=/home/work/apache-tomcat-6.0.39/logs/crazyant_sql.log
    log4j.appender.showsql.Append=true
    log4j.appender.showsql.MaxFileSize=1GB
    log4j.appender.showsql.MaxBackupIndex=5
    log4j.appender.showsql.layout=org.apache.log4j.PatternLayout
    log4j.appender.showsql.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%-5p][%c{1}] [%t] - %m%n
    log4j.appender.showsql.encoding=UTF-8
     
    log4j.logger.net.czt.crazyant.service=DEBUG, service
    log4j.additivity.net.czt.crazyant.service=false
    log4j.appender.service=org.apache.log4j.RollingFileAppender
    log4j.appender.service.File=/home/work/apache-tomcat-6.0.39/logs/crazyant_service.log
    log4j.appender.service.Append=true
    log4j.appender.service.MaxFileSize=1GB
    log4j.appender.service.MaxBackupIndex=5
    log4j.appender.service.layout=org.apache.log4j.PatternLayout
    log4j.appender.service.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%-5p][%c{1}] [%t] - %m%n
    log4j.appender.service.encoding=UTF-8
    프로필 아래에서 메시지 (메시지), async (백엔드 루트), showsql (데이터베이스 로그), 서비스 (인터페이스 호출) 를 각각 다른 로그 파일로 출력하는 것을 쉽게 볼 수 있습니다.
    몇 가지 설명:log4j.rootLogger=INFO, console, filelog4j는 루트 로거와 일반 로거의 개념이 있습니다. 기본적으로 루트 로거는 하나만 필요합니다. 모든 로그가 이 로그 파일에만 출력됩니다.
    일반 Logger 구성 보기(인터넷 로그 서비스의 경우):
    1、 log4j.logger.net.czt.crazyant.service=DEBUG, service이 문장의 "net.czt.crazyant.service"은 이 일반logger 로그 설정이 적용되는 패키지의 전체 경로를 나타냅니다.
    이 일반 logger의 이름을 나타내는 색 서비스
    2、 log4j.additivity.net.czt.crazyant.service=false그 중 "net.czt.crazyant.service"은 위와 같이 이 설정 항목이 겨냥한 패키지를 나타낸다
    이 설정은 이 패키지의 로그를 루트로거 로그에 출력하지 말고 자신이 설정한 로그에만 출력하면 된다는 것을 의미합니다.
    3, log4j.appender.service=org.apache.log4j.RollingFileAppender 및 이 구성 세그먼트 아래의 구성 항목
    여기의'서비스'문자열은 위의 첫 번째 설정 항목의'서비스'와 같이 이 일반 Logger에 대한 설정을 나타낸다.
    아래의 설정 항목은 루트로거와 같습니다. 매일 출력 파일, 인코딩 UTF8, 분할 규칙, 줄마다 출력 모드 등을 나타냅니다.
    내가 겪은 문제는 위의 log4j.properties 설정을 한 후에 각 로그 파일이 만들어졌지만 내용이 없다는 것이다. 이것은 무엇 때문일까?다음 두 번째 주의사항 보기;
    2단계, 로그를 출력할 때 로그 대상에 대응하는 구체적인 클래스를 설정해야 한다
    무슨 뜻이죠?위의 설정 항목에'net.czt.crazyant.service'패키지 문자열이 있습니다. 그러면 log4j가 어떻게 서로 다른 패키지에 있는 logger 로그를 다른 파일로 출력하는지 생각해 보겠습니다. 생각해 보면 두 가지 방법이 있습니다.
    1. 인터셉터 또는 aop 방식으로 로그4j가 로그 출력을 검출하고 로그가 어느 패키지에서 발생하는지 검출하면 해당 파일에 출력한다.
    2. 사용자가 클래스 파라미터를 전송하고log4j는 이 클래스에 대응하는 패키지를 가져와 이를 기준으로 서로 다른 로그 파일을 포지셔닝한다.
    코드를 보면 분명히 log4j는 다음 간단한 직접적인 방식을 사용한다.
    
    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;
     
    public class MyClassImpl implements MyClass {
     /**
      * loger
      */
     private static final Log logger = LogFactory.getLog(MyClassImpl.class);
     
     /**
      * my func
      */
     public void myfunc() {
      logger.info("call method myfunc.");
     }
    }
    logger = LogFactory.getLog(MyClassImpl.class)에서 이logger를 사용하는 클래스 파라미터가 전송되었고, 이 클래스가 반사된 패키지 주소는 로그를 출력하는 패키지 주소입니다.
    이런 방법도 강력한 부분이 있다. 논리적인 로그 분류를 편리하게 할 수 있다. 예를 들어 많은 코드가 하나의 패키지에 속하지 않지만 논리적으로 한데 속한다. 예를 들어 메시지의 처리는 인터페이스가 서비스라는 패키지를 호출하는 것이 아니라 msg를 보내는 작업도 호출할 수 있다. 만약에 msg의 패키지 중 일부 로그를 서비스에 출력하려면 이 msg의logger를 초기화할 때Service의 Class를 하나 전송하면 됩니다.
    또는 특정한 종류의 모든 로그에 대해 말하자면, 그것들의 모든logger 대상은 봉인된 하나의 대상 실례에서 나온 것이고, 이 하나의 대상 실례가 전송된 매개 변수는 하나이며, 이 논리적 분류를 표시하는 데 사용하면 된다.
    총결산Log4j.properties에서 패키지나 구체적인class를 지원하는 로그는 단독으로 출력되지만 코드에서logger를 초기화해야 할 때 로그 설정의 패키지와 대응할 수 있습니다.
    자, 이상은 이 글의 전체 내용입니다. 본고의 내용이 여러분의 학습이나 업무에 일정한 도움을 줄 수 있기를 바랍니다. 의문이 있으면 댓글을 남겨 주십시오.

    좋은 웹페이지 즐겨찾기