Springboot+logback实战应用及常用配置详解

文章目录:

一、logback介绍

三、在spingboot中使用logback

三、logback的常用参数解析

一、logback介绍

  logback 继承自 log4j,它建立在有十年工业经验的日志系统之上。它比其它所有的日志系统更快并且更小,包含了许多独特并且有用的特性。SpringBoot内部集成了LogBack日志依赖,SpringBoot默认使用LogBack记录日志信息,默认根据base.xml配置内容来输出到控制台和文件之中。

二、在spingboot中使用logback

  因为spingboot已经默认集成了logback,所以在springboot项目中不用添加额外的关于logback的依赖。

以下是spingboot项目中 logback 的初始化步骤:

  1. logback 会在 resources 下寻找名为 logback-test.xml 的文件。
  2. 如果没有找到,logback 会继续寻找名为 logback.groovy 的文件。
  3. 如果没有找到,logback 会继续寻找名为 logback.xml 的文件。
  4. 如果没有找到,将会通过 JDK 提供的 ServiceLoader 工具在类路径下寻找文件 META-INFO/services/ch.qos.logback.classic.spi.Configurator,该文件的内容为实现了 Configurator 接口的实现类的全限定类名。
  5. 如果以上都没有成功,logback 会通过 BasicConfigurator 为自己进行配置,并且日志将会全部在控制台打印出来。

最后一步的目的是为了保证在所有的配置文件都没有被找到的情况下,提供一个默认的(但是是非常基础的)配置。 

如果你使用的是 maven,你可以在 src/main/resources 下新建 logback-test.xml。所以你可以在测试环境中给配置文件命名为 logback-test.xml,在生产环境中命名为 logback.xml。

1.添加配置文件logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
 
<!--
    %p:输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
%r:输出自应用启动到输出该日志讯息所耗费的毫秒数
%t:输出产生该日志事件的线程名
%f:输出日志讯息所属的类别的类别名
%c:输出日志讯息所属的类的全名
%d:输出日志时间点的日期或时间,指定格式的方式: %d{yyyy-MM-dd HH:mm:ss}
%l:输出日志事件的发生位置,即输出日志讯息的语句在他所在类别的第几行。
%m:输出代码中指定的讯息,如log(message)中的message
%n:输出一个换行符号
-->
    <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度 %msg:日志消息,%logger{50}包名缩写,%n是换行符 -->
    <property name="log_pattern" value="%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{50} - %msg%n"/>
    <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
    <!-- 日志存储路径 -->
    <springProperty
            scope="context"
            name="defaultLogDir"
            source="qy.log.history.logDir"
    />

    <!-- 日志备份保留时长 -->
    <springProperty
            scope="context"
            name="logMaxHistory"
            source="qy.log.history.maxHistory"
    />

    <!-- 日志大小 -->
    <springProperty
            scope="context"
            name="logMaxSize"
            source="qy.log.history.logMaxSize"
    />
    <property name="logMaxSize" value="200MB"/>
    <!--&lt;!&ndash;控制台日志, 控制台输出 &ndash;&gt;-->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${log_pattern}</pattern>
            <charset>utf8</charset>
        </encoder>
    </appender>


    <!--文件日志, 按照每天生成日志文件 -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在记录的日志文件的路径及文件名 -->
        <!--<file>${defaultLogDir:-/qy/qy-doctorservice/logs}/log/docser-main.log</file>-->
        <!--TimeBasedRollingPolicy 基于时间来定义轮转策略 -->
        <!--SizeAndTimeBasedRollingPolicy 基于大小以及时间的轮转策略-->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!--日志文件输出的路径和文件名-->
            <!--该属性定义了轮转时的属性名。它的值应该由文件名加上一个 %d 的占位符。%d 应该包含 java.text.SimpleDateFormat 中规定的日期格式。
            如果省略掉这个日期格式,那么就默认为 yyyy-MM-dd。轮转周期是通过 fileNamePattern 推断出来的。
            注意事项:
            1.如果FileNamePattern中指定多个 %d,只能报留一个%d作为主要的,用于推断轮转周期。其它的 %d 占位符必须通过 'aux' 标记为辅助的。
            2.MaxHistory 用来控制最多保留多少数量的归档文件,将会异步删除旧的文件。
                         保留日志的量 = 轮转周期 * MaxHistory
            3.FileNamePattern中除了 %d 之外还有 %i。这两个占位符都是强制要求的。在当前时间还没有到达周期轮转之前,日志文件达到了 maxFileSize 指定的大小,
              会进行归档,递增索引从 0 开始。
            -->
            <!--轮询周期:天-->
            <!--<FileNamePattern>${defaultLogDir:-/qy/qy-doctorservice/logs}/log/%d{yyyy-MM-dd, aux}/credit.%d.%i.log</FileNamePattern>-->
            <!-- 每天轮转(晚上零点),自动将归档文件压缩成 GZIP 格式,减少日志占用空间-->
            <FileNamePattern>${defaultLogDir:-/qy/qy-doctorservice/logs}/log/%d{yyyy-MM-dd, aux}/credit.%d.%i.zip</FileNamePattern>
            <!--日志文件保留轮询周期个数-->
            <MaxHistory>${logMaxHistory:-15}</MaxHistory>
            <!--单个日志文件最大的大小-->
            <MaxFileSize>${logMaxSize:-100MB}</MaxFileSize>
            <!--这个可选属性用来控制所有归档文件总的大小。当达到这个大小后,旧的归档文件将会被异步的删除。使用这个属性时还需要设置 maxHistory 属性。
            而且,maxHistory 将会被作为第一条件,该属性作为第二条件。-->
            <!--归档文件总的大小-->
            <totalSizeCap>1GB</totalSizeCap>
            <!--cleanHistoryOnStart=true时在 appender 启动的时候,归档文件将会被删除。默认的值为 false-->
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <!--<append>:如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true。-->
        <append>false</append>
        <encoder>
            <pattern>${log_pattern}</pattern>
            <charset>utf8</charset>
        </encoder>
    </appender>
    <!-- 日志输出级别 -->
    <root level="INFO">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="FILE"/>
    </root>
