这篇文章主要讲述SpringBoot框架当中配置日志框架,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
先简单聊聊日志框架
日志框架他在项目当中可以帮我们完成工作台输出、异步记录日志以及自动归档(把日志输出到文件)等功能。在框架的逐步成型当中,日志框架分为了抽象层和实现层。
所谓的抽象层,也可以称为统一接口层,在之前,我们都是代码当中直接实现接口层来完成日志处理,但是假如接口层发生变化,那么改动程度是非常大的,这也可以理解为代码的耦合性较高。
为降低代码耦合度,拆分成了两层,现在我们日志实现直接导入接口层和日志实现层相关jar包即可。基本上根本不用写什么代码即可快速实现日志处理。
框架选型
市场上存在非常多的日志框架。JUL(java.util.logging),JCL(Apache Commons Logging),Log4j,Log4j2,Logback、SLF4j、jboss-logging等。Spring Boot在框架内容部使用JCL,spring-boot-starter-logging采用了slf4j+logback的形式,Spring Boot也能自动适配(jul、log4j2、logback) 并简化配置
这块的门面指的就是接口层,右边就是实现类。
左边选一个门面(抽象层)、右边来选一个实现;
日志门面: SLF4J;
日志实现:Logback;
一般日志门面(接口层)我们都会用SLF4J,原因:JCL已经长时间未更新了,最后一次更新在2014年,jboss这个一般特定框架会用,所以对于我们来说不适用。
一般实现层都用用Logback,原因:JUL他相对来说没有其他的好,SLF4J和Log4j还有Logback是同一个人写的,并且Logback是Log4j的升级版。而Log4j2虽然也很完美,正是太完美,很多框架都没适配。
Slf4j的简单使用
在实际开发当中一般我们不会直接去掉实现类,而是去掉接口层的方法。
给系统里面导入slf4j的jar和 logback的实现jar,springboot当中spring-boot-starter-web本身就自带了,不需要导jar包
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class HelloWorld {
public static void main(String[] args) {
Logger logger = LoggerFactory.getLogger(HelloWorld.class);
logger.info("Hello World");
}
}
每一个日志的实现框架都有自己的配置文件。使用slf4j以后,配置文件还是做成日志实现框架自己本身的配置文
SpringBoot当中配置步骤
1、排除其他框架日志包
一般项目当中我们一旦选择了一个日志实现框架之后,就会统一都用这个,在我们很多使用的框架当中都会自带日志框架,这个时候就需要排除包了,把他们自带的日志包排除掉,避免jar包冲突。
排除掉包不就报错了吗?
SLF4j给我们提供了中间包,这些中间包就是一个转换作用,将他原有的日志框架替换的基础上,并且保证框架能够正常运行。 这些替换包在引入spring-boot-starter-web的时候就已经加入了。这两个包的作用就是,将使用log4j和jul框架的,全都统一使用slf4j,所以我们需要做的就是将那些框架自带的jar包给排除掉。不让他引入。
pom示例:
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient-cache</artifactId>
<!-- 依从 spring-boot 管理版本 -->
<version>4.5.2</version>
<scope>compile</scope>
<exclusions>
<exclusion>
<!-- 使用 jcl-over-slf4j 代替 -->
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
2、了解默认配置
springboot自动装配当中会为我们配置好一些默认配置,即使我们使用日志框架,不做任何配置,他也是可以为我们完成一些基础功能的。
在这个jar包下,可以看出默认配置
从这里可以看出他的默认配置级别是info。
3、通过全局配置修改默认值
在默认情况下Spring Boot只会在控制台输出日志。
如果不用复杂的功能,只是希望能在文件中输出同样的日志。
只需要在application.properity加入如下配置:
#在当前磁盘的根路径下创建log文件夹和里面的MyProject文件夹;使用 spring.log 作为默认文件
logging.path=/log/MyProject
# 可以指定完整的路径;不指定磁盘路径在当前项目下生成springboot.log日志
logging.file=G:/springboot.log
#设置具体包的日志级别(这里将与MyBatis相关的mapper包设置为debug级别,效果就是在日志中输出sql语句)
logging.level.cn.gzl.Mapper=debug
日志输出格式:
%d表示日期时间,
%thread表示线程名,
%‐5level:级别从左显示5个字符宽度
%logger{50} 表示logger名字最长50个字符,否则按照句点分割。
%msg:日志消息,
%n是换行符
以上是日志输出格式标识符的含义:了解了其含义,我们就可以通过在全局配置当中添加配置,来修改出自己想要的控制台信息。
# 在控制台输出的日志的格式
logging.pattern.console=%d{
yyyy‐MM‐dd} [%thread] %‐5level %logger{
50} ‐ %msg%n
# 指定文件中日志输出的格式
logging.pattern.file=%d{
yyyy‐MM‐dd} === [%thread] === %‐5level === %logger{
50} ==== %msg%n
4、指定配置文件
给类路径下放上每个日志框架自己的配置文件即可;SpringBoot就不使用他默认配置的了
我们用的是logback,一般用以下两种
logback.xml:直接就被日志框架识别了;
logback-spring.xml:日志框架就不直接加载日志的配置项,由SpringBoot解析日志配置,可以使用SpringBoot 的高级Profile功能
<springProfile name="staging">
<!‐‐ configuration to be enabled when the "staging" profile is active ‐‐>
可以指定某段配置只在某个环境下生效
</springProfile>
完整的logback-spring.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds">
<include resource="org/springframework/boot/logging/logback/base.xml" />
<contextName>ph-logback</contextName>
<property name="log.path" value="c:/logback/logback.log" />
<!-- 输出的控制台 -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<encoder>
<pattern>%d{
HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{
36} - %msg%n
</pattern>
</encoder>
</appender>
<!-- 输出到文件 -->
<appender name="file"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--日志名,用到了上面配置的路径-->
<file>${
log.path}</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${
log.path}.%d{
yyyy-MM-dd}.%i.log</fileNamePattern>
<!-- 单个文件最大100M -->
<maxFileSize>100MB</maxFileSize>
<!-- 保留30天的日志 -->
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%date %level [%thread] %logger{
36} [%file : %line] %msg%n
</pattern>
</encoder>
</appender>
<!-- 开发环境 -->
<springProfile name="dev">
<logger name="com.xjgx" level="INFO"/>
</springProfile>
<!-- 生产环境 -->
<springProfile name="prod">
<logger name="com.xjgx" level="ERROR"/>
</springProfile>
<!-- 日志级别 -->
<root level="info">
<appender-ref ref="console" />
<appender-ref ref="file" />
</root>
<!--设置具体包的隔离级别-->
<logger name="com.xjgx.domain.mapper" level="DEBUG"></logger>
<logger name="com.xjgx.domain.slave.mapper" level="DEBUG"></logger>
</configuration>