在阿里开发手册有这么一条:
【强制】应用中不可直接使用日志系统(Log4j、Logback)中的 API,而应依赖使用日志框架 SLF4J 中的 API,使用门面模式的日志框架,有利于维护和各个类的日志处理方式统一
slf4j ,即(Simple Logging Facade for Java,简单门面日志)。它是对所有日志框架制定的一种规范、标准、接口,并不是一个框架的具体的实现,它只服务于各种各样的日志系统。
slf4j 提供了统一的记录日志的接口,对不同日志系统的具体实现进行了抽象化,只要按照其提供的方法记录即可,最终日志的格式、记录级别、输出方式等通过绑定具体的日志系统来实现。在项目中使用了slf4j记录日志,并且绑定了log4j(pom.xml中配置了相应的jar包依赖),则日志会以log4j的风格输出;后期需要改为以logback的风格输出日志,只需要将jar包log4j替换成logback即可,根本不需要修改日志文件的代码
建议统一使用 Slf4j 作为日志门面,logback 作为日志实现
日志常用的五个级别,根据严重程度由低到高,依次为:debug(调试 ) < info(消息) < warn(警告) < error(错误) < fatal(严重错误)。通常可以根据实际所需要的颗粒度的大小选择其中的几个,当前常用debug,info,warn,error4个级别
在项目的yaml文件中可以配置日志级别
logging:
level:
com.xyz.spring: trace
logging.level用来指定具体的包中应用程序日志的输出级别。上面的配置表示com.xyz.spring包下的所有日志输出级别为 trace,该级别会将操作数据库的 sql 打印出来,开发时设置成 trace 方便定位问题,在生产环境上,将这个日志级别再设置成 error 级别即可
Springboot启动器中已经集成了 slf4j ,因此无需手动导包,如果需要,使用以下配置
<dependency>
<groupId>org.slf4jgroupId>
<artifactId>slf4j-apiartifactId>
<version>1.7.30version>
dependency>
<dependency>
<groupId>org.slf4jgroupId>
<artifactId>slf4j-log4j12artifactId>
<version>1.7.30version>
dependency>
application.yml的日志配置
logging:
config: logback.xml
level:
com.xyz: trace
config表示读取日志配置的地点,将locback.xml放在pom文件同级包下即可。level表示在XXX包下的日志输出级别
以下的xml文件只需要更改部分项目地址就能直接使用
<configuration debug="false">
<property name="LOG_HOME" value="D:IdeaProjects/SpringBoot-Item/springboot-slf4j/log"/>
<property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] [%thread] [%-30.30logger{30}] %msg%n"/>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
encoder>
appender>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>${LOG_HOME}/SpringBoot-Slf4j_%d{yyyy-MM-dd}.logFileNamePattern>
<MaxHistory>30MaxHistory>
rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
encoder>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>10MBMaxFileSize>
triggeringPolicy>
appender>
<logger name="org.springframework" level="INFO"/>
<logger name="com" level="INFO"/>
<root level="INFO">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
root>
configuration>
在使用日志的时候,在该类中加入一行代码:
private Logger logger = LoggerFactory.getLogger(UserController.class);
或者在类之前加上lombak的注解
@Slf4j
1,系统/应用启动和参数变更。当系统启动时,可以将相关的参数信息进行打印,以便出现问题时,更准确地查询原因;参数信息可能并不存储在本地,需要通过配置中心获取,而参数信息有变更时,也需要将变更后的内容输出在日志中。
2,关键操作节点。最典型的就是在关键位置添加日志,记录用户进行的某个操作。
3,大型任务进度上报。当系统在处理某个比较大型的任务时,可以在这个过程中增加相关的日志来表明任务处理的进度,防止因为长时间没有处理而无法得知程序执行的状态,比如在定时任务中,增加当前任务完成百分比。
4,异常。如果是通过 try-catch 处理,需要注意日志编写的位置。如果需要将日志在本层抛出,则不需要进行日志记录,否则会出现日志重复的问题。
5,批量操作。涉及到数量的操作要打印log,比如查询数据库和批量拷贝文件、上传下载、批量格式转换等批量操作,设计到的数量要打印出来。