Java java지도 시간 Log4j를 사용하여 다양한 패키지의 로그를 다양한 파일로 출력하는 방법

Log4j를 사용하여 다양한 패키지의 로그를 다양한 파일로 출력하는 방법

Jan 18, 2017 pm 12:42 PM

머리말

프로젝트의 규모가 점점 커질수록 새로운 모듈이 지속적으로 도입되고, 각 모듈마다 자체 로그가 출력되므로 결국에는 로그를 전혀 볼 수 없게 됩니다. 프로젝트에는 다음과 같은 로그가 있습니다.

외부 메시지 수신 로그 및 외부 메시지 전송 로그

백그라운드 상주 스레드 로그 처리; 외부 인터페이스 액세스 매개변수 및 반환 결과와 같은 인터페이스 로그

서비스가 데이터베이스에 액세스하여 생성된 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에서 사용됩니다. 출력 로그 패키지 주소.

이 접근 방식은 논리적 로그 분류를 용이하게 한다는 점에서도 강력합니다. 예를 들어 많은 코드는 패키지에 속하지 않지만 논리적으로 함께 속합니다. 예를 들어 메시지 처리는 단순히 서비스를 호출하는 것이 아닙니다. 이 패키지는 메시지 전송 작업을 호출할 수도 있습니다. msg 패키지의 일부 로그를 서비스에 출력하려면 메시지 로거가 초기화될 때 서비스 클래스를 전달하면 됩니다.

또는 특정 유형의 모든 로그의 경우 모든 로거 개체는 캡슐화된 단일 개체 인스턴스에서 나오고 이 단일 개체 인스턴스에서 전달된 매개변수는 하나만 있으며 이를 식별하는 데 사용됩니다. 논리적으로.

요약

Log4j.properties에서는 패키지나 특정 클래스의 로그를 별도로 출력할 수 있도록 지원하지만, 로거 실행 시 로그 구성에서도 해당 패키지에 대응할 수 있어야 합니다. 코드에서 초기화됩니다.

그렇습니다. 이 글의 내용이 모든 분들의 공부나 업무에 도움이 되기를 바랍니다. 궁금한 점이 있으면 메시지를 남겨주세요.

Log4j를 사용하여 다양한 패키지의 로그를 다양한 파일로 출력하는 방법에 대한 자세한 관련 기사를 보려면 PHP 중국어 웹사이트에 주목하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

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

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
2 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
2 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

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

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

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

2025 년 상위 4 개의 JavaScript 프레임 워크 : React, Angular, Vue, Svelte 2025 년 상위 4 개의 JavaScript 프레임 워크 : React, Angular, Vue, Svelte Mar 07, 2025 pm 06:09 PM

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

Spring Boot Snakeyaml 2.0 CVE-2022-1471 문제 고정 Spring Boot Snakeyaml 2.0 CVE-2022-1471 문제 고정 Mar 07, 2025 pm 05:52 PM

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

Node.js 20 : 주요 성능 향상 및 새로운 기능 Node.js 20 : 주요 성능 향상 및 새로운 기능 Mar 07, 2025 pm 06:12 PM

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

카페인 또는 구아바 캐시와 같은 라이브러리를 사용하여 자바 애플리케이션에서 다단계 캐싱을 구현하려면 어떻게해야합니까? 카페인 또는 구아바 캐시와 같은 라이브러리를 사용하여 자바 애플리케이션에서 다단계 캐싱을 구현하려면 어떻게해야합니까? Mar 17, 2025 pm 05:44 PM

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

Java의 클래스로드 메커니즘은 다른 클래스 로더 및 대표 모델을 포함하여 어떻게 작동합니까? Java의 클래스로드 메커니즘은 다른 클래스 로더 및 대표 모델을 포함하여 어떻게 작동합니까? Mar 17, 2025 pm 05:35 PM

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

오이의 단계간에 데이터를 공유하는 방법 오이의 단계간에 데이터를 공유하는 방법 Mar 07, 2025 pm 05:55 PM

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

Java에서 기능 프로그래밍 기술을 어떻게 구현할 수 있습니까? Java에서 기능 프로그래밍 기술을 어떻게 구현할 수 있습니까? Mar 11, 2025 pm 05:51 PM

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

빙산 : 데이터 호수 테이블의 미래 빙산 : 데이터 호수 테이블의 미래 Mar 07, 2025 pm 06:31 PM

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

See all articles