Log4j를 사용하여 서로 다른 패키지의 로그를 다른 파일로 내보내는 방법
프로젝트의 규모가 점점 커지면서 새로운 모듈이 끊임없이 도입되고 서로 다른 모듈은 자신의 로그를 인쇄하기 때문에 결국 로그를 볼 수 없게 된다. 예를 들어 나의 프로젝트에 다음과 같은 로그가 존재한다.
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, file
log4j는 루트 로거와 일반 로거의 개념이 있습니다. 기본적으로 루트 로거는 하나만 필요합니다. 모든 로그가 이 로그 파일에만 출력됩니다.일반 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를 초기화해야 할 때 로그 설정의 패키지와 대응할 수 있습니다.자, 이상은 이 글의 전체 내용입니다. 본고의 내용이 여러분의 학습이나 업무에 일정한 도움을 줄 수 있기를 바랍니다. 의문이 있으면 댓글을 남겨 주십시오.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Spring Boot에서 log4j 로깅 방법Spring Boot은 모든 내부 로그에 Commons Logging을 사용하지만, 기본 설정은 Java Util Logging, Log4J, Log4J2, Logback과 같은 일반적인 로그를 지원합니다.각 Log...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.