slf4j,即(Simple Logging Facade for Java,简单门面日志)。它是对所有日志框架制定的一种规范、标准、接口,并不是一个框架的具体的实现,它只服务于各种各样的日志系统。
slf4j提供了统一的记录日志的接口,对不同日志系统的具体实现进行了抽象化,只要按照其提供的方法记录即可,最终日志的格式、记录级别、输出方式等通过绑定具体的日志系统来实现。
比如,一个项目中用到了logback,引入的类库则是使用log4j的,那么是不是要去维护两套日志框架,但是如果类库是使用SLF4J,开发的时候能够继续使用当前的日志框架,因为slf4j能够选择使用哪个实现框架,而不用维护另一套日志框架。
另一个特性是,SLFJ4J在日志打印的时候,使用的占位符的特性。在运行时候,占位符会被某个实际的字符串替换,从而节省新建的String对象,并且能够减少字符串的次数。
package com.zhou.test; import lombok.extern.slf4j.Slf4j; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * 日志测试类 */ @Slf4j public class LogTest { private static final Logger logger = LoggerFactory.getLogger(LogTest.class); public static void logTestOut() { for (int i = 0; i < 10000; i++) { logger.info("org.slf4j.Logger输出"); log.info("lombok.extern.slf4j.Slf4j包下日志输出"); } } public static void main(String[] args) throws InterruptedException { while (true) { logTestOut(); Thread.sleep(5 * 1000); } } }
日志输出结果
2023-05-26 10:53:37.072 [main] INFO com.zhou.test.LogTest - org.slf4j.Logger输出 2023-05-26 10:53:37.074 [main] INFO com.zhou.test.LogTest - lombok.extern.slf4j.Slf4j包下日志输出
SpringBoot框架内部已经集成slf4j,因此并不需要引入其他依赖,使用时需要在类中使用LoggerFactory.getLogger(类名.class)可以获取到logger对象
private static final Logger logger = LoggerFactory.getLogger(LogTest.class);
使用lombok只需要引入依赖后在类上加@Slf4j注解即可直接使用
org.projectlombok lombok
本测试项目的applicaiton.yml配置如下,指定了logback.xml的路径和指定目录下日志打印的级别
server: port: 8083 # 日志配置 logging: config: classpath:logback.xml level: com.zhou.test: info org.springframework: warn
logging.config:指定项目启动的时,读取logback.xml日志配置文件
logging.level:配置指定包的路径下应用程序的日志记录和日志级别。
日志优先级从高到低依次为trace、debug、info、warn、error。相对而言,打印的日志会越来越少。
${HIGHLIGHT_PATTERN} false ${LOG_HOME}/info.log ${LOG_HOME}/info-%d{yyyy-MM-dd}_%i.log.zip 7 10GB 100MB %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
以下配置生成了日志文件info.log,如果超过了最大设置
${LOG_HOME}/info.log
name | value | 作用 |
---|---|---|
APP_NAME | log-test | 定义当前项目的名称 |
LOG_HOME | /logs/${APP_NAME} | 定义日志的路径,${APP_NAME}:表示引用上面定义的项目名,最后生成路径为:/logs/log-test/… |
name="LOG_PATTERN"表示定义日志格式名称
参数 | 含义 |
---|---|
%d | 表示日期(也可以使用"%date") |
%-5level | 表示级别从左显示5个字符宽度 |
%thread | 表示线程名称 |
%-30.30logger{30} | 表示如果logger的名称小于30,就“-”指定左对齐;如果其名称长于30字符,就从左边较远输出的字符截掉,保持logger的名字长度最终限制为30个字符 |
%msg | 表示日志消息 |
%n | 表示换行符 |
效果如下:
2023-05-26 15:19:28.337 [INFO ] [main] [om.zhou.test.LogTest] Info级别的日志输出 2023-05-26 15:19:28.339 [ERROR] [main] [om.zhou.test.LogTest] Error级别的日志输出
name="HIGHLIGHT_PATTERN"表示定义日志格式名称
参数 | 含义 |
---|---|
%yellow()%green(%highlight() | 颜色高亮 |
%d | 表示日期(也可以使用"%date") |
%-5level | 表示级别从左显示5个字符宽度 |
%thread | 表示线程名称 |
%-30.30logger{30} | 表示如果logger的名称小于30,就“-”指定左对齐;如果其名称长于30字符,就从左边较远输出的字符截掉,保持logger的名字长度最终限制为30个字符 |
%msg | 表示日志消息 |
%n | 表示换行符 |
效果如下:
${HIGHLIGHT_PATTERN}
标签 | 含义 |
---|---|
appender | 负责写日志的组件,它有两个必要属性name和class。name指定appender名称,class指定appender的全限定名 |
encoder | 对日志进行格式化 |
pattern | 用来设置日志的输入格式。使用“%”加“转换符”方式,如果要输出“%”,则必须用“\”对“%”进行转义 |
以上语句通过引用${HIGHLIGHT_PATTERN},使得输出到控制台的格式为高亮日志格式
false ${LOG_HOME}/info.log ${LOG_HOME}/info-%d{yyyy-MM-dd}_%i.log.zip 7 10GB 100MB %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
定义一个名为 “FILE” 的文件参数配置,指定appender属性class定义具体的滚动策略类prism language-xml">
仅有一个name属性,一个可选的level和一个可选的additivity属性
root也是logger元素,但是它是根loger并且只有一个level属性,可以包含零个或多个元素,标识这个appender将会添加到这个loger
level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,不能设置为INHERITED或者同义词NULL。默认是DEBUG
设置root节点的level=“trace”,效果如下:
设置root节点的level=“error”,效果如下:
设置压缩包大小超过10MB后自动清理
当前压缩包共占用9.77MB,当超过10MB时,日志文件名中‘_0’的日志包被删除