</configuration>

实现的主要功能:

1.日志文件根据日期创建不同的文件夹,日志的归档单位为一天。

2.每个归档日期结束后自动压缩当天日志文件,并根据日期生成新的日志文件夹和日志文件。

3.单个日志的分割,日志可根据配置的单个日志文件大小进行分割。

效果图如下: 

待改进:由于项目没有需求要将日志根据日志级别进行分包处理,所以本文的配置都已INFO级别的日志作为处理,实际项目中如果有这方面的需求小伙伴可以多定义几个appender处理不同级别的日志信息。 

 三、logback的常用参数解析 

RollingFileAppender的两种策略:

1.SizeAndTimeBasedRollingPolicy 基于大小以及时间的轮转策略。

有时你希望按时轮转,但同时又想限制每个日志文件的大小。特别是如果后期处理工具需要对日志进行大小限制。为了满足这个需求,logback 配备了 SizeAndTimeBasedRollingPolicy

注意,TimeBasedRollingPolicy 可以限制归档文件总的大小。所以如果你想要这个限制,你可以通过设置 totalSizeCap 来达到这个目的。

2.TimeBasedRollingPolicy 是最常用的轮转策略,它是基于时间来定义轮转策略。

例如按天或者按月。TimeBasedRollingPolicy 既负责轮转的行为,也负责触发轮转。实际上,TimeBasedRollingPolicy 同时实现了 RollingPolicy 与 TriggeringPolicy 接口。

FileAppender 是 OutputStreamAppender 的子类,将日志事件输出到文件中。通过 file 来指定目标文件。如果该文件存在,根据 append 的值,要么将日志追加到文件中,要么该文件被截断。

RollingFileAppender 的属性如下所示:

