Log4j를 사용하여 다양한 패키지의 로그를 다양한 파일로 출력하는 방법
머리말
프로젝트의 규모가 점점 커질수록 새로운 모듈이 지속적으로 도입되고, 각 모듈마다 자체 로그가 출력되므로 결국에는 로그를 전혀 볼 수 없게 됩니다. 프로젝트에는 다음과 같은 로그가 있습니다.
외부 메시지 수신 로그 및 외부 메시지 전송 로그
백그라운드 상주 스레드 로그 처리; 외부 인터페이스 액세스 매개변수 및 반환 결과와 같은 인터페이스 로그
서비스가 데이터베이스에 액세스하여 생성된 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
구성 파일 아래에서 쉽게 볼 수 있습니다. 예, 메시지(message), async(백엔드 스레드), showsql(데이터베이스 로그), 서비스(인터페이스 호출)를 각각 다른 로그 파일에 출력합니다.
몇 가지 설명:
log4j.rootLogger=INFO, console, file
log4j에는 rootLogger 및 일반 Logger 개념이 기본적으로 하나만 필요합니다. 즉, 모든 로그는 이 로그 파일에만 출력됩니다.
공통 로거 구성 보기(인터페이스 로그 서비스를 예로 들어):
1. log4j.logger.net.czt.crazyant.service=DEBUG, service
이 문장의 "net.czt.crazyant.service"는 공통 로거 로그 구성이 적용되는 패키지의 전체 경로를 나타냅니다.
컬러 서비스는 공통 로거의 이름
2. log4j.additivity.net.czt.crazyant.service=false
"net.czt.crazyant.service"는 위와 동일하게 구성 항목
을 대상으로 하는 패키지임을 나타냅니다. 이 구성의 의미는 패키지의 로그를 rootLogger 로그에 출력하는 것이 아니라, 직접 구성한 로그에만 출력한다는 의미입니다. ;
3. log4j.appender.service=org.apache.log4j.RollingFileAppender 및 이 구성 섹션 아래의 구성 항목
여기서는 "service" 문자열입니다. 위의 첫 번째 구성 항목의 "서비스"는 동일하며 일반 Logger의 구성을 나타냅니다.
아래 구성 항목은 rootLogger와 동일하며 일일 출력 파일, 인코딩을 나타냅니다. UTF8, 조각화 규칙, 각 줄의 출력 모드 등
제가 직접 겪은 문제는 위의 log4j.properties를 구성한 후 각 로그 파일이 생성되었지만 아무 것도 없다는 것을 발견했습니다. 내용이 왜 들어있어요? 아래 두 번째 주의사항을 살펴보겠습니다.
Step 2. 로그 출력 시, 로그 객체에 해당하는 특정 클래스를 설정해야 합니다.
은 무엇을 의미하나요? 위의 구성 항목 중에 "net.czt.crazyant.service"라는 패키지 문자열이 있는데, log4j가 어떻게 다른 패키지의 로거 로그를 다른 파일로 출력하는지 생각해 볼까요? 방법:
1. 인터셉터 또는 aop를 사용하여 log4j가 로그 출력을 자체적으로 감지하고, 로그가 어떤 패키지에서 생성되었는지 감지하여 해당 파일에 출력합니다. , 사용자는 Class 매개변수를 전달하고, 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)에서는 로거를 사용하는 Class 매개변수가 전달되고, 반영된 Class의 패키지 주소는 log4j에서 사용됩니다. 출력 로그 패키지 주소.

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제









이 기사는 2025 년에 상위 4 개의 JavaScript 프레임 워크 (React, Angular, Vue, Svelte)를 분석하여 성능, 확장 성 및 향후 전망을 비교합니다. 강력한 공동체와 생태계로 인해 모두 지배적이지만 상대적으로 대중적으로

이 기사는 원격 코드 실행을 허용하는 중요한 결함 인 Snakeyaml의 CVE-2022-1471 취약점을 다룹니다. Snakeyaml 1.33 이상으로 Spring Boot 응용 프로그램을 업그레이드하는 방법에 대해 자세히 설명합니다.

Node.js 20은 V8 엔진 개선, 특히 더 빠른 쓰레기 수집 및 I/O를 통해 성능을 크게 향상시킵니다. 새로운 기능에는 더 나은 webAssembly 지원 및 정제 디버깅 도구, 개발자 생산성 및 응용 속도 향상이 포함됩니다.

이 기사는 카페인 및 구아바 캐시를 사용하여 자바에서 다단계 캐싱을 구현하여 응용 프로그램 성능을 향상시키는 것에 대해 설명합니다. 구성 및 퇴거 정책 관리 Best Pra와 함께 설정, 통합 및 성능 이점을 다룹니다.

Java의 클래스 로딩에는 부트 스트랩, 확장 및 응용 프로그램 클래스 로더가있는 계층 적 시스템을 사용하여 클래스로드, 링크 및 초기화 클래스가 포함됩니다. 학부모 위임 모델은 핵심 클래스가 먼저로드되어 사용자 정의 클래스 LOA에 영향을 미치도록합니다.

이 기사는 오이 단계간에 데이터를 공유하는 방법, 시나리오 컨텍스트, 글로벌 변수, 인수 통과 및 데이터 구조를 비교합니다. 간결한 컨텍스트 사용, 설명을 포함하여 유지 관리에 대한 모범 사례를 강조합니다.

이 기사는 Lambda 표현식, 스트림 API, 메소드 참조 및 선택 사항을 사용하여 기능 프로그래밍을 Java에 통합합니다. 간결함과 불변성을 통한 개선 된 코드 가독성 및 유지 관리 가능성과 같은 이점을 강조합니다.

대규모 분석 데이터 세트를위한 오픈 테이블 형식 인 Iceberg는 데이터 호수 성능 및 확장 성을 향상시킵니다. 내부 메타 데이터 관리를 통한 Parquet/Orc의 한계를 해결하여 효율적인 스키마 진화, 시간 여행, 동시 W를 가능하게합니다.
