欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

springBoot日志快速上手简单配置

程序员文章站 2022-06-05 17:42:18
在一个项目中,日志是一个必不可少的组件。日志能帮助开发人员更好的调试程序,可以帮助运维人员查看的当前应用运行的状态。而在我们的Spring Boot的应用中默认使用的是Logback,Logback是log4j框架的作者开发的新一代日志框架,它效率更高、能够适应诸多的运行环境。因为是一个作者,所以更... ......

默认配置

日志级别从低到高分为:

trace < debug < info < warn < error < fatal。

如果设置为 info ,则低于 info 的信息都不会输出其他的依次类推

默认情况下,spring boot会用logback来记录内部日志,并用info级别输出到控制台你不用做任何设置

springBoot日志快速上手简单配置
从上图可以看到,日志输出内容元素具体如下:

  • 时间日期:精确到毫秒

  • 日志级别:

  • 进程id

  • 分隔符:--- 标识实际日志的开始

  • 线程名:方括号括起来(可能会截断控制台输出)

  • logger名:通常使用源代码的类名

  • 日志内容

自己程序添加日志

基于类的方式

以后开发的时候,日志记录方法的调用,不应该来直接调用日志的实现类,而是调用日志抽象层里面的方法

这和我们单独使用日志jar包有所不同
package com.fashvn.ctmsdata.logtest;

import org.slf4j.logger;
import org.slf4j.loggerfactory;

public class logtest {
    private static final logger logger=loggerfactory.getlogger(logtest.class);

    public static void main(string[] args) {
        logger.error("简单的日志记录测试:{}+{}={}",1,2,3);
    }
}

基于注解方式

上面那种方式每次都要重复添加记录器那一行代码这里可以基于注解方式但是需要使用lombok前提你idea配置了lombok插件然后maven添加了lombok依赖才可以

package com.fashvn.ctmsdata.logtest;


import lombok.extern.slf4j.slf4j;

@slf4j
public class logtest {

    public static void main(string[] args) {
        log.error("简单的日志记录测试:{}+{}={}", 1, 2, 3);
    }
}

现在你就可以愉快的在自己程序了使用日志了

修改配置

您还可以通过启动您的应用程序 --debug 标志来启用“调试”模式(开发的时候推荐开启),以下两种方式皆可:

  • 在运行命令后加入--debug标志,如:$ java -jar springtest.jar --debug
  • 在application.properties中配置debug=true,该属性置为true的时候,核心logger(包含嵌入式容器、hibernate、spring)会输出更多内容,但是你自己应用的日志并不会输出为debug级别。

如何你的日志记录需求简单你可以通过springboot提供的属性进行日志的简单配置复杂日志记录功能需要单独定义配置文件

logging:
  # 将日志输出到文件 注意name和path同时使用只会生效后一个配置
  file:
    # 日志名称可以是相对路径和绝对路径
    name:
    #日志路径 可以是相对路径和绝对路径,帮我们自动生成spring.log的日志文件
    path:
    # 日志文件大小默认是10m单位是kb
    max-size:
    # 每天切割打包日志的数量默认是7
    max-history:
  #日志格式
  pattern:
    #输出到日志文件日志格式
    file:
    #输出到控制台日志格式
    #  %clr(%d{${log_dateformat_pattern:-yyyy-mm-dd hh:mm:ss.sss}}){faint} %clr(${log_level_pattern:-%5p}) %clr(${pid:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${log_exception_conversion_word:-%wex}
    console:
    #时间格式 默认 yyyy-mm-dd hh:mm:ss.sss
    dateformat:
    #日志等级对齐方式 默认%5p日志级别输出右对齐
    level:
    #切割文件名称 默认是${log_file}.%d{yyyy-mm-dd}.%i.gz 如过单个日志文件超过定义的大小就切割打包
    rolling-file-name:
  #需要记录日志的等级
  level:
    # 根目录所以class日志记录等级
    root: debug
    # 自定义对应包下class 日志等级
    com.fashvn.ctmsdata: debug
    

自定义日志配置

