springboot日志|8月更文挑战

304 阅读1分钟

这是我参与8月更文挑战的第8天,活动详情查看:8月更文挑战

前言

日志门面(日志抽象层)日志实现
JCL(jakarta commons logging)、SLF4J(simple logging facade for java) 、jboss-logginglog4j、JUL(java.util.logging)、log4j2、logback

使用日志框架,我们需要引入一个日志抽象层和一个日志实现。一般我们使用slf4jlogback

日志统一

1.1 遗留问题

每一个框架都会使用日志来记录框架的运行情况,如果将多个框架集成到一个系统中,那么框架使用不同的日志,如何在系统中进行统一输出呢?

image.png 例如:spring框架默认采用JCL,springboot框架默认采用SLF4J和logback。如何让系统中所有日志统一到slf4j呢?

  1. 将系统中其它日志框架排除出去
  2. 用中间包替换原有的日志框架
  3. 导入slf4j其它日志实现

springboot能够自动适配所有日志,就是通过上述步骤实现的。

1.2 日志使用

public class XXServiceImpl implements XXService {
  Logger log = LoggerFactory.getLogger(XXServiceImpl.class);
  log.info("serviceImpl .... ");
}

日志配置

一般我们需要将日志输出到控制台或者文件中,所以我们需要自定义配置文件。springboot对日志框架支持,只需在resources文件夹直接建立相应的文件。

logging systemcustomization
logbacklogback-spring.xml、logback.xml
log4jlog4j2-spring.xml、log4j2.xml
jullogging.properties
<!--
父节点configuration三个属性
   sacn: 自动加载判断,当配置文件发生改变时,将会被重新加载。默认true
   scanPeriod: 检测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认ms。
   debug: 当被设置为true时,将打印出logback内部日志信息,实时查看logback日志框架的运行状态
-->
<configuration>
  <!-- 
    logger用来设置某一个包或者某一个具体类的日志打印级别及方式。在logger内可以
    包含0个或者多个appender-ref,然后对于的appender将会添加到这个logger。
    三个属性如下:
    name:指定对应的包路径或者类路径
    level:设置日志打印等级
    additivity:是否向上级log传递打印信息,默认true
  -->
  <logger></logger>
  <!--
  root和logger元素,是根logger,所有logger的最上级。一个属性:
   level:指定日志级别
  -->
  <root></root>
  <!-- 
  父节点configuration的子节点appender,定义日志输出方式。两个属性:
  name:指定当前appender的名称
  class:指定appender对于的类,控制日志输出方式
  -->
  <appender></appender>
  <!--
  encoder:将日志信息转换成字节数组并将字节数组写到输出流中。
      %logger{length}:输出logger名,length表示从尾部取多少字符。0代表最后一个`.`后的字符串。
         比如:%logger:mainPackage.sub.sample.Bar  ===> mainPackage.sub.sample.Bar
              %logger{0}: mainPackage.sub.sample.Bar  ===> Bar
              %logger{5}: mainPackage.sub.sample.Bar  ===> e.Bar
      %date{pattern}:输出时间。
        比如:%date{yyyy-MM-dd HH:mm:ss}  ==> 2021-08-08 23:28:01
      %msg:输出应用程序信息
  -->
  <encoder></encoder>
</configuration>

参考1 参考2