官网文档 | 中文文档

logback-classic 默认导入了 slf4j 以及 logback-core(都是一个人的嘛)

1
2
3
4
5
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.8</version>
</dependency>

默认日志级别debug (复杂日志框架(log4j logback)都是debug,简单实现日志框架(jul slf4j-sample)都是info)

image.png

1
2
3
4
5
6
7
8
@Test
public void testQuick() {
logger.error("error");
logger.warn("warn");
logger.info("info");
logger.debug("debug"); // 默认级别
logger.trace("trace");
}

配置文件

可以通过 PropertiesTranslator 将log4j.properties 转化为xml形式

logback会依次读取以下类型配置文件:

  • logback.groovy
  • logback-test.xml
  • logback.xml
  • 如果均不存在会采用默认配置(BasicConfigurator,直接输出到控制台上)

logback组件之间的关系

  • Logger: 日志的记录器,把它关联到应用的对应的context上后,主要用于存放日志对象,也 可以定义日志类型、级别;
  • Appender: 用于指定日志输出的目的地,目的地可以是控制台、文件、数据库等等;
  • Layout: 负责把事件转换成字符串,格式化的日志信息的输出。在logback中Layout对象被封 装在encoder中。

配置文件详情

大写的简化形式都不推荐,影响性能问题

格式化 含义 备注
%-5level = %p = %le 日志级别
%d{yyyy-MM-dd HH:mm:ss.SSS} 日期
%c{length} = %logger = %lo 类的完整名称 后面数字代表简写的形式不代表长度
%thread= %t 线程名称
%r = %relative 程序启动到创建日志记录的时间 单位是毫秒
%m = %msg 信息
%n 换行
%C = %class 全限定类名 避免使用
%M method 避免使用
%L 行号 避免使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?xml version="1.0" encoding="UTF-8"?>

<configuration>

<!--配置集中管理属性-->
<property name="pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %c{36} - %msg%n"/>

<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<!--控制输出流对象,默认为System.out 变为红色字体-->
<target>System.err</target>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
</appender>

<root level="ALL">
<appender-ref ref="console"/>
</root>
</configuration>

文件输出

一般封装好的类都处于classic包下面,没有封装好的,进行二次开发的都处于core包下面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?xml version="1.0" encoding="UTF-8"?>

<configuration>
<property name="pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %c{36} - %msg%n"/>
<property name="log_dir" value="./logs"/>

<appender name="file" class="ch.qos.logback.core.FileAppender">
<file>${log_dir}/logback.log</file>
<append>true</append>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
</appender>

<root level="ALL">
<appender-ref ref="file"/>
</root>
</configuration>

自定义html输出

一般封装好的类都处于classic包下面,没有封装好的,进行二次开发的都处于core包下面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?xml version="1.0" encoding="UTF-8"?>

<configuration>
<!--配置集中管理属性-->
<property name="pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %c{36} - %msg%n"/>
<property name="log_dir" value="./logs"/>

<appender name="file" class="ch.qos.logback.core.FileAppender">
<file>${log_dir}/logback.log</file>
<append>true</append>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
</appender>

<appender name="html" class="ch.qos.logback.core.FileAppender"> <==classic包下面
<file>${log_dir}/logback.html</file>
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"> <==core包下面
<layout class="ch.qos.logback.classic.html.HTMLLayout"> <==classic包下面
<pattern>%d{HH:mm:ss.SSS} %thread %-5level %c{36} - %msg%n</pattern>
</layout>
</encoder>
</appender>

<root level="ALL">
<appender-ref ref="file"/>
<appender-ref ref="html"/>
</root>
</configuration>

日志拆分和归档压缩

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?xml version="1.0" encoding="UTF-8"?>

<configuration>
<property name="pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %c{36} - %msg%n"/>
<property name="log_dir" value="./logs"/>

