springboot+logback日志输出

 

 控制台日志输出的内容格式很清晰,分别是

  • 时间日期:格式是yyyy-MM-dd HH:mm:ss.SSS
  • 日志级别:输出>=INFO级别的日志(ERROR, WARN, INFO)
  • 进程ID
  • 分隔符:---
  • 线程名:线程名在方括号([])内
  • logger名:类的名称
  • 日志内容
  • 1、自定义logback配置

    logback配置文件加载顺序
    在springboot应用中,对于logback的配置文件,默认情况下,配置文件放在src/main/resources下,支持的配置文件名称如下:

    logback-spring.xml
    logback-spring.groovy
    logback.xml
    logback.groovy
    Spring Boot官方推荐优先使用带有-spring的文件名配置(如有logback-spring.xml,则不会使用logback.xml) 。当然,若需要对配置文件名进行修改,或者希望把配置文件放到其它目录下,可以通过logging.config属性指定自定义的名字,如logging.config=classpath:config/log-config.xml,则使用resources/config下的log-config.xml配置。

    4. logback配置文件详述
    logback配置文件决定日志输出格式、日志输出位置、输出文件策略等内容,因此需要对logback配置文件的结构及相关元素内容进行了解。

    4.1 配置文件结构
    配置文件总体来说内容比较简单,主要三个元素:

     

     

     

    这三个元素中,logger和root可视为同一类,都是日志组件,可以把root当作是特殊logger,是根,必须配置。logger配置解答从哪里获取日志,输出什么级别日志问题。appender配置是指出日志以什么格式输出,日志如何过滤,输出文件后如何处理的问题。另外,还有可选的property及contextName元素,分别变量和应用上下文名称。

    4.2 根元素configuration
    4.2.1 属性配置
    根元素configuration有三个属性可以设置,如下:

    debug:默认为false,若设置为true,则打印出logback内部日志信息

    scan:默认值为true,若设置为true,配置文件如果发生改变,将会被重新加载。

    scanPeriod:与scan配合使用,当scan为true时,此属性生效,默认的时间间隔为1分钟,设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。如可以设置为scanPeriod="30 seconds"每30秒检测一次。

    4.2.2 定义上下文名称和变量
    contextName元素,每一个日志组件(logger)都会关联到日志上下文,默认上下文名称是’default’,用于标识应用,如果多个应用输出到同一个地方,就有必要使用%contextName来区别。
    property元素,定义变量,有name和value属性,定义变量后,可以使“${name}”来使用变量。在配置中多个地方的值使用到相同的内容时,就有必要把相同内容设置变量,通过引用来设置。如示例工程中的日志文件名称前缀、日志路径、日志输出格式。

  • 注意,定义的变量只能在配置文件的值中进行引用,不能在元素属性中引用。如配置文件中有很多属性是class,里面的内容只能写类的全路径,尽管类前缀都相同,但不能用变量替换。

    4.3 日志输出组件appender
    此元素是主要配置项,表示以什么格式输出,日志如何过滤,输出文件后如何处理。appender结构如下:

     

     

     

    appender 有两个属性 name和class;name指定appender名称,class指定appender的全限定名。appender 默认有以下几种:

    ConsoleAppender:把日志添加到控制台,类名ch.qos.logback.core.ConsoleAppender
    FileAppender:把日志添加到文件,类名ch.qos.logback.core.FileAppender
    RollingFileAppender:滚动记录文件,FileAppender的子类,当符合条件(大小、时间),日志进行切分,记录到其他文件。类名:ch.qos.logback.core.rolling.RollingFileAppender。
    实践过程中,一般使用ConsoleAppender及RollingFileAppender即可,若需要自定义如把日志输出到消息队列,可以自定义实现 AppenderBase 接口。

    ConsoleAppender比较简单,只需要使用layout元素,按日志输出格式即可,如下:

    <!-- 控制台输出日志 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <layout class="ch.qos.logback.classic.PatternLayout">
    <pattern>${log.pattern}</pattern>
    </layout>
    </appender>

    RollingFileAppender的配置相对多一点,包括File、filter,rollingPolicy,encoder和layout元素。其中filter可以过滤日志,因此,若需要把日志按级别输出到不同的文件中,因此,定义多个RollingFileAppender(如对应DEBUG、INFO、WARN、ERROR),分别按日志级别过滤即可。下面分别进行说明:

    4.3.1 File配置
    配置文件输出的路径及文件名,一般把路径和文件名前缀定义到变量(property中),如下:

    <!--日志文件前缀,即应用名称 -->
    <property name="logfile.prefix" value="logback-demo"/>
    <!--日志路径,可写相对路径,也可写绝对路径 -->
    <property name="log.path" value="logs"/>
    ...//略
    <File>${log.path}/${logfile.prefix}-debug.log</File>

    4.3.2 filter配置
    filter可以为appender 添加一个或多个过滤器,对日志进行过滤。过滤器有ThresholdFilter和LevelFilter,前者是临界值过滤器,过滤掉低于指定临界值的日志;后者是级别过滤器,根据日志级别进行过滤, 如果日志级别等于配置级别 ,过滤器会根据onMath(符合过滤条件的操作) 和 onMismatch(不符合过滤条件的操作)接收(ACCEPT)或拒绝(DENY)日志。 按前面需求,把日志按不同级别分别输出到各自文件中,需要多个RollingFileAppender元素,每个元素下对应的level是DEBUG,INFO,WARN和ERROR。

    <!-- 过滤器,只记录debug级别的日志 -->
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
    <level>DEBUG</level>
    <OnMismatch>DENY</OnMismatch>
    <OnMatch>ACCEPT</OnMatch>
    </filter>

    4.3.3 rollingPolicy配置
    此元素描述滚动策略,有TimeBasedRollingPolicy、SizeAndTimeBasedRollingPolicy、FixedWindowRollingPolicy、SizeBasedTriggeringPolicy。分别是基于时间滚动,基于大小和时间滚动,固定窗口滚动和大小触发,其中FixedWindowRollingPolicy一般和SizeBasedTriggeringPolicy同时使用。下面以TimeBasedRollingPolicy为例,以天为单位输出日志,每天一个日志。

    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
    <!-- 日志输出格式 -->
    <FileNamePattern>${log.path}/${logfile.prefix}-debug.%d{yyyy-MM-dd}.log</FileNamePattern>
    <!-- 日志保留天数 -->
    <maxHistory>30</maxHistory>
    </rollingPolicy>


  • FileNamePattern表示日志的路径及名称,此处是按日期输出,即%d{yyyy-MM-dd}格式。maxHistory表示日志最多保留天数,大于这些天数后,前面的日志会删除。

    对于SizeAndTimeBasedRollingPolicy,如下所示:

    <!-- 按日期滚动 -->
    <fileNamePattern>mylog-%d{yyyy-MM-dd}.%i.txt</fileNamePattern>
    <!-- 文件大小最大是100M,保存60日,总大小最大为20G -->
    <maxFileSize>100MB</maxFileSize>
    <maxHistory>60</maxHistory>
    <totalSizeCap>20GB</totalSizeCap>

    注意,%i和%d标识符都是强制性的。 每当日志文件在当前时间段结束之前达到文件最大值时,它将以递增的%d索引存档,从0开始。

    4.3.4 layout配置
    layout元素较简单,只需要设置输出的格式即可。

    <property name="log.pattern"
    value="%d{yyyy-MM-dd HH:mm:ss.SSS} %5level [%15thread] %40.40logger{40}[%10method,%line] : %msg%n"/>
    ...//略
    <layout class="ch.qos.logback.classic.PatternLayout">
    <Pattern>${log.pattern}</Pattern>
    </layout>

    4.3.5 输出格式控制

