最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

利用logback 設(shè)置不同包下的日志級別

 更新時間:2020年12月03日 15:42:23   作者:小杰68  
這篇文章主要介紹了利用logback 設(shè)置不同包下的日志級別,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

1、實現(xiàn)效果:項目的整體的日志打印級別為ERROR,但在某個包下或某個類想打印INFO級別的日志。

2、配置:

FILE是ERROR級別日志打?。?/p>

SPECIAL 是INFO級別日志打?。?/p>

FILE與SPECIAL唯一不同是日志保存路徑不同,其它策略相同;

通過 logger標簽指定包路徑或類路徑并引用SPECIAL;

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
 <contextName>test</contextName>
 <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
  <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
   <fileNamePattern>${catalina.home}/logs/test/test.%d.%i.log</fileNamePattern>
   <maxHistory>30</maxHistory>
   <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
    <maxFileSize>10MB</maxFileSize>
   </timeBasedFileNamingAndTriggeringPolicy>
  </rollingPolicy>
  <encoder>
   <pattern>%d %p (%file:%line\)- %m%n -[%X{X-B3-TraceId:-},%X{X-B3-SpanId:-}]</pattern>
   <charset>UTF-8</charset>
  </encoder>
 </appender>

 <appender name="SPECIAL" class="ch.qos.logback.core.rolling.RollingFileAppender">
  <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
   <fileNamePattern>${catalina.home}/logs/test/special/special.%d.%i.log</fileNamePattern>
   <maxHistory>30</maxHistory>
   <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
    <maxFileSize>10MB</maxFileSize>
   </timeBasedFileNamingAndTriggeringPolicy>
  </rollingPolicy>
  <encoder>
   <pattern>%d %p (%file:%line\)- %m%n -[%X{X-B3-TraceId:-},%X{X-B3-SpanId:-}]</pattern>
   <charset>UTF-8</charset>
  </encoder>
 </appender>

 <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
  <encoder>
   <pattern>%d %p (%file:%line\)- %m%n </pattern>
   <charset>UTF-8</charset>
  </encoder>
 </appender>
 <!--打印SQL-->
 <logger name="daoLog" level="ERROR" />
 <!-- 記錄special操作日志 -->
 <logger name="aaa.bbb.ccc.DemoService" level="INFO" >
  <appender-ref ref="SPECIAL"/>
 </logger>

 <root level="error">
  <appender-ref ref="FILE"/>
  <appender-ref ref="STDOUT"/>
 </root>
</configuration> 

補充知識:logback框架使用誤區(qū) 如何將所有包的ERROR級別日志集中打印到一個日志文件中

早就想寫這個事情了,起因是自己想寫一個東西,其中使用logback日志框架記錄日志

打算 將所有包的ERROR及以上級別日志打到一個文件中,各個包下的日志打到對應(yīng)包的文件中。

起初寫的xml配置類似于這樣:

<!-- 其中一個appender,其他appender與其相同 ,只有name、file和fileNamePattern不同-->
<appender name="ALL-ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
 <file>all-error.log</file>
 <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
  <fileNamePattern>
   ${log_dir}/all-error.%d{yyyy-MM-dd}.%i.log
  </fileNamePattern>
  <maxFileSize>100MB</maxFileSize>
  <maxHistory>60</maxHistory>
  <totalSizeCap>20GB</totalSizeCap>
 </rollingPolicy>
 <encoder>
  <pattern>
   %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n
  </pattern>
 </encoder>
</appender>
<logger name="com.some.package1" level="INFO" additivty="true">
 <appender-ref ref="appender-1"/>
</logger>
<logger name="com.some.package2" level="INFO" additivty="true">
 <appender-ref ref="appender-2"/>
</logger>

<logger name="com.some" level="ERROR" additivty="true">
 <appender-ref ref="ALL-ERROR"/>
</logger>

然而運行后卻發(fā)現(xiàn),這樣配置后的,并沒有達到預(yù)期目標。

反而,所有INFO及以上的信息,不僅在appender appender-1和appender-2對應(yīng)的日志文件中有,在appender為ALL-ERROR對應(yīng)的日志文件中也都有,這是為何?

