文章目录
Logback介绍
Logback是由log4j创始人设计的另一个开源日志组件,官方网站: http://logback.qos.ch。它当前分为下面三个模块:
- logback-core:其它两个模块的基础模块
- logback-classic:它是log4j的一个改良版本,同时它完整实现了slf4j API使你可以很方便地更换成其它日志系统如log4j或JDK14 Logging
- logback-access:访问模块与Servlet容器集成提供通过Http来访问日志的功能
快速上手
配置步骤
1. 添加依赖包
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
注:在maven工程中只需要添加上面的一个依赖即可,上述依赖所需要依赖的其他依赖则会自动下载添加到工程里
2. 导入一个配置模板
你可以直接点击下面的链接下载一个logback基础配置模板
- src
- main
- resources
- test
- resources
- main
3. 添加自定义的配置项
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</Pattern>
</layout>
</appender>
<logger name="com.base22" level="TRACE"/>
<root level="debug">
<appender-ref ref="STDOUT" />
</root>
</configuration>
4. 在代码中使用logback输出日志
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class LogbackTest {
private final static Logger logger = LoggerFactory.getLogger(LogbackTest.class);
public void testLog() {
logger.trace("Hello World!");
logger.debug("How are you today?");
logger.info("I am fine.");
logger.warn("I love programming.");
logger.error("I am programming.");
}
}
示例
在maven工程中的pom.xml中添加依赖
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.6</version>
<scope>provided</scope>
</dependency>
工程源代码示例
logback.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 相对项目根目录的子文件夹logs -->
<property name="HOME_LOG" value="logs"/>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36}-[%M] - %msg%n</Pattern>
</layout>
</appender>
<appender name="RollingFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>TRACE</level>
</filter>
<!-- 测试部署时使用如下配置 -->
<!-- 可让每天产生一个日志文件,最多 30 个,更早的删除 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<fileNamePattern>${HOME_LOG}/log-%d{yyyy-MM-dd}.log</fileNamePattern>
<!--日志文件保留天数-->
<maxHistory>10</maxHistory>
</rollingPolicy>
<!--
RollingFileAppender 一般情况下需要配置两个参数:
RollingPolicy,负责滚动。TriggeringPolicy,决定是否以及何时进行滚动
TimeBasedRollingPolicy比较特殊,它同时继承了RollingPolicy和TriggerPolicy。
-->
<encoder>
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36}-[%M] - %msg%n</pattern>
</encoder>
<!-- 正式部署时使用此配置 -->
<!--
<file>${app.home}/logs/log.log</file>
<append>true</append>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<fileNamePattern>${app.home}/logs/log.%i.log.zip</fileNamePattern>
<minIndex>1</minIndex>
<maxIndex>7</maxIndex>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
</encoder>
日志文件最大的大小
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>50MB</maxFileSize>
</triggeringPolicy>
-->
</appender>
<logger name="com.lanou3g.spring" level="DEBUG"/>
<logger name="org.springframework" level="ERROR"/>
<!-- 日志输出级别 -->
<root level="debug">
<appender-ref ref="STDOUT"/>
<appender-ref ref="RollingFile" />
</root>
</configuration>
程序运行入口
@Slf4j
public class App {
public static void main(String[] args) {
getLog();
}
public static void getLog(){
//优先级从高到低依次为:ERROR、WARN、INFO、DEBUG、TRACE。
log.trace("main:trace"); //很低的日志级别,一般不会使用。
log.debug("main:debug"); //指出细粒度信息事件对调试应用程序是非常有帮助的,主要用于开发过程中打印一些运行信息。
log.info("main:info"); //消息在粗粒度级别上突出强调应用程序的运行过程。打印一些你感兴趣的或者重要的信息,这个可以用于生产环境中输出程序运行的一些重要信息,但是不能滥用,避免打印过多的日志。
log.warn("main:warn"); //表明会出现潜在错误的情形,有些信息不是错误信息,但是也要给程序员的一些提示。
log.error("main:error"); //指出虽然发生错误事件,但仍然不影响系统的继续运行。打印错误和异常信息,如果不想输出太多的日志,可以使用这个级别。
}
}
控制台输出
2019-06-22 10:42:17.208 [main] DEBUG com.logback.demo.App-[getLog] - main:debug
2019-06-22 10:42:17.216 [main] INFO com.logback.demo.App-[getLog] - main:info
2019-06-22 10:42:17.218 [main] WARN com.logback.demo.App-[getLog] - main:warn
2019-06-22 10:42:17.218 [main] ERROR com.logback.demo.App-[getLog] - main:error
单元测试代码示例
logback_test.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 相对项目根目录的子文件夹logs -->
<property name="HOME_LOG" value="logs"/>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36}-[%M] - %msg%n</Pattern>
</layout>
</appender>
<appender name="RollingFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>TRACE</level>
</filter>
<!-- 测试部署时使用如下配置 -->
<!-- 可让每天产生一个日志文件,最多 30 个,更早的删除 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<fileNamePattern>${HOME_LOG}/log-%d{yyyy-MM-dd}.log</fileNamePattern>
<!--日志文件保留天数-->
<maxHistory>10</maxHistory>
</rollingPolicy>
<!--
RollingFileAppender 一般情况下需要配置两个参数:
RollingPolicy,负责滚动。TriggeringPolicy,决定是否以及何时进行滚动
TimeBasedRollingPolicy比较特殊,它同时继承了RollingPolicy和TriggerPolicy。
-->
<encoder>
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36}-[%M] - %msg%n</pattern>
</encoder>
<!-- 正式部署时使用此配置 -->
<!--
<file>${app.home}/logs/log.log</file>
<append>true</append>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<fileNamePattern>${app.home}/logs/log.%i.log.zip</fileNamePattern>
<minIndex>1</minIndex>
<maxIndex>7</maxIndex>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
</encoder>
日志文件最大的大小
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>50MB</maxFileSize>
</triggeringPolicy>
-->
</appender>
<logger name="com.lanou3g.spring" level="DEBUG"/>
<logger name="org.springframework" level="ERROR"/>
<!-- 日志输出级别 -->
<root level="debug">
<appender-ref ref="STDOUT"/>
<appender-ref ref="RollingFile" />
</root>
</configuration>
程序运行入口
@Slf4j
public class AppTest {
/**
* Rigorous Test :-)
*/
@Test
public void shouldAnswerWithTrue() {
//优先级从高到低依次为:ERROR、WARN、INFO、DEBUG、TRACE。
log.trace("trace"); //很低的日志级别,一般不会使用。
log.debug("debug"); //指出细粒度信息事件对调试应用程序是非常有帮助的,主要用于开发过程中打印一些运行信息。
log.info("info"); //消息在粗粒度级别上突出强调应用程序的运行过程。打印一些你感兴趣的或者重要的信息,这个可以用于生产环境中输出程序运行的一些重要信息,但是不能滥用,避免打印过多的日志。
log.warn("warn"); //表明会出现潜在错误的情形,有些信息不是错误信息,但是也要给程序员的一些提示。
log.error("error"); //指出虽然发生错误事件,但仍然不影响系统的继续运行。打印错误和异常信息,如果不想输出太多的日志,可以使用这个级别。
}
}
控制台输出
2019-06-22 10:52:32.208 [main] DEBUG com.logback.demo.AppTest-[shouldAnswerWithTrue] - debug
2019-06-22 10:52:32.217 [main] INFO com.logback.demo.AppTest-[shouldAnswerWithTrue] - info
2019-06-22 10:52:32.219 [main] WARN com.logback.demo.AppTest-[shouldAnswerWithTrue] - warn
2019-06-22 10:52:32.220 [main] ERROR com.logback.demo.AppTest-[shouldAnswerWithTrue] - error
生成的日志文件内容
注意:本示例的源代码和测试代码生成的日志在一个文件里
// 工程源代码示例记录的日志
2019-06-22 10:42:17.208 [main] DEBUG com.logback.demo.App-[getLog] - main:debug
2019-06-22 10:42:17.216 [main] INFO com.logback.demo.App-[getLog] - main:info
2019-06-22 10:42:17.218 [main] WARN com.logback.demo.App-[getLog] - main:warn
2019-06-22 10:42:17.218 [main] ERROR com.logback.demo.App-[getLog] - main:error
// 单元测试代码示例记录的日志
2019-06-22 10:52:32.208 [main] DEBUG com.logback.demo.AppTest-[shouldAnswerWithTrue] - debug
2019-06-22 10:52:32.217 [main] INFO com.logback.demo.AppTest-[shouldAnswerWithTrue] - info
2019-06-22 10:52:32.219 [main] WARN com.logback.demo.AppTest-[shouldAnswerWithTrue] - warn
2019-06-22 10:52:32.220 [main] ERROR com.logback.demo.AppTest-[shouldAnswerWithTrue] - error