对于日志输出格式的控制,使用logback的保留字进行控制,保留字很多,建议查阅官网文档,下面对常用进行说明:

 

 

另外,格式还有一个对齐功能,通过在%后面添加-、.及数字进行控制。符号-是可选修饰符,表示是左对齐,接着是可选的最小宽度修饰符,用十进制数表示。如果字符小于最小宽度,则左填充或右填充,默认是左填充(即右对齐),填充符为空格。最大宽度修饰符,符号是点号"."后面加十进制数。如果字符大于最大宽度,则从前面截断。点符号“.”后面加减号“-”在加数字,表示从尾部截断。

例如:%-40.40logger{40} 表示按40字符输出logger名,左对齐,若小于40字符的则填充空格,超过40则从左边截断。

对于控制台,还可以控制颜色,如前面springboot的默认输出就有颜色,如下:

格式 描述
%black 黑色
%red 红色
%green 绿色
%yellow 黄色
%blue 蓝色
%magenta 品红
%cyan 青色
%white 白色
%gray 灰色
%highlight 高亮色
%bold 强化上面的颜色,例如%boldRed,%boldBlack
4.4 日志组件logger及root
logger用来设置某一个类或者某个包的日志输出级别、以及关联appender指定输出位置,有三个属性:

name:指定的包名或者类名
level:输出日志级别,如果未设置此级别,那么当前logger会向上继承最近一个非空级别,级别以name区分,如x和x.y,x则是x.y的父级。
additivity:是否将日志向上级传递,默认为 true
logger 通过设置子节点appender-ref来指定日志输出位置,可以设置多个appender-ref。root是一个特殊的logger, 是所有logger的根节点,元素名为root,没有父级别,只有一个属性level,默认为DEBUG 。

4.4.1 logger配置,
此处对某个具体的类进行配置输出进行设置,由于设置了WARN级别,additivity为true,而且关联STDOUT的appender,因此此类的>=WARN的日志会输出到控制台。同时会把日志上传到父级,即root。若root也有配置STDOUT的输出的话,会发现此日志在控制台输出两次。若additivity为false,则不会。

<!-- 日志级别,不向上级传递日志内容,日志按appender-ref输出 -->
<logger name="me.mason.demo.simplelogback.service.UserService" level="WARN" additivity="true">
<appender-ref ref="STDOUT"/>
</logger>
4.4.2 root配置
logger可以不配置,但root元素是必须配置的,需要告诉logback把日志输出到哪里。如下,只需要关联日志需要输出的appender即可。前面已经有STDOUT控制台及按日志级别设置了各个文件appender,此处直接关联即可。

<root level="DEBUG">
<appender-ref ref="STDOUT"/>
<appender-ref ref="DEBUGFILE"/>
<appender-ref ref="INFOFILE"/>
<appender-ref ref="WARNFILE"/>
<appender-ref ref="ERRORFILE"/>
</root>
经过以上的配置,汇总到logback-spring.xml中,启动运行程序,即可看到控制台会按格式输出日志,同时会在应用根目录下创建logs目录存放日志文件

参考资料
logback官网: http://logback.qos.ch

logback中文手册: http://www.logback.cn/

logback github:https://github.com/qos-ch/logback

看完这个不会配置 logback ,请你吃瓜:https://juejin.im/post/5b51f85c5188251af91a7525

示例代码已放在githubhttps://github.com/mianshenglee/my-example/tree/master/springboot-logback-demo,有兴趣的同学可以pull代码,结合示例一起学习。

 

posted @ 2021-11-23 17:23  米豪  阅读(774)  评论(0编辑  收藏  举报