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.LevelFilter
和 ch.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
上一篇 金融基础
页面信息
location:
protocol
: host
: hostname
: origin
: pathname
: href
: document:
referrer
: navigator:
platform
: userAgent
: