Logback 配置
本文講logback的xml文件的配置,其中主要是在介紹各類appender。
logback 的簡單例子
xml文件大概結構 導圖鏈接
xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<contextName>拽拽壞人幫</contextName>
<!--輸出到控制檯 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%cn %d{hh:MM:ss} [%20logger{0}] - %message%n</pattern>
</encoder>
</appender>
<logger name = "com.cck.MyLogback">
<appender-ref ref = "STDOUT"/>
</logger>
<root level="debug"></root>
</configuration>
代碼使用
public class MyLogback {
private final static Logger logger
= LoggerFactory.getLogger("com.cck.MyLogback");
public static void main(String[] args) {
logger.info("hello world");
}
}
xml配置中的appender
appender 節點是配置日誌的目的地,該節點必須指定name和class屬性,不同的class會有不同的子節點。
分別有以下幾種類型的appender
- ConsoleAppender 控制檯
- FileAppender 文件
- RollingFileAppender 滾動記錄文件
- SiftingAppender 自定義篩選文件
1. ConsoleAppender 控制檯
xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<contextName>拽拽壞人幫</contextName>
<!--輸出到控制檯 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%cn -%.-1p %d{hh:MM:ss} [%8logger{26}] - %message%n</pattern>
</encoder>
<targer>
System.err
</target>
</appender>
<logger name="com.cck.MyLogback">
<appender-ref ref="STDOUT" />
</logger>
<root level="debug"></root>
</configuration>
<target>String</target>
用於指定字符串在控制檯的打印方式
默認是System.out
, 也可以是System.err
2. FileAppender 文件
xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<contextName>拽拽壞人幫</contextName>
<!--輸出到文件 -->
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>logback.log</file>
<encoder>
<pattern>%cn -%.-1p %d{hh:MM:ss} [%8logger{26}] - %message%n</pattern>
</encoder>
<append>true</append>
<prudent>true</prudent>
</appender>
<logger name="com.cck.MyLogback" level="debug">
<appender-ref ref="FILE" />
</logger>
<root level="info"></root>
</configuration>
<file>logback.log</file>
指定日誌文件名
<append>true</append>
日誌是否追加到文件結尾,默認是true
<prudent>true</prudent>
true的情況下,日誌會被安全地寫入到文件 (加了鎖,因爲存在多個FileAppender同時向日志文件寫入的情況),默認是false
3. RollingFileAppender 滾動記錄文件
3.1 滾動記錄文件 -- 根據時間 TimeBasedRollingPolicy
xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<contextName>拽拽壞人幫</contextName>
<!--滾動記錄文件 根據時間 -->
<appender name="timeRollFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>%cn -%.-1p %d{hh:MM:ss} [%8logger{26}] - %message%n</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logFile/%d{yyyy/MM/dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
</appender>
<logger name="com.cck.MyLogback" level="debug">
<appender-ref ref="timeRollFile" />
</logger>
<root level="info"></root>
</configuration>
<rollingPolicy></rollingPolicy>
指定滾動行爲
rollingPolicy 子節點 <fileNamePattern></fileNamePattern>
指定文件名模式, yyyy/mm/dd 表示按天滾動 模式例子
<maxHistory>30</maxHistory>
控制保存的最大文件數量
如果是每天滾動<maxHistory>30</maxHistory>表示保存最近30天的日誌文件
3.2 滾動記錄文件 -- 根據長度 FixedWindowRollingPolicy
xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<contextName>拽拽壞人幫</contextName>
<!--滾動記錄文件 根據固定長度 -->
<appender name="fixedRollFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>testFixedRollFile.log</file>
<encoder>
<pattern>%d{hh:MM:ss} [%20logger{0}] - %message%n</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<fileNamePattern>logFile/logFile.%i.log</fileNamePattern>
<minIndex>1</minIndex>
<maxIndex>5</maxIndex>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>1KB</maxFileSize>
</triggeringPolicy>
</appender>
<logger name="com.cck.MyLogback" level="debug">
<appender-ref ref="fixedRollFile" />
</logger>
<root level="info"></root>
</configuration>
<rollingPolicy></rollingPolicy>
指定根據窗口長度進滾動。
注意,使用FixedWindowRollingPolicy
必須聲明<file></file>
節點
rollingPolicy 子節點 <fileNamePattern></fileNamePattern>
指定命名模式
注意,必須包含%i
,i 爲窗口索引。
滾動時,日誌文件名爲logFile/logFile'i'.log
eg .logFile/logFile1.log
logFile/logFile2.log
rollingPolicy 子節點 <minIndex>1</minIndex>
指定 i 的最小值
rollingPolicy 子節點 <maxIndex>5</maxIndex>
指定 i 的最大值
<triggeringPolicy></triggeringPolicy >
指定何時滾動
triggeringPolicy 子節點 <maxFileSize>1KB</maxFileSize>
指定文件大小爲 1KB 時進行滾動
4. SiftingAppender 自定義篩選文件
假設有以下需求
userId 是6位的,現在想讓前4位id相同的用戶的日誌放在一個文件夾中。並且id爲 000000 單獨拿出來。
也就是以下的效果:
/000000.log
/0001
/01.log
/23.log
/0002
/12.log
/00.log
第一步,按照業務需求編寫Java類
package com.cck;
import java.util.Map;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.sift.AbstractDiscriminator;
public class MyLoggerDiscriminator extends AbstractDiscriminator<ILoggingEvent> {
public final static String KEY = "user";
private String filePath;
private String fileName;
private String defaultValue = "000000";
public String getDefaultValue() {
return defaultValue;
}
public void setDefaultValue(String defaultValue) {
this.defaultValue = defaultValue;
}
@Override
public String getDiscriminatingValue(ILoggingEvent e) {
// 拿到mdc
Map<String, String> mdc = e.getMDCPropertyMap();
String user = mdc.get(KEY);
if(user == null || user == "000000") {
return defaultValue;
}
// 返回一個路徑
filePath = user.substring(0, 4) + "/";
fileName = user.substring(4, 6);
return filePath + fileName;
}
@Override
public String getKey() {
return KEY;
}
}
第二步,在xml使用
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<contextName>拽拽壞人幫</contextName>
<!-- 自定義 -->
<appender name="siftingLog" class="ch.qos.logback.classic.sift.SiftingAppender">
<discriminator class="com.cck.MyLoggerDiscriminator" />
<sift>
<appender name="user-${user}" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>siftingLog/${user}.log</file>
<encoder>
<pattern>%date{HH:mm:ss} %.-1level[%25logger{0}] - <%message>%n</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>siftingLog/${user}.%d{yyyy-MM-dd}.log.gz</fileNamePattern>
</rollingPolicy>
</appender>
</sift>
</appender>
<logger name="com.cck.MyLogback" level="debug">
<appender-ref ref="siftingLog" />
</logger>
<root level="info"></root>
</configuration>
<discriminator class="com.cck.MyLoggerDiscriminator" />
指定自定自定義的鑑別類
第三步,使用
package com.cck;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.MDC;
public class MyLogback {
private final static Logger logger = LoggerFactory.getLogger("com.cck.MyLogback");
public static void main(String[] args) {
MDC.put(MyLoggerDiscriminator.KEY, "156651");
logger.debug("hello world");
}
}