这是我参与8月更文挑战的第24天,活动详情查看:8月更文挑战
在开发SpringBoot项目的过程中,为了能够更好的记录项目的运行信息,以及定位跟踪问题,我们都会采取打日志的方式。SpringBoot的内部使用Jakarta Commons Logging API(JCL),默认配置提供了对常用日志的支持,可以通过配置使用控制台或文件输出日志内容。
SLF4J
SLF4J的定义
SLF4J,即Simple Logging Facade For Java,是SpringBoot中一个针对各类Java日志框架的统一Facade(门面)抽象,定义了统一的日志抽象接口,真正的日志实现则是在运行时决定的。在实际使用过程中,每个日志框架都是面向该接口开发,SLF4J为所有的日志统一了API接口,但是实现各不相同,这种模式称为门面模式。 SpringBoot默认实现的是logback日志框架。
SLF4J的使用规范
- 在阿里巴巴开发手册中强制要求,在项目应用中不可以直接使用log4j、logback中的API,而是应该依赖于日志框架SLF4J的API,使用门面模式的日志框架。
- 使用统一规范的SLF4J接口,有利于维护各个类、各模块不同日志框架时日志处理方式的统一。
SLF4J支持日志框架
从官网给出的SLF4J支持框架结构图中,可以看到,logback、log4j等日志框架都可以通过一定Jar包的转换在应用中实际使用SLF4J的统一接口。这样无论使用何种框架,只需要引入相关的Jar,对于使用的逻辑不需要做改变就可以适用。
SLF4J在应用中开发使用
SLF4J存在于SpringBoot启动类中,会自动加载。
实际使用时,只需要创建logger对象并使用即可。
Logger logger = LoggerFactory.getLogger(ControllerTestSLF4J.class);
logger.info("logger.info : hello!");
SLF4J对日志框架的适配
- 以log4j框架来讲,在使用SLF4J作为门面时需要一层适配层,而log4j提供了slf4j-api.jar和slf-4j-log412.jar的依赖。
- slf4j-api.jar用来做适配,在调用slf4j的api时其实是在调用slf4j-api.jar中的api,而其执行的是log4j中的具体方法。
- 其他的日志框架也是如此,有了适配层,那么多有的日志框架都可以使用slf4j的api来进行日志操作了。
SpringBoot中日志相关配置
配置文件中配置日志
- SpringBoot项目的application.properties配置文件中可以配置日志属性
logging.level.*:控制日志级别,*代表生效的包名,值可以设置为:TRACE<DEBUG<INFO<ERROR<TATAL,设置后低于当前级别的信息不会输出。logging.pattern:自定义在console和file中的输出格式- 日志输出到文件
- SpringBoot默认将日志输出到控制台,可以在配置文件中设置logging.file或logging.path属性来将日志输出到文件
- logging.file:设置文件名称,绝对路径或相对路径,如 =my.log
- logging.path:设置目录,如果会在该目录下创建日志文件
- 如果只设置file属性,则会在项目当前路径下创建指定日志文件;如果只设置path属性,则会在指定目录下创建spring.log
使用命令设置日志级别
在运行Jar包时可以使用java -jar springTest.jar --debug命令来设置当前项目的日志输出级别。
使用单独的日志配置文件
- 外部配置文件默认命名规则如下:
- SpringBoot官方推荐带-sprring的命名方式,此时SpringBoot可以自动添加一些配置项,配置文件默认放置在src/main/resources目录下。
- 也可以用户自定义配置文件名称,但是此时要在SpringBoot配置文件中指定具体配置文件:logging.config=classpath:logging.xml
日志的具体使用
- 如果使用了lombok插件,则可以使用注解@ slf4j后,可以直接使用log.error进行日志的输出。
- 如果没有使用lombok插件,则需要创建logger对象,
private static final Logger log = LoggerFactory.getLogger(Xxx.class);针对每个类创建一个静态对象,减少资源浪费。 - 输出日志时,使用参数信息的方式进行输出,使用 [{}] 进行参数变量隔离,不要使用字符串拼接,会产生很多字符串对象,占用空间、影响性能
\
- 对于debug日志,要判断是否为dubug级别后,再进行使用
\
最后
简单记录了一下项目中SLF4J日志门面的使用方式,在后续的业务中也会不断的学习和改进。