1.日志框架有哪些?
常见的日志框架有log4j、logback、log4j2。
log4j这个日志框架显示是耳熟能详了,在Spring开发中是经常使用,但是据说log4j官方已经不再更新了,而且在性能上比logback、log4j2差了很多。
logback是由log4j创始人设计的另外一个开源日志框架,logback相比之于log4j性能提升了10以上,初始化内存加载也更小了。作为的Spring Boot默认的日志框架肯定是有着不小的优势。
log4j2晚于logback推出,官网介绍性能比logback高,但谁知道是不是王婆卖瓜自卖自夸,坊间流传,log4j2在很多思想理念上都是照抄logback,因此即便log4j2是Apache官方项目,Spring等许多框架项目没有将它纳入主流
slf4j:simple log facade for java,译为简单日志门面。官方介绍为,SLF4J作为各种日志系统的简单Facade或抽象,允许最终用户在部署时插入所需的日志框架。
总结:slf4j是通用的接口规范,log4j、logback、log4j2是具体实现的日志插件。
Spring Boot 默认使用 SLF4J+Logback 记录日志,并提供了默认配置,即使我们不进行任何额外配,也可以使用 SLF4J+Logback 进行日志输出。
2.日志级别
几种常见的日志级别由低到高分为:TRACE < DEBUG < INFO < WARN < ERROR < FATAL。如何理解这个日志级别呢?很简单,如果项目中的日志级别设置为INFO,那么比它更低级别的日志信息就看不到了,即是TRACE、DEBUG日志将会不显示。
3.日志如何使用以及输出
在业务中肯定需要追溯日志,那么如何在自己的业务中输出日志呢?其实常用的有两种方式,下面一一介绍。
第一种其实也是很早之前常用的一种方式,只需要在代码添加如下:
private final Logger logger= LoggerFactory.getLogger(DemoApplicationTests.class);
这种方式显然比较鸡肋,如果每个类中都添加一下岂不是很low。别着急,lombok为我们解决了这个难题。
要想使用lombok,需要添加如下依赖:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
使用也是很简单,只需要在类上标注一个注解@Slf4j
即可,如下:
如何定制日志级别?
Spring Boot中默认的日志级别是INFO,但是可以自己定制日志级别,如下:
logging.level.root=DEBUG
日志如何输出到文件中?
Spring Boot中日志默认是输出到控制台的,但是在生产环境中显示不可行的,因此需要配置日志输出到日志文件中。
其中有两个重要配置如下:
logging.file.path
:指定日志文件的路径
logging.file.name
:日志的文件名,默认为spring.log
注意:官方文档说这两个属性不能同时配置,否则不生效,因此只需要配置一个即可。
指定输出的文件为当前项目路径的logs
文件下,默认生成的日志文件为spring.log
,如下:
logging:
file:
path: /logs
日志文件中还有一些其他的属性,比如日志文件的最大size,保留几天的日志等等,因此可以自定义日志文件的配置文件
Spring Boot官方推荐优先使用带有-spring的文件名作为你的日志配置。因此只需要在src/resources
文件夹下创建logback-spring.xml
即可,Springboot在启动可直接扫描,配置文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
<property name="LOG_HOME" value="/logs"/>
<!--控制台日志, 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度,%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
</appender>
<!--文件日志, 按照每天生成日志文件 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}/TestWeb.log.%d{yyyy-MM-dd}</FileNamePattern>
<!--日志文件保留天数-->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
<!--日志文件最大的大小-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>10MB</MaxFileSize>
</triggeringPolicy>
</appender>
show parameters for hibernate sql 专为 Hibernate 定制
<logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="TRACE" />
<logger name="org.hibernate.type.descriptor.sql.BasicExtractor" level="DEBUG" />
<logger name="org.hibernate.SQL" level="DEBUG" />
<logger name="org.hibernate.engine.QueryParameters" level="DEBUG" />
<logger name="org.hibernate.engine.query.HQLQueryPlan" level="DEBUG" />
<!--myibatis log configure-->
<logger name="com.apache.ibatis" level="TRACE"/>
<logger name="java.sql.Connection" level="DEBUG"/>
<logger name="java.sql.Statement" level="DEBUG"/>
<logger name="java.sql.PreparedStatement" level="DEBUG"/>
<!-- 日志输出级别 -->
<root level="DEBUG">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE"/>
</root>
</configuration>