追蹤了一下斷點,發(fā)現(xiàn)如下代碼片段:

/**
 * Invoke all the appenders of this logger.
 * 
 * @param event
 *   The event to log
 */
public void callAppenders(ILoggingEvent event) {
 int writes = 0;
 for (Logger l = this; l != null; l = l.parent) {
  writes += l.appendLoopOnAppenders(event);
  if (!l.additive) {
   break;
  }
 }
 // No appenders in hierarchy
 if (writes == 0) {
  loggerContext.noAppenderDefinedWarning(this);
 }
}

這段代碼來自logback的 ch.qos.logback.classic.Logger文件,是最終決定日志內(nèi)容輸出在哪里的代碼。

從這段代碼我們可以發(fā)現(xiàn):

1. logback會找到第一個符合日志級別要求的logger,然后將日志內(nèi)容輸入到這個logger下配置的appender中。舉例來說:如果有一個com.some.package1內(nèi)的類的INFO級別日志,那么首先會找到logger com.some.package1,然后找到logger下配置的appender appender-1;最后根據(jù)appender-1的配置,將日志內(nèi)容輸出到appender-1配置的文件中。

2. 之后,logback根據(jù)additivty檢查logger是否允許繼承,如果配置為true(默認為true),則查找上一級logger(實際是按照以包名為name查找上一層包的logger),找到logger后,不再判斷l(xiāng)ogger配置是否符合日志級別要求,直接找到對應(yīng)的appender,將日志內(nèi)容輸出。

這就帶來了一個問題,位于低層次包的logger,在接收到日志后,不僅會把它輸出到自身的appender中,還會將其傳遞給位于高層次包logger的appender中,無論高層次包logger配置的日志級別是什么。正因為如此,所以我打算將所有包的ERROR級別 日志輸出到一個文件的目的沒有實現(xiàn),反而所有INFO及以上級別的日志都輸出了。

按照這個思路,如果logger com.some.package1和com.some.package2日記級別為ERROR,而logger com.some日志級別為INFO的話,是否所有INFO及以上級別的日志都可以記入logger com.some對應(yīng)的appender下,而ERROR及以上級別的日志會記入logger com.some.package1和com.some.package2呢?測試證明,是這樣。

知道了為什么上面的配置達不到目的,接下來要考慮的是,借助什么方式實現(xiàn)這個需求呢?

logback提供了實現(xiàn)需求的方式:借助Filter來做:

既然logger無法判斷日志級別,那我們可以在對應(yīng)的appender里判斷日志級別。

logback的過濾器使用起來可以達到對每一條日志的DENY、ACCEPT和NEUTRAL。

根據(jù)文章開始提出的需求,我們需要的是一個綁定appender的,過濾日志等級的filter,那么ch.qos.logback.classic.filter.ThresholdFilter正好是我們需要的。通過加入如下配置,appender ALL-ERROR將只能接受ERROR及以上的日志:

<filter class="ch.qos.logback.classic.filter.ThresholdFilter"> 
 <level>INFO</level> 
</filter> 

完整的xml配置如下,僅改變了filter的部分,就實現(xiàn)了需求:

<!-- 其中一個appender,其他appender與其相同 ,只有name、file和fileNamePattern不同,并且沒有filter的標簽-->
<appender name="ALL-ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
 <file>all-error.log</file>
 <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> 
  <level>ERROR</level> 
 </filter> 
 <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
  <fileNamePattern>
   ${log_dir}/all-error.%d{yyyy-MM-dd}.%i.log
  </fileNamePattern>
  <maxFileSize>100MB</maxFileSize>
  <maxHistory>60</maxHistory>
  <totalSizeCap>20GB</totalSizeCap>
 </rollingPolicy>
 <encoder>
  <pattern>
   %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n
  </pattern>
 </encoder>
</appender>
<logger name="com.some.package1" level="INFO" additivty="true">
 <appender-ref ref="appender-1"/>