根据不同的日志系统,你可以按如下规则组织配置文件名,就能被正确加载:

  • logback:logback-spring.xml, logback-spring.groovy, logback.xml, logback.groovy

  • log4j:log4j-spring.properties, log4j-spring.xml, log4j.properties, log4j.xml

  • log4j2:log4j2-spring.xml, log4j2.xml

  • jdk (java util logging):logging.properties

spring boot官方推荐优先使用带有-spring的文件名作为你的日志配置(如使用logback-spring.xml,而不是logback.xml),命名为logback-spring.xml的日志配置文件,spring boot可以为它添加一些spring boot特有的配置项

如果你即想完全掌控日志配置,但又不想用logback.xml作为logback配置的名字,application.yml可以通过logging.config属性指定自定义的名字

logging.config=classpath:logging-config.xml

虽然一般并不需要改变配置文件的名字,但是如果你想针对不同运行时profile使用不同的日志配置,这个功能会很有用。
一般不需要这个属性,而是直接在logback-spring.xml中使用springprofile配置,不需要logging.config指定不同环境使用不同配置文件

<?xml version="1.0" encoding="utf-8"?>
<!--
scan true:配置文件如果发生改变,将会被重新加载,默认值为true
scanperiod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。默认的时间间隔为1分钟,当scan为true时,此属性生效。
debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false
-->
<configuration scan="true" scanperiod="60 seconds" debug="false">

    <!--设置上下文名称
    每个logger都关联到logger上下文,默认上下文名称为“default”。
    但可以使用设置成其他名字,用于区分不同应用程序的记录。一旦设置,不能修改,
    可以通过%contextname来打印日志上下文名称,一般来说我们不用这个属性,可有可无。
    -->
    <contextname>logback-demo</contextname>

    <!--设置变量
    用来定义变量值的标签, 有两个属性,name和value;
    其中name的值是变量的名称,value的值时变量定义的值。
    通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。
    -->
    <property name="logback.logdir" value="/users/inke/dev/log/tomcat"/>
    <property name="logback.appname" value="app"/>

    <!--appender用来格式化日志输出节点
    有俩个属性name和class
    class用来指定哪种输出策略
    常用就是控制台输出策略和文件输出策略。
    -->
    <!--输出到控制台 consoleappender
    可以看到layout和encoder,都可以将事件转换为格式化后的日志记录,但是控制台输出使用layout,文件输出使用encoder,具体原因可以看
    https://blog.csdn.net/cw_hello1/article/details/51969554
    -->


    <appender name="consolelog1" class="ch.qos.logback.core.consoleappender">
        <!--展示格式 layout-->
        <layout class="ch.qos.logback.classic.patternlayout">
            <pattern>%d -1 %msg%n</pattern>
        </layout>
    </appender>

    <!--输出到控制台 consoleappender-->
    <appender name="consolelog2" class="ch.qos.logback.core.consoleappender">
        <encoder>
            <pattern>%d -2 %msg%n</pattern>
        </encoder>
    </appender>

    <!--输出到控制台 consoleappender
    %d{hh: mm:ss.sss}——日志输出时间
    %thread——输出日志的进程名字,这在web应用以及异步任务处理中很有用
    %-5level——日志级别,并且使用5个字符靠左对齐
    %logger{36}——日志输出者的名字
    %msg——日志消息
    %n——平台的换行符
    thresholdfilter为系统定义的拦截器,
    例如我们用thresholdfilter来过滤掉error级别以下的日志不输出到文件中。如果不用记得注释掉,不然你控制台会发现没日志~
    -->
    <appender name="consolelog3" class="ch.qos.logback.core.consoleappender">
        <!--展示格式 layout-->
        <layout class="ch.qos.logback.classic.patternlayout">
            <pattern>
                <pattern>%d{hh:mm:ss.sss} %contextname [%thread] %-5level %logger{36} - %msg%n</pattern>
            </pattern>
        </layout>
        <!--
        <filter class="ch.qos.logback.classic.filter.thresholdfilter">
             <level>error</level>
        </filter>
         -->
    </appender>


    <appender name="fileinfolog" class="ch.qos.logback.core.rolling.rollingfileappender">
        <!--如果只是想要 info 级别的日志,只是过滤 info 还是会输出 error 日志,因为 error 的级别高,
        所以我们使用下面的策略,可以避免输出 error 的日志-->
        <!--只是不想要error其他都要-->
        <filter class="ch.qos.logback.classic.filter.levelfilter">
            <!--过滤 error-->
            <level>error</level>
            <!--匹配到就禁止-->
            <onmatch>deny</onmatch>
            <!--没有匹配到就允许-->
            <onmismatch>accept</onmismatch>
        </filter>

        <!--日志名称,如果没有file 属性,那么只会使用filenamepattern的文件路径规则
            如果同时有<file>和<filenamepattern>,那么当天日志是<file>,明天会自动把今天
            的日志改名为今天的日期。即,<file> 的日志都是当天的。
        -->
        <file>${logback.logdir}/info.${logback.appname}.log</file>
        <!--滚动策略,按照时间滚动 timebasedrollingpolicy-->
        <rollingpolicy class="ch.qos.logback.core.rolling.timebasedrollingpolicy">
            <!--文件路径,定义了日志的切分方式——把每一天的日志归档到一个文件中,以防止日志填满整个磁盘空间-->
            <filenamepattern>${logback.logdir}/info.${logback.appname}.%d{yyyy-mm-dd}.log</filenamepattern>
            <!--只保留最近90天的日志-->
            <maxhistory>90</maxhistory>
            <!--用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志-->
            <!--<totalsizecap>1gb</totalsizecap>-->
        </rollingpolicy>
        <!--日志输出编码格式化-->
        <encoder>
            <charset>utf-8</charset>
            <pattern>%d [%thread] %-5level %logger{36} %line - %msg%n</pattern>
        </encoder>
    </appender>


    <!--输出到文件
    另一种常见的日志输出到文件,随着应用的运行时间越来越长,日志也会增长的越来越多,
    将他们输出到同一个文件并非一个好办法。rollingfileappender用于切分文件日志:
    -->
    <appender name="fileerrorlog" class="ch.qos.logback.core.rolling.rollingfileappender">
        <!--如果只是想要 error 级别的日志,那么需要过滤一下,默认是 info 级别的,thresholdfilter-->
        <filter class="ch.qos.logback.classic.filter.thresholdfilter">
            <level>error</level>
        </filter>
        <!--日志名称,如果没有file 属性,那么只会使用filenamepattern的文件路径规则
            如果同时有<file>和<filenamepattern>,那么当天日志是<file>,明天会自动把今天
            的日志改名为今天的日期。即,<file> 的日志都是当天的。
        -->
        <file>${logback.logdir}/error.${logback.appname}.log</file>
        <!--滚动策略,按照时间滚动 timebasedrollingpolicy-->
        <rollingpolicy class="ch.qos.logback.core.rolling.timebasedrollingpolicy">
            <!--文件路径,定义了日志的切分方式——把每一天的日志归档到一个文件中,以防止日志填满整个磁盘空间-->
            <filenamepattern>${logback.logdir}/error.${logback.appname}.%d{yyyy-mm-dd}.log</filenamepattern>
            <!--只保留最近90天的日志-->
            <maxhistory>90</maxhistory>
            <!--用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志-->
            <!--<totalsizecap>1gb</totalsizecap>-->
        </rollingpolicy>
        <!--日志输出编码格式化-->
        <encoder>
            <charset>utf-8</charset>
            <pattern>%d [%thread] %-5level %logger{36} %line - %msg%n</pattern>
        </encoder>
    </appender>


    <!--必选节点
   root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性。
   level:用来设置打印级别,大小写无关:trace, debug, info, warn, error, all 和 off,不能设置为inherited或者同义词null。默认是debug。
   可以包含零个或多个元素,标识这个appender将会添加到这个loger。
   -->
    <!--指定最基础的日志输出级别-->
    <root level="info">
        <!--appender将会添加到这个loger-->
        <appender-ref ref="consolelog1"/>
        <appender-ref ref="consolelog2"/>
        <appender-ref ref="consolelog3"/>
    </root>




</configuration>