프로젝트 작업 중에는 기능 디버깅을 수행하고 사용자 동작을 추적하고 기록해야합니다. 어떤 사람들은 System.out을 사용하는 데 익숙하지만 권장하지 않습니다. 사용하기 쉽지만 유지하기가 쉽지 않으며 확장 성이 없습니다. Log4J와 비교하여 Log4J는 대상, 출력 형식 및 로그 정보 수준 등을 제어하여 로그 생성 프로세스를보다 신중하게 제어 할 수 있습니다.
Log4J2는 Log4J1로의 업그레이드이며, 멀티 스레드의 처리량 향상, 자리 표시자를위한 지원, 자동 구성 파일 리로딩 등을 포함하여 성능 및 기능이 크게 향상되었습니다.
1. 소개
1. JAR 패키지를 다운로드하십시오
pox.xml
<pectionies> <pectionency> <groupId> org.apache.logging.log4j </groupId> <artifactid> log4j-api </artifactid> <bersion> 2.10.0 </dependency> <pectionency> <groupid> org.apache.logging.log4j <artifactid> </artifactid> <버전> 2.10.0 </버전> </의존성> </종속성>
2. 구성 파일
Log4J에는 JSON, YAML, Properties 및 XML의 4 가지 구성 공장 구현이 포함되어 있습니다. 이 기사는 일반적으로 사용되는 방법 XML을 소개합니다.
Log4J는 초기화 중에 자동으로 구성 할 수 있습니다. log4J가 시작되면 우선 순위 순서로 클래스 경로에서 모든 이름 호환 파일을 찾습니다 : log4j2-test.properties> log4j2-test.xml> log4j2.properties> log4j2.xml
3. 간단한 예
XML 구성 :
<? xml version = "1.0"alcoding = "utf-8"?> <configuration status = "warn"> <부록> <콘솔 이름 = "콘솔"target = "system_out"> <patternlayout pattern = " %d {HH : mm : ss.sss} [ %t] %-5level %logger {36}- %n"//> contors> <loggers> <root level = "info"> <AppenderRef ref = "콘솔"/> </root> </loggers> </configuration> 자바 코드 :
개인 정적 최종 로거 로거 = logmanager.getLogger (myapp.class); @test public void testlog4j () {logger.info ( "Hello World!"); }}콘솔 정보
22 : 17 : 47.146 [Main] Info MyApp -Hello World!
2. 모듈 소개
<구성>
| 재산 | 설명하다 |
| MonitorInterval | 파일이 수정되면 지정된 시간 후에 구성이 다시로드됩니다. 초 단위, 최소값은 5입니다 |
| 패키지 | 커스텀 필터, 부록 등과 같은 플러그인을 검색하는 데 사용되는 쉼표로 구분 된 패키지 이름 목록. 플러그인은 한 번만로드되므로 수정 후 적용하려는 경우 프로젝트를 다시 시작해야합니다. |
| 상태 | 디버그로 값을 설정하는 내부 로그 레벨은 콘솔의 전체 로그 이벤트 흐름을 명확하게 볼 수 있습니다. 사용 된 로거는 org.apache.logging.log4j.core.logger입니다 |
| 엄격한 | 엄격한 XML 형식이 허용됩니다. JSON 구성은 지원되지 않습니다 |
| 말 수가 많은 | 플러그인을로드 할 때 진단 정보를 활성화합니다 |
<부록>
Log4J를 사용하면 로그 요청을 여러 대상으로 인쇄 할 수 있습니다. Log4J 언어에서 출력 대상을 Appender라고합니다. 현재 부속기는 콘솔, 파일, 원격 소켓 서버, Apache Flume, JMS, 원격 UNIX Syslog Daemons 및 다양한 데이터베이스 API에 존재합니다. 다음은 더 일반적으로 사용되는 부부들을 소개합니다. 더 알아야 할 경우 공식 웹 사이트에서 확인할 수 있습니다.
1. ConsolePender
콘솔로의 출력, <Console>
매개 변수 이름 | 유형 | 설명하다 |
필터 | 필터 | 필터 |
공들여 나열한 것 | 공들여 나열한 것 | 로그 출력 형식 |
따르다 | 부울 | |
직접 | 부울 | |
이름 | 끈 | 애플 렌더의 이름 |
무시하신 | 부울 | 기본적으로, 쓰기 예외를 무시하십시오 |
목표 | 끈 | System_out 또는 System_err, 기본값은 System_out입니다 |
2. FilePender
파일로의 출력, <file>
매개 변수 | 유형 | 설명하다 |
|---|---|---|
추가 | 부울 | 기본값은 사실이며 새 레코드가 파일 끝에 추가됩니다. |
버퍼 레디오 | 부울 | 버퍼를 사용하여 성능을 크게 향상시킬 수 있습니다. |
버퍼 크기 | int | Bufferedio가 True 일 때이 특성의 버퍼 크기는 기본적으로 8192 바이트입니다. |
CreateOndemand | 부울 | Appender는 주문형 파일을 만듭니다. Appender는 로그 이벤트가 모든 필터를 통과하고 Appender로 라우팅 될 때만이 파일을 생성합니다. 기본값은 False입니다 |
필터 | 필터 | 이 Appender가 이벤트를 처리 해야하는지 여부를 결정하는 필터. 복합 필터와 함께 여러 필터를 사용할 수 있습니다 |
파일 이름 | 끈 | 쓸 파일의 이름입니다. 파일 또는 부모 디렉토리가 존재하지 않으면 생성됩니다. |
즉시 플러시 | 부울 | 기본적으로 기본적으로, 각 쓰기 후에는 새로 고침이 나타납니다. 이렇게하면 버퍼의 데이터가 디스크에 기록되지만 성능에 영향을 줄 수 있습니다. |
공들여 나열한 것 | 공들여 나열한 것 | 로그 형식 |
잠금 | 부울 | 파일 잠금, 기본값 거짓 |
이름 | 끈 | 애플 렌더의 이름 |
무시하신 | 부울 | 기본적으로, 쓰기 예외를 무시하십시오 |
정상 | 끈 | 파일 권한을 정의합니다 예 : RW ----- 또는 RW-RW-RW- 등 ... |
파일 소유자 | 끈 | 파일 소유자를 정의합니다 |
파일 그룹 | 끈 | 파일 그룹을 정의합니다 |
3. jdbcaappender
JDBCAppender는 표준 JDBC를 사용하여 로그 이벤트를 관계형 데이터베이스 테이블에 작성합니다. JNDI 데이터 소스 또는 사용자 정의 공장 메소드를 사용하여 JDBC 연결을 얻도록 구성 할 수 있습니다. 이 방법에 관계없이 연결 풀에서 지원해야합니다.
그렇지 않으면 로깅 성능이 크게 영향을받습니다.
구성된 JDBC 드라이버가 배치 문을 지원하고 버퍼 크기를 양수로 구성하면 로그 이벤트가 배치됩니다.
(1) <JDBC>
매개 변수 | 유형 | 설명하다 |
|---|---|---|
이름 | 끈 | 필수의 이름 |
무시하신 | 부울 | 기본적으로 로그 이벤트 예외를 무시하십시오 |
필터 | 필터 | 필터 |
버퍼 크기 | int | 정수가 0보다 큰 경우 appender가 로그 이벤트를 버퍼링하고 버퍼가 해당 크기에 도달하면 쓰기 데이터를 새로 고칠 것입니다. |
ConnectionsOrce | ConnectionsOrce | 데이터베이스 연결을 검색해야합니다 |
표정 | 끈 | 필수, 로그 이벤트의 데이터 테이블 이름 삽입 |
ColumnConfigs | ColumnConfig [] | 필수, 데이터베이스에 삽입 해야하는 필드는 다중 <councle> 요소로 구성됩니다. |
ColumnMappings | 열 맵핑 [] | 필드 매핑 구성 |
(2) <datasource>를 사용하여 JDBC 연결을 얻으려면 JNDI 만 여기에 나열됩니다.
| 매개 변수 | 유형 | 설명하다 |
|---|---|---|
| jndiname | 끈 | 구성된 JNDI가 JDBC/LoggingDatabase 인 경우 여기의 값은 Java입니다 : comp/env/jdbc/loggingdatabase입니다. 데이터 소스는 연결 풀에서 지원해야합니다. 그렇지 않으면 로깅이 매우 느립니다. |
(3) <cournce>를 사용하여 테이블에 쓸 일과 작성 방법을 지정하십시오. SQL 주입 취약성이 없습니다.
| 매개 변수 | 유형 | 설명하다 |
|---|---|---|
| 이름 | 끈 | 필수 테이블 필드 이름 |
| 무늬 | 끈 | PatternLayout 모드를 사용하여 값을 삽입하십시오. 참고 : 동일한 열 요소에서 패턴의 세 가지 속성 중 하나만 동일한 열 요소에 존재할 수 있습니다. |
| 오자 | 끈 | 이 값은 SQL 문에 직접 포함되고 실행됩니다. 예 : rand () 함수는 myibats에서 $ {}과 유사한 임의 숫자를 생성합니다. |
| iseventtimestamp | 부울 | 시간 형식 java.sql.types.timestamp 여부 |
| Isunicode | 부울 | 패턴이 지정되지 않으면이 속성은 무시됩니다. 사실이라면 값이 유니 코드에 삽입됩니다. 그렇지 않으면 값이 비공개에 삽입됩니다. |
| isclob | 부울 | 패턴이 지정되지 않으면이 속성은 무시됩니다. 사실이라면 값이 클로브에 삽입됩니다. 그렇지 않으면 varchar, nvarchar가 |
예:
<? xml version = "1.0"encoding = "utf-8"?> <configuration status = "error"> <부록> <jdbc name = "databaseapender"tablename = "dbo.application_log"> <dataSource jndiname = "java :/comp/endbc/loggingdatdatdatdatdatdatdatdatocce"/>>>/ev <eventDate "/>>/jdbc/logging ISEVENTTIMESTAMP = "true" /> <column name = "level"Pattern = "%레벨" /> <column name = "logger"pattern = "%logger" /<collect namen = "message"pattern = "%message" /<column name = "except"= "%ex {full}" /> < /jdbc> < /aptenders> <root level = "warn"> ref = "databaseappender"/> </root> </loggers> </configuration><PatternLayout>
(1) 날짜, %d/ %날짜
무늬 | 예 |
|---|---|
%d {default} | 2012-11-02 14 : 34 : 02,781 |
%d {iso8601} | 2012-11-02T14 : 34 : 02,781 |
%d {iso8601_basic} | 20121102T143402,781 |
%d {절대} | 14 : 34 : 02,781 |
%d {date} | 2012 년 11 월 14 일 14 : 34 : 02,781 |
%d {compact} | 20121102143402781 |
%d {hh : mm : ss, ss} | 14 : 34 : 02,781 |
%d {dd mmm yyy hh : mm : ss, ss} | 2012 년 11 월 14 일 14 : 34 : 02,781 |
%d {hh : mm : ss} {gmt+0} | 18:34:02 |
%d {unix} | 1351866842 |
%d {unix_millis} | 1351866842781 |
물론 %d {yyyy-mm-dd hh : mm : ss}와 같은 형식을 사용자 정의 할 수도 있습니다.
(2) 로거, %C/ %로거
변환 패턴 | 로거 이름 | 결과 |
|---|---|---|
%C {1} | org.apache.commons.foo | foo |
%C {2} | org.apache.commons.foo | Commons.foo |
%C {10} | org.apache.commons.foo | org.apache.commons.foo |
%C {-1} | org.apache.commons.foo | Apache.commons.foo |
%C {-2} | org.apache.commons.foo | Commons.foo |
%C {-10} | org.apache.commons.foo | org.apache.commons.foo |
%C {1.} | org.apache.commons.foo | 오아 푸 |
%C {1.1. ~. ~} | org.apache.commons.test.foo | oa ~. ~ .foo |
%기음{.} | org.apache.commons.test.foo | .... foo |
{?} - 언제 ? 양의 정수이며, N 부품이 오른쪽에서 가져오고, 음의 정수는 N 부품이 왼쪽에서 제거됨을 의미합니다. 왜 %C {-10}가 완전한 이름 인 이유는 모르겠습니다. 메시지를 남겨 주시면 오신 것을 환영합니다
(3) 로그 정보,%m/%msg/%메시지
(4) 로그 레벨, %레벨
<필터>
Log4J2는 직접 사용하기 위해 다양한 필터가 제공되며 필터를 직접 정의 할 수도 있습니다.
myfilter.java
import org.apache.logging.log4j.level; import org.apache.logging.log4j.marker; import org.apache.logging.log4j.threadcontext; import org.apache.logging.log4j.core.logevent; import org.apache.logging.core.core.logger org.apache.logging.log4j.core.config.plugins.import org.apache.logging.log4j.core.core.core.corfig.plugins.pluginfactory; import org.apache.logging.log4j.core.filter.abstractfilter; import org.apache.logging.log4j.message.message; @plugin (name = "myfilter", category = "core", elementtype = "filter", printobject = true) public final class myfilter 확장 abstractfilter {개인 최종 레벨 레벨; Private MyFilter (레벨 레벨, 결과 onMatch, 결과 ONMismatch) {SUPER (ONMATCH, ONMISMATCH); this.level = 레벨; } 공개 결과 필터 (로거 로거, 레벨 레벨, 마커 마커, 문자열 msg, object [] params) {return filter (level); } 공개 결과 필터 (로거 로거, 레벨 레벨, 마커 마커, 객체 msg, 던질 가능한 t) {반환 필터 (레벨); } 공개 결과 필터 (Logger Logger, 레벨 레벨, 마커 마커, Message Msg, Throwable T) {리턴 필터 (레벨); } @override public result filter (logevent event) {return filter (event.getLevel ()); } 개인 결과 필터 (레벨 레벨) { / * * 비즈니스 로직 * * / return level.ismorespecificthan (this.Level)? onmatch : onmismatch; } @override public String toString () {return level.toString (); } @plugInfactory public static myfilter createfilter (@pluginattribute (value = "level", defaultstring = "error") 레벨 레벨, @pluginattribute (value = "onmatch", defaultstring = "neutral") onmatch, @pluginattribute (value = "onmismatch") reconstring = "lety -rengtring", defaulttring " MyFilter (레벨, onmatch, onmismatch); }}log4j2.xml
<? xml version = "1.0"encoding = "utf-8"?> <configuration status = "warn"monitorInterval = "5"패키지 = "당신의 패키지"verbose = "false"strict = "true"> <부록> <console name = "concele"target = "system_out" "true" "> <patternlayout ="%d {patternlayout pattern =. HH : MM : SS} %레벨 %로거 {10} - %msg "/> <myfilter level ="info "onmatch ="encept "/> </console> </abtenders> <loggers> <root level ="info "> <AppenderRef ref ="Console "/> </root> </loggers> </configuration>다시 채우다:
실제 애플리케이션에서는 요청 매개 변수, 사용자 ID 등과 같은 사용자 액세스 정보를 녹음해야합니다. Log4J1에서는 MDC 및 NDC를 사용하여 응용 프로그램 컨텍스트 정보를 저장하는 반면 Log4J2는 MDC 및 NDC의 기능을 구현하기 위해 스레드 콘텍스트를 사용합니다.
(1) NDC는 스택과 같은 메커니즘을 사용하여 컨텍스트 정보를 저장하고 스레드는 독립적입니다.
PatternLayout에서 %x를 사용하여 X는 소문자입니다.
예:
test.java
ThreadContext.push ( "Hello World!");
log4j2.xml
<열 이름 = "팁"패턴 = "%x" />
(2) MDC는 맵과 같은 메커니즘을 사용하여 정보를 저장하고 스레드는 독립적입니다.
PatternLayout에서 %x {userId}를 사용하여 출력을 사용하여 X가 대문자로 표시됩니다.
예:
test.java
ThreadContext.put ( "userId", "1");
log4j2.xml
<열 이름 = "userId"pattern = "%x {userId}" />사용 후 Clearall ()을 호출하여 컨텍스트 맵과 스택을 지우십시오.
API : http://logging.apache.org/log4j/2.x/javadoc.html
공식 웹 사이트 주소 : https://logging.apache.org/log4j/2.x/index.html
Log4J2 프로젝트 로그 구성 요소의 위 예제 코드는 내가 공유하는 모든 컨텐츠입니다. 나는 당신이 당신에게 참조를 줄 수 있기를 바랍니다. 그리고 당신이 wulin.com을 더 지원할 수 있기를 바랍니다.