阅读 216

SpringBoot基础之日志(springboot日志配置及输出)

(一) 什么是日志框架

  1. 在系统开发过程中会将一些关键信息输出,用于测试或者异常问题的回溯.

  2. 随着输出的信息越来越多,信息的表现形式也各式各样,因此抽离并整合出了日志框架,表现形式上就是jar包

  3. 市面上常见的日志框架: Java Util Logging ,Apache Commons Logging,slf4j,log4j,log4j2,logback

  4. 日志框架各种各样,但是总体就分为两类: 日志门面日志实现 ,就像传话的领导干活的码农

(1)日志门面和日志实现对比

  1. 日志门面是一种规范,只定义了输入的规范,不提供具体的输出功能,不可以单独使用

  2. 日志实现则是真正的实现了输出功能,它们也有自己的输入规范.理论上可以单独使用而不需要日志门面

  3. 实际上我们总会把日志门面日志实现组合起来使用.这是因为每个日志实现都有自己的输入规范,一旦需求变动或者功能迁移,那样管理日志输出配置或者日志转换就会冗杂其他.

就像:原来,我有了问题我直接找领导,领导再去安排具体干活的人; 现在,我直接找对应的人, 但是项目变动了,我需要同时找多个人,但是这几个人思维逻辑和处理方式都不一样,在这种情况下就必要花费更多的经历来沟通,实际上我们承担了领导的这个职责.

  1. Apache Commons Logging,slf4j就是 日志门面 ,  Java Util Logging ,log4j,log4j2,logback 就是日志实现.

(二)日志框架的使用

对于SpringBoot来说,默认使用的日志门面Apache Commons Logging,默认使用的日志实现logbac, 但是我们常用的组合方式则是slfj4+logbackslfj4+log4j2

(1) slfj4的使用

  1. 导入slf4j-api.jar

  2. 在代码中使用日志

1). 官方推荐方式

//在class类中使用, XXX代表的是当前类的类名.
Logger logger = LoggerFactory.getLogger(XXX.class);复制代码

2). 不推荐的方式

Logger logger = LoggerFactory.getLogger(this.getClass());复制代码
  1. 如果使用了lombok,推荐的方式则是直接在类上注解@Slf4j

(2) logback的使用

  1. SpringBoot中支持的logback配置有两种:logback.xmllogback-spring.xml

logback.xmllogback-spring.xml都可以用来配置logback,但是2者的加载顺序是不一样的.

logback.xml--->application.yml--->logback-spring.xml

logback.xml加载早于application.yml,所以如果你需要使用application.yml中的变量,则需要使用logback-spring.xml这种方式.

  1. logback-spring.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">

    <!--定义日志文件的存储地址 尽量不要在 LogBack 的配置中使用相对路径-->
    <property name="LOG_HOME" value="${LOG_PATH:-.}" />

    <!--控制台日志, 控制台输出 -->
    <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{HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
    </appender>


    <appender name="FILE_ROLL" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 追加日志到原文件结尾 -->
        <Prudent>true</Prudent>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--日志文件输出的文件名 每小时生成日志文件-->
            <FileNamePattern>${LOG_HOME}/%d{yy-MM-dd}/asdfsdafasdf.%d{yyyy-MM-dd-HH}.%i.log</FileNamePattern>
            <!--日志文件保留天数-->
            <MaxHistory>30</MaxHistory>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!-- 除按日志记录之外,还配置了日志文件不能超过10M(默认),若超过10M,日志文件会以索引0开始, -->
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度 %method 方法名  %L 行数 %msg:日志消息,%n是换行符-->
            <pattern> %d{HH:mm:ss.SSS} [%thread] %-5level %logger{56}.%method:%L - %msg%n</pattern>
            <charset>utf-8</charset>
        </encoder>
    </appender>




    <!--指定某些类只输出某种级别-->
    <logger name="java.sql.PreparedStatement" level="DEBUG"/>
    <logger name="org.apache.http" level="WARN"/>
    <logger name="ch.qos.logback" level="WARN"/>
    <logger name="o.s.c.annotation" level="INFO"/>
    <logger name="org.springframework.jndi" level="INFO"/>

    <!-- 日志输出级别 -->
    <root level="debug">
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="FILE_ROLL"/>
    </root>

</configuration>复制代码

在此处使用了变量${LOG_PATH:-.} ,该变量从application.yml中定义

logging:
  file:
    path: ./logs/复制代码

因此如果日志有分环境需求,则可以使用logback-spring.xml的方式,然后变量在application-XXX.yml中定义.


作者:ZOUZDC
链接:https://juejin.cn/post/7028963866063306760


文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