-
log4j2的優勢
在異步,吞吐量等方面有極大的性能提升,Log4j2的性能爲什麼這麼好https://www.jianshu.com/p/359b14067b9e
-
maven
<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-api -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.11.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.12.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-slf4j-impl -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.11.1</version>
<scope>test</scope>
</dependency>
-
gradle
compile 'org.apache.logging.log4j:log4j-api:2.11.1'
compile 'org.apache.logging.log4j:log4j-core:2.11.1'
compile "org.apache.logging.log4j:log4j-slf4j-impl:2.11.1"
-
log4j與slf4j的關係
slf4j是日誌框架的標準接口之一,log4j是它的一個實現。面向接口編程,告訴我們使用具體的日誌系統,不方便升級換代,引入的jar中的日誌系統還可能不一樣,
無法使用,所以需要一個統一的日誌接口,可以兼容各類日誌系統。那就是slf4j。
slf4j提供接口,供用戶使用。但不提供實現,用戶要在自己的項目中進行選擇配置
期望的日誌系統。只要引入的jar中都使用slf4j,那麼就不會出現兼容問題。
具體使用方法是,在slf4j和具體的日誌系統中間使用橋接,實現slf4j的spi接口,同時
使用具體的日誌系統。
詳細請參考https://www.jianshu.com/p/370ed25cb7c4
-
Log2j配置文件
Log4j2支持多種配置文件,XML、JSON、YAML和perperties文件都支持,當然最常用的還是XML文件。將配置文件放在類路徑下即可,如果使用Maven或者Gradle的話,就是在resources文件夾下。
-
xml格式
-
<?xml version="1.0" encoding="UTF-8"?> <configuration status="WARN" monitorInterval="30"> <!-- appeenders自定義log控制的標籤 --> <appenders> <!-- 輸出到控制檯的配置 --> <console name="Console" target="SYSTEM_OUT"> <!-- 日誌輸出的格式 --> <PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%p] - %l - %m%n"/> </console> <!--文件回打印出所有的信息,這個log每次運行回自動清空,由append屬性決定,適合臨時測試使用 append爲TRUE表示消息增加到指定文件中,false表示 消息覆蓋指定的文件內容,默認是TRUE--> <File name="log" fileName="./logs/test.log" append="false"> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/> </File> <!--產生一個新的log文件 filePattern指定在文件超過指定size的時候的備份路徑 --> <RollingFile name="RollingFileInfo" fileName="./logs/info.log" filePattern="./logs/backups/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log.gz"> <!-- 指定log輸出的最低優先級 --> <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/> <PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%p] - %l - %m%n"/> <Policies> <TimeBasedTriggeringPolicy/> <!-- 日誌的size--> <SizeBasedTriggeringPolicy size="5 MB"/> </Policies> </RollingFile> <RollingFile name="RollingFileWarn" fileName="./logs/warn.log" filePattern="./logs/backups/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log"> <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/> <PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%p] - %l - %m%n"/> <Policies> <TimeBasedTriggeringPolicy/> <SizeBasedTriggeringPolicy size="5 MB"/> </Policies> <DefaultRolloverStrategy max="20"/> </RollingFile> <RollingFile name="RollingFileError" fileName="./logs/error.log" filePattern="./logs/backups/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log"> <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/> <PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%p] - %l - %m%n"/> <Policies> <TimeBasedTriggeringPolicy/> <SizeBasedTriggeringPolicy size="5 MB"/> </Policies> </RollingFile> </appenders> <!-- log的記錄器 建立要給默認的logger--> <loggers> <root level="all"> <appender-ref ref="Console"/> <appender-ref ref="RollingFileInfo"/> <appender-ref ref="RollingFileWarn"/> <appender-ref ref="RollingFileError"/> </root> </loggers> </configuration>
-
Yaml格式
如果要使用yaml格式則需要在引入jar包
maven:
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-yaml</artifactId>
<version>2.10.1</version>
</dependency>
gradle:
compile group: 'com.fasterxml.jackson.dataformat', name: 'jackson-dataformat-yaml', version: '2.10.1'
Configuration:
Properties:
Property:
- name: log-path
value: "logs"
- name: charset
value: "UTF-8"
- name: compact
value: false
- name: eventEol
value: true
- name: kafka-topic
value: neuralyzer
- name: bootstrap-servers
value: 127.0.0.1:9092
- name: complete
value: false
- name: stacktraceAsString
value: true
- name: log.pattern
value: "%d{yyyy-MM-dd HH:mm:ss.SSS} -%5p ${PID:-} [%X{tracking_id}] [%15.15t] %-30.30C{1.} : %m%n"
Appenders:
Console:
name: CONSOLE
target: SYSTEM_OUT
PatternLayout:
pattern: ${log.pattern}
RollingFile:
- name: REQUEST_LOG
fileName: ${log-path}/request.log
filePattern: "${log-path}/historyLog/info-%d{yyyy-MM-dd}-%i.log.gz"
Filters:
ThresholdFilter:
- level: error
onMatch: DENY
onMismatch: NEUTRAL
- level: warn
onMatch: DENY
onMismatch: NEUTRAL
- level: info
onMatch: ACCEPT
onMismatch: DENY
JsonLayout:
- charset: ${charset}
compact: ${compact}
complete: ${complete}
stacktraceAsString: ${stacktraceAsString}
eventEol: ${eventEol}
properties: true
KeyValuePair:
- key: tags
value: REQUEST_LOG
Policies:
TimeBasedTriggeringPolicy:
interval: 1
modulate: true
DefaultRolloverStrategy:
max: 100
- name: SERVICE_LOG
fileName: ${log-path}/service.log
filePattern: "${log-path}/historyLog/service-%d{yyyy-MM-dd}-%i.log.gz"
Filters:
ThresholdFilter:
- level: error
onMatch: DENY
onMismatch: NEUTRAL
- level: info
onMatch: ACCEPT
onMismatch: DENY
JsonLayout:
- charset: ${charset}
compact: ${compact}
complete: ${complete}
stacktraceAsString: ${stacktraceAsString}
eventEol: ${eventEol}
properties: true
objectMessageAsJsonObject: true
KeyValuePair:
- key: tags
value: SERVICE_LOG
Policies:
TimeBasedTriggeringPolicy:
interval: 1
modulate: true
DefaultRolloverStrategy:
max: 100
- name: ERROR_LOG
fileName: ${log-path}/error.log
filePattern: "${log-path}/historyLog/error-%d{yyyy-MM-dd}-%i.log.gz"
Filters:
ThresholdFilter:
- level: error
onMatch: ACCEPT
onMismatch: DENY
JsonLayout:
- charset: ${charset}
compact: ${compact}
complete: ${complete}
stacktraceAsString: ${stacktraceAsString}
eventEol: ${eventEol}
properties: true
KeyValuePair:
- key: tags
value: ERROR_LOG
Policies:
TimeBasedTriggeringPolicy:
interval: 1
modulate: true
DefaultRolloverStrategy:
max: 100
# RollingFile:
# - name: REQUEST_LOG
# fileName: ${log-path}/request.log
# filePattern: "${log-path}/historyLog/info-%d{yyyy-MM-dd}-%i.log.gz"
# PatternLayout:
# charset: ${charset}
# pattern: ${log.pattern}
# Filters:
# ThresholdFilter:
# - level: error
# onMatch: DENY
# onMismatch: NEUTRAL
# - level: warn
# onMatch: DENY
# onMismatch: NEUTRAL
# - level: debug
# onMatch: ACCEPT
# onMismatch: DENY
# Policies:
# TimeBasedTriggeringPolicy:
# interval: 1
# modulate: true
# DefaultRolloverStrategy:
# max: 100
# - name: SERVICE_LOG
# fileName: ${log-path}/service.log
# filePattern: "${log-path}/historyLog/service-%d{yyyy-MM-dd}-%i.log.gz"
# PatternLayout:
# charset: ${charset}
# pattern: ${log.pattern}
# Filters:
# ThresholdFilter:
# - level: info
# onMatch: ACCEPT
# onMismatch: DENY
# Policies:
# TimeBasedTriggeringPolicy:
# interval: 1
# modulate: true
# DefaultRolloverStrategy:
# max: 100
# - name: ERROR_LOG
# fileName: ${log-path}/error.log
# filePattern: "${log-path}/historyLog/error-%d{yyyy-MM-dd}-%i.log.gz"
# PatternLayout:
# charset: ${charset}
# pattern: ${log.pattern}
# Filters:
# ThresholdFilter:
# - level: error
# onMatch: ACCEPT
# onMismatch: DENY
# Policies:
# TimeBasedTriggeringPolicy:
# interval: 1
# modulate: true
# DefaultRolloverStrategy:
# max: 100
Kafka:
- name: KAFKA_REQUEST_LOG
topic: ${kafka-topic}
Property:
name: bootstrap.servers
value: ${bootstrap-servers}
Filters:
ThresholdFilter:
- level: error
onMatch: DENY
onMismatch: NEUTRAL
- level: warn
onMatch: DENY
onMismatch: NEUTRAL
- level: info
onMatch: ACCEPT
onMismatch: DENY
JsonLayout:
- charset: ${charset}
compact: ${compact}
complete: ${complete}
stacktraceAsString: ${stacktraceAsString}
eventEol: ${eventEol}
properties: true
KeyValuePair:
- key: tags
value: INFO_LOG
- name: KAFKA_SERVICE_LOG
topic: ${kafka-topic}
Property:
name: bootstrap.servers
value: ${bootstrap-servers}
Filters:
ThresholdFilter:
- level: error
onMatch: DENY
onMismatch: NEUTRAL
- level: info
onMatch: ACCEPT
onMismatch: DENY
JsonLayout:
- charset: ${charset}
compact: ${compact}
complete: ${complete}
stacktraceAsString: ${stacktraceAsString}
eventEol: ${eventEol}
properties: true
objectMessageAsJsonObject: true
KeyValuePair:
- key: tags
value: SERVICE_LOG
- name: KAFKA_ERROR_LOG
topic: ${kafka-topic}
Property:
name: bootstrap.servers
value: ${bootstrap-servers}
Filters:
ThresholdFilter:
- level: error
onMatch: ACCEPT
onMismatch: DENY
JsonLayout:
- charset: ${charset}
compact: ${compact}
complete: ${complete}
stacktraceAsString: ${stacktraceAsString}
eventEol: ${eventEol}
properties: true
KeyValuePair:
- key: tags
value: ERROR_LOG
Loggers:
AsyncRoot:
level: debug
# add location in async
includeLocation: true
AppenderRef:
- ref: CONSOLE
AsyncLogger:
- name: REQUEST_LOG
AppenderRef:
- ref: REQUEST_LOG
- name: SERVICE_LOG
AppenderRef:
- ref: SERVICE_LOG
- name: ERROR_LOG
AppenderRef:
- ref: ERROR_LOG