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");
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。