属性名 类型 描述
file String 参见 FileAppender
append boolean 参见 FileAppender
encoder Encoder 参见 OutputStreamAppender
rollingPolicy RollingPolicy 当轮转发生时,指定 RollingFileAppender的行为。下面将会详细说明
triggeringPolicy TriggeringPolicy 告诉 RollingFileAppender 什么时候发生轮转行为。下面将会详细说明
prudent boolean FixedWindowRollingPolicy 不支持该属性。
RollingFileAppender 在使用严格模式时要与 `TimeBasedRollingPolicy 结合使用,但是有两个限制:
1. 在严格模式下,也不支持也不允许文件压缩(我们不能让一个 JVM 在写入文件时,另一个 JVM 在压缩该文件)
2. 不能对 FileAppender 的 file 属性进行设置。实际上,大多数的操作系统不允许在有进程操作文件的情况下对文件改名。
其它的参考 FileAppender

RollingPolicy 负责轮转的方式为:移动文件以及对文件改名。

TimeBasedRollingPolicy

TimeBasedRollingPolicy 是最常用的轮转策略。它是基于时间来定义轮转策略。例如按天或者按月。TimeBasedRollingPolicy 既负责轮转的行为,也负责触发轮转。实际上,TimeBasedRollingPolicy 同时实现了 RollingPolicy 与 TriggeringPolicy 接口。

TimeBasedRollingPolicy 的配置需要一个强制的属性 fileNamePattern 以及其它的可选属性。

属性名 类型 描述
fileNamePattern String 该属性定义了轮转时的属性名。它的值应该由文件名加上一个 %d 的占位符。%d 应该包含 java.text.SimpleDateFormat 中规定的日期格式。如果省略掉这个日期格式,那么就默认为 yyyy-MM-dd。轮转周期是通过 fileNamePattern 推断出来的。

注意:可以选择对 RollingFileAppenderTimeBasedRollingPolicy的父类)中的 file 属性进行设置,也可以忽略。通过设置 FileAppender 的 file 属性,你可以将当前活动日志的路径与归档日志的路径分隔开来。当前日志永远会是通过 file 指定的文件。它的名字不会随着时间的推移而发生变化。但是,如果你选择忽略 file 属性,当前活动日志在每个周期内将会根据 fileNamePattern 的值变化。稍后的例子将会说明这一点。
%d{} 中的日期格式将会遵循 java.text.SimpleDateFormat 中的约定。斜杆 '/' 或者反斜杠 '\' 都会被解析成目录分隔符。

指定多个 %d

可以指定多个 %d,但是只能有一个是主要的,用于推断轮转周期。其它的 %d 占位符必须通过 'aux' 标记为辅助的。见下面的示例:
多个 %d 占位符允许你在文件夹中去管理归档文件,这个跟轮转周期不同。如下所示:通过年月来管理日志文件夹,但是轮转周期是在每天晚上零点。
/var/log/%d{yyyy/MM, aux}/myapplication.%d{yyyy-MM-dd}.log

TimeZone

在某些情况下,你可能想要根据时区而不是主机的时钟来轮转日志。你可以通过如下方式来指定一个时区,例如:
aFloder/test.%d{yyyy-MM-dd-HH, UTC}.log
如果指定的 timezone 不能被识别或者拼写错误,将会根据 TimeZone.getTimeZone(String)) 方法指定为 GMT。
maxHistory int 这个可选的属性用来控制最多保留多少数量的归档文件,将会异步删除旧的文件。比如,你指定按月轮转,指定 maxHistory = 6,那么 6 个月内的归档文件将会保留在文件夹内,大于 6 个月的将会被删除。注意:当旧的归档文件被移除时,当初用来保存这些日志归档文件的文件夹也会在适当的时候被移除。
totalSizeCap int 这个可选属性用来控制所有归档文件总的大小。当达到这个大小后,旧的归档文件将会被异步的删除。使用这个属性时还需要设置 maxHistory 属性。而且,maxHistory 将会被作为第一条件,该属性作为第二条件。
cleanHistoryOnStart boolean 如果设置为 true,那么在 appender 启动的时候,归档文件将会被删除。默认的值为 false。
归档文件的删除通常在轮转期间执行。但是,有些应用的存活时间可能等不到轮转触发。对于这种短期应用,可以通过设置该属性为 true,在 appender 启动的时候执行删除操作。

任何斜杆或者反斜杠够会被当作文件夹分隔符。任何必要的文件夹都会在有需要的时候创建。你可以轻松的将日志文件放在单独的文件夹中。

TimeBasedRollingPolicy 支持文件自动压缩。如果 fileNamePattern 以 .gz 或者 .zip结尾,将会启动这个特性。

参考文档:logback中文官网:http://www.logback.cn/

https://www.jianshu.com/p/b3dedb8fb61e

猜你喜欢

转载自www.cnblogs.com/wang-jie1993/p/12093534.html
今日推荐