当前位置 : 首页 » 文章分类 :  开发  »  Logback

Logback

Logback Project
http://logback.qos.ch/


logger和appender

logger/appender/root 之间的关系
root 也是一个 logger, 只不过 root 中不能有 name 和 additivity 属性,只有一个 level 属性。
appender 是一个日志打印的组件,这里组件里面定义了打印过滤的条件、打印输出方式、滚动策略、编码方式、打印格式等等。但是它仅仅是一个打印组件,如果我们不使用一个 logger 或者 root 的 appender-ref 指定某个具体的 appender 时,它就没有什么意义。

appender 告诉应用应该怎么打、打印到哪里、打印成什么样;
logger 则是告诉应用哪些可以这么打。例如某个类下的日志可以使用这个 appender 打印或者某个包下的日志可以这么打印。

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


configuration

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

Java日志框架:logback详解
https://www.cnblogs.com/xrq730/p/8628945.html


logger

logger和root

logger 用来设置某一个包或者具体某一个类的日志打印级别。
logger 可以包含零个或者多个 <appender-ref> 元素,表明这个 logger 会输出到这些 appender, 注意 如果没有配置 <appender-ref> 则此logger不会有任何输出
logger 仅有一个 name 属性、一个可选的 level 属性和一个可选的 additivity 属性:
name 用来指定受此logger约束的某一个包或者具体的某一个类
level 用来设置打印级别,五个常用打印级别从低至高依次为TRACE、DEBUG、INFO、WARN、ERROR,如果未设置此级别,那么当前logger会继承上级的级别
additivity 是否向上级logger传递打印信息,默认为true,表示此 logger 的日志也会输出到父 logger 中

root 也是一个 logger, 只不过 root 中不能有 name 和 additivity 属性,只有一个 level 属性

屏蔽某个包/类的日志

1、屏蔽 ResponseProcessCookies 类的日志

<logger name="org.apache.http.client.protocol.ResponseProcessCookies" level="OFF"/>

2、可以只写包前缀,可关闭此包下的全部日志,例如屏蔽 org.apache.http.client 包下的所有类的日志

<logger name="org.apache.http.client.protocol" level="OFF"/>

打开某个包/类的debug日志

由于没设置 <appender-ref> 默认输出到 root logger 中

<logger name="org.apache.http.client.protocol.ResponseProcessCookies" level="debug"/>

打开 Apache HttpClient 的 debug 日志

<logger name="org.apache.http" level="debug" />

打开 Spring 和 JPA 事务 debug 日志

<logger name="org.springframework.transaction" level="DEBUG"/>
<logger name="org.springframework.orm.jpa" level="DEBUG"/>

事务操作日志:

2022-10-27 20:24:21.589 [http-nio-8181-exec-3] DEBUG org.springframework.orm.jpa.support.OpenEntityManagerInViewInterceptor - Opening JPA EntityManager in OpenEntityManagerInViewInterceptor 
2022-10-27 20:24:21.644 [http-nio-8181-exec-3] DEBUG org.springframework.orm.jpa.JpaTransactionManager - Found thread-bound EntityManager [SessionImpl(305564334<open>)] for JPA transaction 
2022-10-27 20:24:21.644 [http-nio-8181-exec-3] DEBUG org.springframework.orm.jpa.JpaTransactionManager - Creating new transaction with name [com.xxservice.findOne]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT 
2022-10-27 20:24:21.727 [http-nio-8181-exec-3] DEBUG org.springframework.orm.jpa.JpaTransactionManager - Exposing JPA transaction as JDBC [org.springframework.orm.jpa.vendor.HibernateJpaDialect$HibernateConnectionHandle@6917c1c5] 
2022-10-27 20:24:21.731 [http-nio-8181-exec-3] DEBUG org.springframework.orm.jpa.JpaTransactionManager - Found thread-bound EntityManager [SessionImpl(305564334<open>)] for JPA transaction 
2022-10-27 20:24:21.731 [http-nio-8181-exec-3] DEBUG org.springframework.orm.jpa.JpaTransactionManager - Suspending current transaction, creating new transaction with name [com.xxservicefindLatestStatistic] 
2022-10-27 20:24:21.732 [http-nio-8181-exec-3] DEBUG org.springframework.orm.jpa.JpaTransactionManager - Opened new EntityManager [SessionImpl(973173998<open>)] for JPA transaction 
2022-10-27 20:24:21.762 [http-nio-8181-exec-3] DEBUG org.springframework.orm.jpa.JpaTransactionManager - Exposing JPA transaction as JDBC [org.springframework.orm.jpa.vendor.HibernateJpaDialect$HibernateConnectionHandle@3aef2cc3] 
2022-10-27 20:24:22.800 [http-nio-8181-exec-3] DEBUG org.springframework.orm.jpa.JpaTransactionManager - Initiating transaction commit 
2022-10-27 20:24:22.800 [http-nio-8181-exec-3] DEBUG org.springframework.orm.jpa.JpaTransactionManager - Committing JPA transaction on EntityManager [SessionImpl(973173998<open>)] 
2022-10-27 20:24:22.875 [http-nio-8181-exec-3] DEBUG org.springframework.orm.jpa.JpaTransactionManager - Closing JPA EntityManager [SessionImpl(973173998<open>)] after transaction 
2022-10-27 20:24:22.876 [http-nio-8181-exec-3] DEBUG org.springframework.orm.jpa.JpaTransactionManager - Resuming suspended transaction after completion of inner transaction 