<!--日志拆分和归档压缩-->
<appender name="rollFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log_dir}/roll_logback.log</file>
<append>true</append>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--按照文件大小进行拆分-->
<maxFileSize>1mb</maxFileSize>
<!--按照时间进行拆分和归档压缩-->
<fileNamePattern>${log_dir}/roll_logback.%d{yyyy-MM-dd-HH-mm-ss}.log%i.zip</fileNamePattern>
</rollingPolicy>
</appender>

<root level="ALL">
<appender-ref ref="rollFile"/>
</root>
</configuration>

日志过滤器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?xml version="1.0" encoding="UTF-8"?>

<configuration>
<property name="pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %c{36} - %msg%n"/>
<property name="log_dir" value="./logs"/>

<appender name="rollFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log_dir}/roll_logback.log</file>
<append>true</append>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<maxFileSize>1mb</maxFileSize>
<fileNamePattern>${log_dir}/roll_logback.%d{yyyy-MM-dd-HH-mm-ss}.log%i.zip</fileNamePattern>
</rollingPolicy>
<!--过滤器-->
<filter class="ch.qos.logback.classic.filter.LevelFilter"> <== 过滤器
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>

<root level="ALL">
<appender-ref ref="rollFile"/>
</root>
</configuration>

异步日志记录

异步日志借助其他的appender完成异步任务,底层使用阻塞队列完成

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?xml version="1.0" encoding="UTF-8"?>

<configuration>
<property name="pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %c{36} - %msg%n"/>
<property name="log_dir" value="./logs"/>

<appender name="rollFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log_dir}/roll_logback.log</file>
<append>true</append>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<maxFileSize>1mb</maxFileSize>
<fileNamePattern>${log_dir}/roll_logback.%d{yyyy-MM-dd-HH-mm-ss}.log%i.zip</fileNamePattern>
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--异步日志记录-->
<appender name="async" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="rollFile"/> <== 借助rollFile完成异步任务
</appender>

<root level="ALL">
<appender-ref ref="async"/>
</root>
</configuration>

自定义Logger

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?xml version="1.0" encoding="UTF-8"?>

<configuration>
<property name="pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %c{36} - %msg%n"/>
<property name="log_dir" value="./logs"/>

<appender name="rollFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log_dir}/roll_logback.log</file>
<append>true</append>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<maxFileSize>1mb</maxFileSize>
<fileNamePattern>${log_dir}/roll_logback.%d{yyyy-MM-dd-HH-mm-ss}.log%i.zip</fileNamePattern>
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>

<root level="ALL">
<appender-ref ref="rollFile"/>
</root>

<!--自定义logger additivity=false不存在父子继承关系-->
<logger name="cn.quguai" level="info" additivity="false">
<appender-ref ref="console"/>
</logger>
</configuration>

注意:即使会输出root级别的文件,但是大小均为0kb。

logback-access的使用

logback-access模块与Servlet容器(如Tomcat和Jetty)集成,以提供HTTP访问日志功能。我们可以使 用logback-access模块来替换tomcat的访问日志。

  1. 将logback-access.jar与logback-core.jar复制到$TOMCAT_HOME/lib/目录下

  2. 修改$TOMCAT_HOME/conf/server.xml中的Host元素中添加:

    1
    <Valve className="ch.qos.logback.access.tomcat.LogbackValve" />
  3. logback默认会在$TOMCAT_HOME/conf下查找文件 logback-access.xml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
    <!-- always a good activate OnConsoleStatusListener -->
    <statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener"/>
    <property name="LOG_DIR" value="${catalina.base}/logs"/>
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${LOG_DIR}/access.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
    <fileNamePattern>access.%d{yyyy-MM-dd}.log.zip</fileNamePattern>
    </rollingPolicy>
    <encoder>
    <!-- 访问日志的格式 -->
    <pattern>combined</pattern> <== logback集成的格式信息可以参考下方链接
    </encoder>
    </appender>
    <appender-ref ref="FILE"/>
    </configuration>
  4. 官方配置: https://logback.qos.ch/access.html#configuration