</logger>
<logger name="com.some.package2" level="INFO" additivty="true">
 <appender-ref ref="appender-2"/>
</logger>

<logger name="com.some" level="ERROR" additivty="true">
 <appender-ref ref="ALL-ERROR"/>
</logger>

更多關(guān)于logback的Filter的講解,請見

1. logback filter文檔

以上這篇利用logback 設(shè)置不同包下的日志級別就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 淺析Java.IO輸入輸出流 過濾流 buffer流和data流

    淺析Java.IO輸入輸出流 過濾流 buffer流和data流

    這篇文章主要介紹了Java.IO輸入輸出流 過濾流 buffer流和data流的相關(guān)資料,本文給大家介紹的非常詳細,具有參考借鑒價值,需要的朋友可以參考下
    2016-10-10
  • javaWeb中使用Redis緩存實例解析

    javaWeb中使用Redis緩存實例解析

    這篇文章主要介紹了javaWeb中使用Redis緩存實例解析,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • Java批量操作文件系統(tǒng)的實現(xiàn)示例

    Java批量操作文件系統(tǒng)的實現(xiàn)示例

    文件上傳和下載是java web中常見的操作,本文主要介紹了Java批量操作文件系統(tǒng)的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-03-03
  • springboot @Valid注解對嵌套類型的校驗功能

    springboot @Valid注解對嵌套類型的校驗功能

    這篇文章主要介紹了springboot~@Valid注解對嵌套類型的校驗,主要介紹 @Valid在項目中的使用,需要的朋友可以參考下
    2018-05-05
  • Java連接MySQL數(shù)據(jù)庫并實現(xiàn)數(shù)據(jù)交互的示例

    Java連接MySQL數(shù)據(jù)庫并實現(xiàn)數(shù)據(jù)交互的示例

    數(shù)據(jù)庫是非常重要的一種存儲格式,可以大大提高存儲效率,本文主要介紹了Java連接MySQL數(shù)據(jù)庫并實現(xiàn)數(shù)據(jù)交互的示例,具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • java.io.EOFException: Unexpected end of ZLIB input stream異常解決

    java.io.EOFException: Unexpected end of 

    本文主要介紹了java.io.EOFException: Unexpected end of ZLIB input stream異常解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-05-05
  • Spring三級緩存解決循環(huán)依賴的過程分析

    Spring三級緩存解決循環(huán)依賴的過程分析

    這篇文章主要介紹了Spring三級緩存解決循環(huán)依賴,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-04-04
  • 云計算實驗:Java?MapReduce編程

    云計算實驗:Java?MapReduce編程

    這篇文章主要介紹了云計算實驗:Java?MapReduce編程,?居于Java圍繞MapReduce編程展開詳細內(nèi)容,文章助大家掌握MapReduce編程,理解MapReduce原理,需要的朋友可以參考一下
    2021-12-12
  • Spring?Boot集成etcd的詳細過程

    Spring?Boot集成etcd的詳細過程

    etcd是一個分布式鍵值存儲數(shù)據(jù)庫,用于共享配置和服務(wù)發(fā)現(xiàn),etcd采用Go語言編寫,具有出色的跨平臺支持,很小的二進制文件和強大的社區(qū),這篇文章主要介紹了SpringBoot集成etcd,需要的朋友可以參考下
    2023-08-08
  • Spring中@Autowire注入的深入講解

    Spring中@Autowire注入的深入講解

    這篇文章主要給大家介紹了關(guān)于Spring中@Autowire注入的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09

最新評論

广河县| 读书| 三河市| 柘城县| 龙口市| 石城县| 桂阳县| 赣州市| 抚顺市| 博湖县| 西充县| 灌阳县| 上蔡县| 木兰县| 灵石县| 金昌市| 青河县| 礼泉县| 丰都县| 绥滨县| 乳源| 阳春市| 余江县| 金平| 高要市| 保定市| 衡阳县| 玛多县| 靖西县| 长治市| 乐陵市| 香格里拉县| 文登市| 普安县| 满洲里市| 潮安县| 丰宁| 泰来县| 嘉禾县| 屯门区| 长宁区|