文章目录
Logback简介
- Logback简介
- Logback中的组件
- Logback配置文件
- 日志输出格式
- LogBack知识点
- 使用logback.xml配置文件
- 输出到控制台
- 输出到文件
- 以html的格式输出到文件
- 日志拆分和归档压缩
- appender添加过滤器
- 异步打印日志
- 自定义logger
- 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来访问日志的功能。
Logger
: 日志的记录器,主要用于存放日志对象,也可以定义日志类型、级别。Appender
:用于指定日志输出的目的地,目的地可以是控制台、文件、数据库等等。Layout
: 负责把事件转换成字符串,格式化的日志信息的输出。- 在Logback中Layout对象被封装在encoder中。
- 也就是说我们未来使用的encoder其实就是Layout
Logback提供了3种配置文件
- logback.groovy
- logback-test.xml
logback.xml
- 如果都不存在则采用默认的配置
- %-10level 级别 案例为设置10个字符,左对齐
- %d{yyyy-MM-dd HH:mm:ss.SSS} 日期
- %c 当前类全限定名
- %M 当前执行日志的方法
- %L 行号
- %thread 线程名称
- %m或者%msg 信息
- %n 换行
org.slf4j
slf4j-api
1.7.25
ch.qos.logback
logback-classic
1.2.3
junit
junit
4.12
@Test
public void test01() {
/*
入门案例
logback有5种级别的日志输出
分别是
trace < debug < info < warn < error
通过信息打印,默认的日志级别是debug,trace信息没有打印出来
*/
// 一般LogBack都和slf4j门面结合使用,LoggerFactory是slf4j中的类
Logger logger = LoggerFactory.getLogger(LogBackTest.class);
logger.error("error信息");
logger.warn("warn信息");
logger.info("info信息");
logger.debug("debug信息");
logger.trace("trace信息");
}
22:32:45.869 [main] ERROR com.guizy.LogBackTest - error信息
22:32:45.871 [main] WARN com.guizy.LogBackTest - warn信息
22:32:45.871 [main] INFO com.guizy.LogBackTest - info信息
22:32:45.871 [main] DEBUG com.guizy.LogBackTest - debug信息
使用logback.xml配置文件
输出到控制台
System.err
${pattern}
@Test
public void test02() {
/*
Logback配置文件的使用
在resources下面,创建一份配置文件,命名为logback.xml
一切配置都是在根标签中进行操作的
*/
Logger logger = LoggerFactory.getLogger(LogBackTest.class);
logger.error("error信息");
logger.warn("warn信息");
logger.info("info信息");
logger.debug("debug信息");
logger.trace("trace信息");
}
[ERROR] 2022-03-30 22:35:35.935 com.guizy.LogBackTest test02 49 main error信息
[WARN ] 2022-03-30 22:35:35.936 com.guizy.LogBackTest test02 50 main warn信息
[INFO ] 2022-03-30 22:35:35.937 com.guizy.LogBackTest test02 51 main info信息
[DEBUG] 2022-03-30 22:35:35.937 com.guizy.LogBackTest test02 52 main debug信息
[TRACE] 2022-03-30 22:35:35.937 com.guizy.LogBackTest test02 53 main trace信息
输出到文件
${logDir}/logback.log
${pattern}
@Test
public void test03() {
/*
在实际的生产环境中,我们更希望将日志信息保留在文件中
在文件中,默认是以追加日志的形式做记录
*/
Logger logger = LoggerFactory.getLogger(LogBackTest.class);
logger.error("error信息");
logger.warn("warn信息");
logger.info("info信息");
logger.debug("debug信息");
logger.trace("trace信息");
}
// 指定文件也会输出内容,多次则会追加
[ERROR] 2022-03-30 22:48:55.654 com.guizy.LogBackTest test03 63 main error信息
[WARN ] 2022-03-30 22:48:55.657 com.guizy.LogBackTest test03 64 main warn信息
[INFO ] 2022-03-30 22:48:55.657 com.guizy.LogBackTest test03 65 main info信息
[DEBUG] 2022-03-30 22:48:55.657 com.guizy.LogBackTest test03 66 main debug信息
[TRACE] 2022-03-30 22:48:55.657 com.guizy.LogBackTest test03 67 main trace信息
以html的格式输出到文件
${logDir}/logback.html
${pattern}
@Test
public void test04() {
/*
将日志输出成为一个html文件
这个html文件是由logback来帮我们控制样式以及输出的格式
内容由我们自己来指定
初始测试:样式不是很好看,需要将换行,空格都去除掉
在实际生产环境中,如果日志不是很多,建议使用html的方式去进行日志的记录
*/
Logger logger = LoggerFactory.getLogger(LogBackTest.class);
logger.error("error信息");
logger.warn("warn信息");
logger.info("info信息");
logger.debug("debug信息");
logger.trace("trace信息");
}
日志拆分和归档压缩
${pattern}
${logDir}/roll_logback.log
${logDir}/roll.%d{yyyy-MM-dd}.log%i.gz
1KB
@Test
public void test05() {
/*
日志拆分和归档压缩
重要标签来源:
查看源码
RollingFileAppender类中找到rollingPolicy属性
SizeAndTimeBasedRollingPolicy类中找到maxFileSize属性
这些属性在类中都是以set方法的形式进行的赋值
我们在配置文件中配置的信息,其实找到的都是这些属性的set方法
在TimeBasedRollingPolicy找到
static final String FNP_NOT_SET =
"The FileNamePattern option must be set before using TimeBasedRollingPolicy. ";
只要我们要使用到日志的拆分
FileNamePattern属性是必须要使用到了
*/
for (int i = 0; i
${pattern}
ERROR
ACCEPT
DENY
@Test
public void test06() {
/*
我们可以在appender中添加过滤器
以此对日志进行更细粒度的打印
*/
Logger logger = LoggerFactory.getLogger(LogBackTest.class);
logger.error("error信息");
logger.warn("warn信息");
logger.info("info信息");
logger.debug("debug信息");
logger.trace("trace信息");
}
[ERROR] 2022-03-30 23:29:36.221 com.guizy.LogBackTest test06 133 main error信息
异步打印日志
@Test
public void test07() {
/*
按照我们当前的代码执行顺序
代码肯定是按照从上向下的顺序执行
上面的代码完全执行完毕后,才会执行下面的代码
由此得出会出现的问题:
只要是在记录日志,那么系统本身的功能就处于一种停滞的状态
当日志记录完毕后,才会执行其他的代码
如果日志记录量非常庞大的话,那么我们对于系统本身业务代码的执行效率会非常低
所以logback为我们提供了异步日志的功能
配置方式:
1.配置异步日志
在异步日志中引入我们真正需要输出的appender
2.在rootlogger下引入异步日志
所谓异步日志的原理是:
系统会为日志操作单独的分配出来一根线程,原来用来执行当前方法的主线程会继续向下执行
线程1:系统业务代码执行
线程2:打印日志
两根线程争夺CPU的使用权
在实际项目开发中,越大的项目对于日志的记录就越庞大
为了保证项目的执行效率,异步日志是一个很好的选择
*/
Logger logger = LoggerFactory.getLogger(LogBackTest.class);
//日志打印操作
for (int i = 0; i
@Test
public void test08() {
/*
自定义logger
*/
Logger logger = LoggerFactory.getLogger(LogBackTest.class);
logger.error("error信息");
logger.warn("warn信息");
logger.info("info信息");
logger.debug("debug信息");
logger.trace("trace信息");
}
[ERROR] 2022-03-30 23:45:07.931 com.guizy.LogBackTest test08 204 main error信息
[WARN ] 2022-03-30 23:45:07.933 com.guizy.LogBackTest test08 205 main warn信息
[INFO ] 2022-03-30 23:45:07.933 com.guizy.LogBackTest test08 206 main info信息
logback配置文件转换
@Test
public void test09() {
/*
关于logback补充:
1.异步日志:
可配置属性
配置了一个阈值
当队列的剩余容量小于这个阈值的时候,当前日志的级别 trace、debug、info这3个级别的日志将被丢弃
设置为0,说明永远都不会丢弃trace、debug、info这3个级别的日志
0
配置队列的深度,这个值会影响记录日志的性能,默认值就是256
256
关于这两个属性,一般情况下,我们使用默认值即可
不要乱配置,会影响系统性能,了解其功能即可
2.关于不同的日志实现,配置文件也是不同的
例如:
log4j经常使用的是properties属性文件
logback使用的是xml配置文件
如果我们遇到了一种情况,就是需要将以前的log4j,改造为使用logback
应该如何处理
我们可以使用工具
访问logback官网
找到log4j.properties转换器
只要是二者兼容的技术,才会被翻译
如果是log4j独立的技术,logback没有,或者是有这个技术但是并不兼容转义
那么这个工具则不会为我们进行翻译
如果是遇到简单的配置,我们可以使用工具
*/
}