2022-10-27 20:24:35.879 [http-nio-8181-exec-3] DEBUG org.springframework.orm.jpa.JpaTransactionManager - Initiating transaction commit 
2022-10-27 20:24:35.881 [http-nio-8181-exec-3] DEBUG org.springframework.orm.jpa.JpaTransactionManager - Committing JPA transaction on EntityManager [SessionImpl(305564334<open>)] 
2022-10-27 20:24:35.932 [http-nio-8181-exec-3] DEBUG org.springframework.orm.jpa.JpaTransactionManager - Not closing pre-bound JPA EntityManager after transaction 
2022-10-27 20:24:35.942 [http-nio-8181-exec-3] DEBUG org.springframework.orm.jpa.support.OpenEntityManagerInViewInterceptor - Closing JPA EntityManager in OpenEntityManagerInViewInterceptor 

appender

日志滚动策略

按时间分割

https://logback.qos.ch/manual/appenders.html#TimeBasedRollingPolicy

<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>logFile.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <!-- daily rollover -->
        <fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern>
        <!-- keep 30 days' worth of history capped at 3GB total size -->
        <maxHistory>30</maxHistory>
        <totalSizeCap>3GB</totalSizeCap>
    </rollingPolicy>
    <encoder>
        <pattern>%-4relative [%thread] %-5level %logger{35} -%kvp- %msg%n</pattern>
    </encoder>
</appender> 

按时间和文件大小分割

https://logback.qos.ch/manual/appenders.html#SizeAndTimeBasedRollingPolicy
每超过 100MB 生成一个 .i 日志文件,总的 .i 文件大小不超过 20GB

<appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>mylog.txt</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
        <cleanHistoryOnStart>true</cleanHistoryOnStart>
        <!-- rollover daily -->
        <fileNamePattern>mylog-%d{yyyy-MM-dd}.%i.txt</fileNamePattern>
        <!-- each file should be at most 100MB, keep 60 days worth of history, but at most 20GB -->
        <maxFileSize>100MB</maxFileSize>    
        <maxHistory>60</maxHistory>
        <totalSizeCap>20GB</totalSizeCap>
    </rollingPolicy>
    <encoder>
        <pattern>%msg%n</pattern>
    </encoder>
</appender>

日志zip压缩

logback 会根据 fileNamePattern 里的后缀名来判断,如果是.gz的就会自动做gzip压缩处理,如果是.zip的就会做zip压缩处理

<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
    <fileNamePattern>mylog-%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
    <maxHistory>7</maxHistory>
    <cleanHistoryOnStart>true</cleanHistoryOnStart>
    <maxFileSize>100MB</maxFileSize>
    <totalSizeCap>1GB</totalSizeCap>
</rollingPolicy>

filter 过滤器

Logback 中自带了两个过滤器实现
ch.qos.logback.classic.filter.LevelFilterch.qos.logback.classic.filter.ThresholdFilter

LevelFilter 需要依次定义每个级别是 ACCEPT 还是 DENY, 不如 ThresholdFilter 方便,所以一般都用 ThresholdFilter

<!-- LevelFilter: 级别过滤器,根据日志级别进行过滤 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
   <level>INFO</level>
   <!-- 用于配置符合过滤条件的操作 ACCEPT 日志会被立即处理,不再经过剩余过滤器 -->
   <onMatch>ACCEPT</onMatch>
   <!-- 用于配置不符合过滤条件的操作 DENY 日志将立即被抛弃不再经过其他过滤器 -->
   <onMismatch>DENY</onMismatch>
</filter>

在 Logback 中,ThresholdFilter 是一种过滤器,用于根据日志事件的级别过滤掉不符合指定阈值的日志消息。
ThresholdFilter 可以配置在 Logback 的 appender 中,它会过滤掉那些低于指定级别的日志事件,从而控制哪些日志会被输出到对应的 appender 中。
只打印 info 级别以上的

<appender name="STDOUT"
    class="ch.qos.logback.core.ConsoleAppender">
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
        <level>INFO</level>
    </filter>
    <encoder>
        <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} %X{REQUEST_ID} - %msg%n</pattern>
    </encoder>
</appender>

Logback中如何自定义灵活的日志过滤规则
https://www.jianshu.com/p/d6360c517264


上一篇 金融基础

下一篇 LeetCode.312.Burst Balloons 戳气球

阅读
评论
2k
阅读预计9分钟
创建日期 2020-07-21
修改日期 2023-06-26
类别
标签

页面信息

location:
protocol:
host:
hostname:
origin:
pathname:
href:
document:
referrer:
navigator:
platform:
userAgent:

评论