Logback 介绍
Logback 是由 log4j 创始人设计的又一个开源日志组件.logback 当前分成三个模块:logback-core,logback- classic 和 logback-access.logback-core 是其它两个模块的基础模块.logback-classic 是 log4j 的一个 改良版本.此外 logback-classic 完整实现 SLF4J API 使你可以很方便地更换成其它日志系统如 log4j 或 JDK14 Logging.logback-access 访问模块与 Servlet 容器集成提供通过 Http 来访问日志的功能.
Logback 的优点
执行速度快,初始化内存加载小;
原生实现了 SLF4J API,不需要进行转换;
配置简单,并可以适应多种环境;
可以定时的删除过期日志;
更为强大的过滤器,不必因更改日志级别而产生大量的日志;
可以从 IO 错误中进行恢复;
....
关于 logback 的优点还有很多,这里我就不一一列举了.详细的可以查看官方的 Api 文档.
地址: https://logback.qos.ch/documentation.html
Logback 的配置说明
关于这块的配置说明,我就简单的列举一些比较常用配置来进行说明.如果还想了解更多,请看官方的文档说明.
Logback 的层级说明
简单的层级结构,实际有更多,仅供参考.
configuration
root
logger
property
appender
layout
rollingPolicy
Pattern
fileNamePattern
maxFileSize
maxHistory
totalSizeCap
具体说明
configuration 根节点, 一般有三个属性,分别是 scan,scanPeriod 和 debug.
scan: 是否自动加载,默认为 true.
scanPeriod: 监听修改时间间隔,默认一分钟.
debug: 是否查看 logback 运行状态,默认 true.
那么我们要使用这个的话,可以进行如下配置:
<configuration scan="true" scanPeriod="30 seconds" debug="true">
...
</configuration>
root 和 logger 子节点,用于指定输入的日志级别.
root :这个是指定主日志的级别.
logger : 这个是指定自定义日志的级别.
说明: root 指定的日志级别就是用类进行输出的日志, 例如:
private static Logger LOG = LoggerFactory.getLogger(logbackTest.class);
logger 指定的日志级别是自定义的级别,例如:
private static Logger LOG2 = LoggerFactory.getLogger("oneInfo");
他们的用法如下:
<logger name="oneInfo" level="DEBUG" additivity="false">
<appender-ref ref="ONE_INFO" />
</logger>
<root level="INFO">
<appender-ref ref="STDOUT"/>
<appender-ref ref="FILE" />
</root>
说明二: level 是日志输出的级别,additivity 表示是否在控制台打印该日志.
property 子节点,一般用来定义变量值.有两个属性 name 和 value.类似 Java 中 Map 的 key 和 value.
name: 变量的名称
value: 变量的值
用法如下:
<property name="LOG_HOME" value="logs/pcm"/>
说明: value 指定的文件路径,会在项目同级目录下自动生成,无需手动创建.
appender 子节点,负责写日志的组件.有两个属性,name 和 class.
name: 自定义名称.
class: 对应自定义名称的全限定名,就是使用何种方式进行日志的输出.
这个非常重要,也可以说是 logback 的核心吧.简单的用法如下:
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
</appender>
说明: 定义一个 STDOUT 名称,在控制台进行输出.
layout 和 Pattern 这两个一般是一起使用的.
layout: 格式化日志信息;
Pattern :layout 子节点,定义输出信息的格式;
简单的用法如下:
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level - %msg%n
</Pattern>
</layout>
说明: Pattern 里面格式的 %d 表示输出的时间格式,%thread 表示输出的线程名称,%-5level 表示字符宽度,%msg 表示输出的信息,%n 表示换行.
rollingPolicy,fileNamePattern,maxFileSize, maxHistory 和 totalSizeCap 这些一般用于对日志进行滚动,也就是日志切割管理之类的.
rollingPolicy: 决定日志滚动行为,一般用于日志切割.
fileNamePattern: 必要的节点,一般用于指定日志的文件的路径以及生成格式.
maxFileSize: 单个日志文件最大值,达到之后就进行切割.
maxHistory: 日志文件最多保留的天数,也就是过期时间.
totalSizeCap : 日志文件总体的最大值,达到之后就不再产生日志.
简单的用法如下:
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/mylog-%d{yyyy-MM-dd}.%i.txt</fileNamePattern>
<maxFileSize>10MB</maxFileSize>
<maxHistory>31</maxHistory>
<totalSizeCap>10GB</totalSizeCap>
</rollingPolicy>
</appender>
说明: 这段的配置意义是,每天产生一个日志文件,如果超出了 10M,日志就进行切割,并且在日志文件名称上加一,日志文件最多保持 31 天,日志文件总共最大为 10G.
Logback 使用说明
在对 logback 日志的配置文件进行了简单的说明之后,那我们来简单的使用 logback 吧.
logback.xml 使用需要依赖三个 jar 包,分别是 slf4j-api,logback-core,logback-classic.
mavan 配置如下:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>
成功在 maven 添加依赖包之后,我们写个简单的 demo 来测试下吧.
定义三个 log 日志,一个主 log,两个自定义 log.
整体配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="30 seconds" debug="true">
<property name="LOG_HOME" value="logs/pcm"/>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level - %msg%n
</Pattern>
</layout>
</appender>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/mylog-%d{yyyy-MM-dd}.%i.txt</fileNamePattern>
<maxFileSize>10MB</maxFileSize>
<maxHistory>31</maxHistory>
<totalSizeCap>10GB</totalSizeCap>
</rollingPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level - %msg%n
</Pattern>
</layout>
</appender>
<appender name="ONE_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- rollover daily -->
<fileNamePattern>${LOG_HOME}/oneInfo/%d{yyyy-MM-dd}/oneInfo.%i.txt</fileNamePattern>
<maxFileSize>10MB</maxFileSize>
<maxHistory>31</maxHistory>
<totalSizeCap>10GB</totalSizeCap>
</rollingPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level - %msg%n
</Pattern>
</layout>
</appender>
<appender name="TWO_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- rollover daily -->
<fileNamePattern>${LOG_HOME}/twoInfo/%d{yyyy-MM-dd}/twoInfo.%i.txt</fileNamePattern>
<maxFileSize>10MB</maxFileSize>
<maxHistory>31</maxHistory>
<totalSizeCap>10GB</totalSizeCap>
</rollingPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level - %msg%n
</Pattern>
</layout>
</appender>
<logger name="oneInfo" level="DEBUG" additivity="false">
<appender-ref ref="ONE_INFO" />
</logger>
<logger name="twoInfo" level="WARN" additivity="true">
<appender-ref ref="TWO_INFO" />
</logger>
<root level="INFO">
<appender-ref ref="STDOUT"/>
<appender-ref ref="FILE" />
</root>
</configuration>
然后分别在控制台输出和文件中进行输出.
该 java 的代码示例如下:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
*
* Title: logbackTest
* Description:
* logback日志测试
* Version:1.0.0
* @author pancm
* @date 2018年1月24日
*/
public class logbackTest {
private static Logger LOG = LoggerFactory.getLogger(logbackTest.class);
private static Logger LOG2 = LoggerFactory.getLogger("oneInfo");
private static Logger LOG3 = LoggerFactory.getLogger("twoInfo");
public static void main(String[] args) {
test();
}
private static void test(){
LOG.debug("主程序的debug");
LOG.info("主程序的info");
LOG.warn("主程序的warn");
LOG.error("主程序的error");
LOG2.debug("oneInfo的debug");
LOG2.info("oneInfo的info");
LOG2.warn("oneInfo的warn");
LOG2.error("oneInfo的error");
LOG3.debug("twoInfo的debug");
LOG3.info("twoInfo的info");
LOG3.warn("twoInfo的warn");
LOG3.error("twoInfo的error");
}
输出结果如下:
日志的生成目录:
输出结果的说明:
LOG: 因为设置打印的级别是 info,所以 debug 级别的不会打印 .
LOG2: 因为自定义配置设定的是 additivity="false" 不在控制台打印. 所以一条都不会打印,但是 debug 级别以上的日志可以在 logs/pcm/oneInfo 中查看.
LOG3: 因为自定义配置设定的是 additivity="true" 可以在控制台打印.所以会打印两条 warn 级别的日志,日志也可以在 logs/pcm/oneInfo 中查看.
其它
参考:
https://logback.qos.ch/documentation.html https://www.cnblogs.com/warking/p/5710303.html
到此,本文的 logback 日志简单讲解结束,谢谢阅读!
来源: http://www.bubuko.com/infodetail-2475197.html