SpringBoot讲解五:日志组件之Logback和Log4j2

日志管理对于初学者来说,不必花太大精力,知道简单实用即可。具体到了项目组会有对日志的精细规则,到那个时候研究也不迟。本章节,会介绍Logback和Log4j2的使用。

Logback

SpringBoot 使用了slf4j 日志门面,具体的实现是用logback,而且已经内置了本组件,不需要在pom.xml中添加依赖,如果是初学者,及大部分普通项目,对日志的性能不是很高的话,LogBack都可以满足我们的需求。
我们平时启动SpringBoot时候的日志输出即是Logback组件在工作:
在这里插入图片描述
如果我们想自定义输出位置,比如说输出在硬盘上,可以在yml中加入:

logging:
  file: d://testLog/springboot.log

以上目录、文件名称根据自己需要拟定即可。

如果自己想要输出日志的话,在类中直接使用slf4j日志门面提供的类和方法:

    //创建logger对象
    Logger logger= LoggerFactory.getLogger(EmployeeController.class);

slf4j的好处是规定了日志的接口,我们面向接口编程,不需要了解各个不同的日志组件的api,十分方便。就像JDBC编程,我们只需要知道JDBC提供的接口,而不需要知道Oracle、mysql等不同数据的特有方法。
“如果问题过于复杂,就在上面做一层抽。”这条定理,在计算机世界真是无往不利啊。

slf5j提供不同日志级别的输出方法:

        logger.debug("记录debug日志");
        logger.info("访问了index方法");
        logger.error("记录了error错误日志");

日志常用的有五个级别,有低到高依次为debug(调试 ),info(消息),warn(警告),error(错误),fatal(严重错误)

比如MyBatis的日志是debug级别的,默认是不输出日志的。如果想要看MyBatis的日志输出,可以在yml中加入:

logging:
  file: d://testLog/springboot.log
  level:
    com.qr.empboot.dao: debug #接口所在的包

Log4J2

如果你的项目中还在用log4j,那是时候抛弃它了。
Log4j2对Log4j进行了重写,性能高出了是10倍有余,网上有专门对log4j,logback,log4j2等产品的性能测试。虽然以Springboot推荐技术只要不比竞争技术差太多,未来都会因为简化的配置和对接被人接纳,但目前来看,如果对日志管理上有复杂的需求,对性能有所要求、及并发极高的系统上Log4j2前景还是比Logback有优势。
因为SpringBoot内置了logback,所以先要在maven的依赖中去掉方可使用其他日志组件。这里注意以下,网上很多文章都是错误的。按照我说的来:

      <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <!--去掉logback依赖-->
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency> <!-- 引入log4j2依赖 -->
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
        </dependency>

如果没有在某些依赖中去除掉,会报以下错误:
在这里插入图片描述
可以利用idea中maven的依赖关系图排查:
在这里插入图片描述
Log4J2在寻找配置文件有一个查找规则,如果日志配置文件为以下格式,可以不在yml中配置:
1.classpath下的名为log4j2-test.json 或者log4j2-test.jsn的文件
2.classpath下的名为log4j2-test.xml的文件
3.classpath下名为log4j2.json 或者log4j2.jsn的文件
4.classpath下名为log4j2.xml的文件

如果是自定义名称,需要专门配置:
在这里插入图片描述

logging:
  config: classpath:log4j2.xml

log4j2.xml中的内容非常详细,在其中配置后就不需要在yml中配置了,里面注释我写的非常详细,对照着看,应该可以看明白:

<?xml version="1.0" encoding="UTF-8"?>
<!--设置log4j2的自身log级别为warn-->
<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,
  当设置成trace时,你会看到log4j2内部各种详细输出-->
<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数-->
<configuration status="debug" monitorInterval="30">
  <!--变量配置-->
  <Properties>
      <!-- 格式化输出:%date表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度 %msg:日志消息,%n是换行符-->
      <!-- %logger{36} 表示 Logger 名字最长36个字符 -->
      <property name="LOG_PATTERN" value="%date{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n" />
      <!-- 定义日志存储的路径,不要配置相对路径 -->
      <property name="FILE_PATH" value="d:/testLog" />
      <property name="FILE_NAME" value="test" />
  </Properties>
  <!--先定义所有的appender-->
  <appenders>
      <!--这个输出控制台的配置-->
      <console name="Console" target="SYSTEM_OUT">
          <!--输出日志的格式-->
          <PatternLayout  level="all" pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
      </console>
      <!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,这个也挺有用的,适合临时测试用-->
      <File name="log" fileName="{FILE_PATH}/test.log" append="false">
          <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
      </File>
      <!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size,
      则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
      <RollingFile name="RollingFileInfo" fileName="{这里填路径}/info.log"
                   filePattern="{FILE_PATH}/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log">
          <Filters>
              <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
              <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
              <ThresholdFilter level="WARN" onMatch="DENY" onMismatch="NEUTRAL"/>
          </Filters>
          <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
          <Policies>
              <TimeBasedTriggeringPolicy/>
              <SizeBasedTriggeringPolicy size="100 MB"/>
          </Policies>
      </RollingFile>

      <RollingFile name="RollingFileWarn" fileName="{FILE_PATH}/warn.log"
                   filePattern="{FILE_PATH}/warn-%d{yyyy-MM-dd}-%i.log">
          <Filters>
              <ThresholdFilter level="WARN" onMatch="ACCEPT" onMismatch="DENY"/>
              <ThresholdFilter level="ERROR" onMatch="DENY" onMismatch="NEUTRAL"/>
          </Filters>
          <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
          <Policies>
              <TimeBasedTriggeringPolicy/>
              <SizeBasedTriggeringPolicy size="100 MB"/>
          </Policies>
          <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了20 -->
          <DefaultRolloverStrategy max="20"/>
      </RollingFile>

      <RollingFile name="RollingFileError" fileName="{FILE_PATH}/error.log"
                   filePattern="{FILE_PATH}/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log">
          <ThresholdFilter level="ERROR"/>
          <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
          <Policies>
              <TimeBasedTriggeringPolicy/>
              <SizeBasedTriggeringPolicy size="100 MB"/>
          </Policies>
      </RollingFile>

  </appenders>
  <!--然后定义logger,只有定义了logger并引入的appender,appender才会生效-->
  <loggers>
      <!--过滤掉spring和hibernate的一些无用的debug信息-->
      <logger name="org.springframework" level="INFO">
      </logger>
      <logger name="org.mybatis" level="DEBUG">
      </logger>
      <logger name="com.qr.empboot.dao" level="DEBUG">
      </logger>
      <logger name="org.thymeleaf" level="WARN">
      </logger>
      <root level="info">
          <appender-ref ref="Console"/>
          <appender-ref ref="RollingFileInfo"/>
          <appender-ref ref="RollingFileWarn"/>
          <appender-ref ref="RollingFileError"/>
      </root>
  </loggers>

</configuration>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值