Spring Boot 集成logback

Spring Boot 集成logback

1.Logback是什么?

1.1 Logback

是由 log4j 创始人设计的另一个开源日志组件,官方网站: http://logback.qos.ch。它当前分为下面几个模块:

logback-core:其它两个模块的基础模块
logback-classic:它是 log4j 的一个改良版本,同时它完整实现了 slf4j API使你可以很方便地更换成其它日志系统如log4j或JDK14 Logging
logback-access:访问模块与 Servlet 容器集成提供通过 Http 来访问日志的功能

1.2 slf4j

logback需要配合slf4j使用,slf4j是一个日志接口标准,即简单日志门面(Simple Logging Facade for Java)。不是具体的日志解决方案,它只服务于各种各样的日志系统。在使用 SLF4J 的时候,不需要在代码中或配置文件中指定你打算使用那个具体的日志系统

1.3 Logback配置详解

(1)根节点 configuration

包含下面三个属性:

scan: 当此属性设置为 true 时,配置文件如果发生改变,将会被重新加载,默认值为true。
scanPeriod: 设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当 scan 为 true 时,此属性生效。默认的时间间隔为1分钟。
debug: 当此属性设置为 true 时,将打印出 logback 内部日志信息,实时查看 logback 运行状态。默认值为 false

<configuration scan="true" scanPeriod="60 seconds" debug="false">
</configuration>
(2)子节点contexname

用来设置上下文名称,每个logger 都关联到 logger 上下文,默认上下文名称为 default。但可以使用 <contextName>设置成其他名字,用于区分不同应用程序的记录。一旦设置,不能修改。

<configuration scan="true" scanPeriod="60 seconds" debug="false"> 
     <contextName>${component}</contextName> 
    <!--其他配置省略-->
</configuration>  
(3)子节点property

用来定义变量值,它有两个属性 namevalue,通过<property>定义的值会被插入到 logger 上下文中,可以使${} 来使用变量。

name: 变量的名称

value: 的值时变量定义的值

<configuration scan="true" scanPeriod="60 seconds" debug="false">
    <property name="LOG_HOME" value="${catalina.base}/logs/vms" />
    <property name="component" value="vms" />
    <property name="segment" value="vmsweb" />

    <property name="vmsEventLogLevel" value="DEBUG" />
    <property name="vmsOtherLogLevel" value="INFO" />
    <property name="vmsSqlLogLevel" value="INFO"/>

    <property name="defaultPattern" value="%d{yyyy-MM-dd'T'HH:mm:ss.SSSXXX} %level ${component}.${segment} [%thread] [%caller{50}] %msg%n%ex" />
    <property name="nonConvertedPattern" value="%d{yyyy-MM-dd'T'HH:mm:ss.SSSXXX} %level ${component}.${segment} [%thread] [%logger{50}:%line] %msg%n" />
    
</configuration> 
(4)子节点 timestamp

获取时间戳字符串,他有两个属性keydatePattern

key: 标识此 的名字;
datePattern: 设置将当前时间(解析配置文件的时间)转换为字符串的模式,遵循java.txt.SimpleDateFormat的格式。

<timestamp key="bySecond" datePattern="yyyyMMdd'T'HHmmss"/>
(5)子节点appender

负责写日志的组件,它有两个必要属性 nameclassname 指定 appender名称,class指定 appender的全限定名

a.ConsoleAppender

把日志输出到控制台,有以下子节点:

-<encoder>:对日志进行格式化。(具体参数稍后讲解 )

-<target>:字符串System.out(默认)或者System.err(区别不多说了)

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
     <encoder>
           <charset>UTF-8</charset>
           <pattern>
           			${defaultPattern}   		  
           </pattern>
      </encoder>
</appender>
b.FileAppender

把日志添加到文件,有以下子节点:

  • <file>:被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。
  • <append>:如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是 true。
  • <encoder>:对记录事件进行格式化。(具体参数稍后讲解 )
  • <prudent>:如果是 true,日志会被安全的写入文件,即使其他的 FileAppender 也在向此文件做写入操作,效率低,默认是 false。
c.RollingFileAppender

滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件。有以下子节点:

  • <file>:被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。
  • <append>:如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是 true。
  • <rollingPolicy>:当发生滚动时,决定 RollingFileAppender 的行为,涉及文件移动和重命名。属性 class 定义具体的滚动策略类
    class=“ch.qos.logback.core.rolling.TimeBasedRollingPolicy”: 最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责出发滚动。有以下子节点:
  • <fileNamePattern>:必要节点,包含文件名及“%d”转换符,“%d”可以包含一个java.text.SimpleDateFormat指定的时间格式,如:%d{yyyy-MM}。
    如果直接使用 %d,默认格式是 yyyy-MM-dd。RollingFileAppender的file字节点可有可无,通过设置file,可以为活动文件和归档文件指定不同位置,当前日志总是记录到file指定的文件(活动文件),活动文件的名字不会改变;
    如果没设置file,活动文件的名字会根据fileNamePattern 的值,每隔一段时间改变一次。“/”或者“\”会被当做目录分隔符。
  • <maxHistory>:
    可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件。假设设置每个月滚动,且
    <maxHistory> 是 6,则只保存最近6个月的文件,删除之前的旧文件。注意,删除旧文件是,那些为了归档而创建的目录也会被删除。
    class=“ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy”: 查看当前活动文件的大小,如果超过指定大小会告知RollingFileAppender 触发当前活动文件滚动。只有一个节点:
  • <maxFileSize>:这是活动文件的大小,默认值是10MB。
  • <prudent>:当为true时,不支持FixedWindowRollingPolicy。支持TimeBasedRollingPolicy,但是有两个限制,1不支持也不允许文件压缩,2不能设置file属性,必须留空。
  • <triggeringPolicy >: 告知 RollingFileAppender 合适激活滚动。
    class=“ch.qos.logback.core.rolling.FixedWindowRollingPolicy” 根据固定窗口算法重命名文件的滚动策略。有以下子节点:
  • <minIndex>:窗口索引最小值
  • <maxIndex>:窗口索引最大值,当用户指定的窗口过大时,会自动将窗口设置为12。
  • <fileNamePattern>:必须包含“%i”例如,假设最小值和最大值分别为1和2,命名模式为 mylog%i.log,会产生归档文件 mylog1.log 和 mylog2.log。还可以指定文件压缩选项,例如,mylog%i.log.gz 或者 没有log%i.log.zip
