Logback 配置
本文讲logback的xml文件的配置,其中主要是在介绍各类appender。
logback 的简单例子
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
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"); } }