<!-- 文件输出日志 (文件大小策略进行文件输出,超过指定大小对文件备份)-->
<appender name="FILE-debug" class="ch.qos.logback.core.rolling.RollingFileAppender">
   <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
        <level>TRACE</level>
   </filter>
   <File>${LOG_HOME}/${component}.${segment}.debug.log</File>
   <rollingPolicy class="logback.rolling.log.gather.TimeBasedBackUpRollingPolicy">
        <FileNamePattern>${LOG_HOME}/${component}.${segment}.debug.log.%i.zip</FileNamePattern>
        <MinIndex>1</MinIndex>
        <MaxIndex>5</MaxIndex>
   </rollingPolicy>
   <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
        <MaxFileSize>100MB</MaxFileSize>
   </triggeringPolicy>
   <encoder class="com.hikvision.cms.vms.common.vms.algorithm.log.parttern.VmsPatternLayoutEncoder">
        <charset>UTF-8</charset>
        <pattern>${defaultPattern}</pattern>
   </encoder>
</appender>
(6)子节点 logger

用来设置某一个包或具体的某一个类的日志打印级别、以及指定 <appender><logger>仅有一个 name 属性,一个可选的 level 和一个可选的addtivity 属性。可以包含零个或多个 元素,标识这个 appender 将会添加到这个 logger

name: 用来指定受此 logger 约束的某一个包或者具体的某一个类。
level: 用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL和OFF,还有一个特俗值INHERITED或者同义词NULL,代表强制执行上级的级别。 如果未设置此属性,那么当前logger将会继承上级的级别。
addtivity: 是否向上级 loger 传递打印信息。默认是 true。同 <logger>一样,可以包含零个或多个<appender-ref>元素,标识这个 appender 将会添加到这个 logger。

<logger name="org.springframework" level="${vmsOtherLogLevel}" additivity="false" >
        <appender-ref ref="FILE-other"/>
</logger>

若是additivity设为false,则子Logger只会在自己的appender里输出,不会在root的logger的appender里输出(个人可以理解为additivity设为false后,子Logger会覆盖掉root的logger)。

若是additivity设为true,则子Logger不止会在自己的appender里输出,还会在root的logger的appender里输出

(7)子节点 root

它也是<logger> 元素,但是它是根 logger,是所有<logger>的上级。只有一个 level属性,因为 name已经被命名为 root,且已经是最上级了。

level: 用来设置打印级别,大小写无关:TRACE,DEBUG,INFO,WARN,ERROR,ALL 和 OFF,不能设置为 INHERITED 或者同义词 NULL。 默认是 DEBUG

<root level="${vmsOtherLogLevel}">
        <appender-ref ref="FILE-other" />
</root>

2.在maven工程中使用Logback的依赖配置

<dependencies>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>${slf4j.version}</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-core</artifactId>
      <version>${logback.version}</version>
    </dependency>
    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
      <version>${logback.version}</version>
    </dependency>
</dependencies>

3.Logback标签层次结构

<configuration
    property 定义变量(name,value)
    contextName 名称
    appender 负责写日志的组件(必要 name,class)
    encoder 格式化输出日志
        pattern
        charset

	appender 负责写日志的组件(必要 name,class)
	    filter 过滤器,打印指定级别的日志
	        level 过滤的日志级别
	        onMatch 满足指定级别的日志操作
	        onMismatch 不满足指定级别的操作
	    rollingPolicy 当发生滚动时,决定 RollingFileAppender 的行为
	        FileNamePattern 日志文件输出的文件名
	        MaxHistory 日志文件保留天数
	        MaxFileSize 日志文件最大的大小
	        timeBasedFileNamingAndTriggeringPolicy
	    encoder 格式化输出日志(class)
	        pattern
	        charset

	logger 用来设置某一个包或者具体的某一个类的日志打印级别、以及指定 appender (name,level)
		appender-ref (ref)
	
	springProfile 开发环境下的日志配置(name)
		root (level)
		appender-ref (ref)
	
	root (最大只能配置一个)
		appender-ref (ref)

LoggerFactory.getLogger()用法

使用指定类初始化日志对象,在日志输出的时候,可以打印出日志信息所在类

如:
    Logger logger = LoggerFactory.getLogger(com.lz.Test.class);
    logger.debug("日志信息");
    //将会打印出: com.lz.Test : 日志信息

LoggerFactory.getLogger(name),其中name对应着logback.xmllogger属性中name=对应的子包,当然你也可以设置一样的。logger中的additivity设置为false是代表该logger日志打印不向上传递, appender-ref指定的日志输出格式 ;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值