springboot+logback日志規范


當前問題

項目采用springboot的框架集成了logback的日志配置方式,但是在使用中遇到了很多問題,同時也基於“立刻方能用好”的原則,對於logback與springboot的配置做了一些了解和其它項目的配置對比,結合當前項目的需求,及需要解決的問題的方案,記錄於此。

  1. logback的日志配置統一采用/home/logs目錄,但是基於本地測試時,Mac電腦沒有權限寫文件到/home目錄,同時也不想寫日志文件到本機
  2. 本地調試項目,需要將日志輸出到終端查看接口執行流程,但是其它環境不能將日志輸出到終端,頻繁更改配置容易上線時疏漏
  3. 線上日志輸出需要采用info級別,但是其他環境(dohko,pre)可能需要做debug輸出,獲取更多的日志信息,頻繁更改日志級別容易導致上線時疏忽檢查導致線上日志文件很大
  4. mybatis的sql輸出只有在debug模式下才能輸出,但是線上日志都是info級別,如何做到info級別的日志也能輸出mybatis的sql日志
  5. 同一日志級別下,需要過濾項目依賴其它包的日志輸出,或將其日志級別調低,甚至不輸出

配置示例

logback-spring.xml
<? xml  version = "1.0"  encoding = "UTF-8" ?>
< configuration >
 
     <!--
        說明:
        1、日志級別及文件
            日志記錄采用分級記錄,級別與日志文件名相對應,不同級別的日志信息記錄到不同的日志文件中
            例如:error級別記錄到{log.context.name}_error.log(該文件為當前記錄的日志文件),而{log.context.name}__error.log為歸檔日志,
            日志文件按日期記錄,每天的日志不再拆分
            例如log-level-2013-12-21.log
            其它級別的日志也是如此。
        2、文件路徑
            統一輸出到/home/logs
        3、Appender
            FILEERROR對應error級別,文件名以{log.context.name}_xxx_error.log形式命名
            FILEWARN對應warn級別,文件名以{log.context.name}_xxx_error.log形式命名
            FILEINFO對應info級別,文件名以{log.context.name}_xxx_error.log形式命名
            FILEDEBUG對應debug級別,文件名以{log.context.name}_xxx_error.log形式命名
            默認輸出級別為debug,不明確指定情況下文件名以{log.context.name}.log形式命名
            stdout將日志信息輸出到控制上,為方便開發測試使用
     -->
 
     <!--定義日志文件的存儲地址 勿在 LogBack 的配置中使用相對路徑-->
     < property  name = "log.directory"  value = "/home/logs/"  />
     <!--項目名稱,也是存儲日志的具體目錄-->
     < property  name = "log.context.name"  value = "shop-crm-service21"  />
     <!--日志的字符編碼-->
     < property  name = "log.charset"  value = "UTF-8"  />
     <!--歷史記錄最大保存天數-->
     < property  name = "log.maxHistory"  value = "30"  />
     <!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度%msg:日志消息,%n是換行符-->
     < property  name = "log.pattern"  value = "%d{yyyy-MM-dd HH:mm:ss.SSS}$$[%thread]$$%-5level{}$$shop-crm-service$$%msg%n"  />
     <!--日志Error級別名稱配置-->
     < property  name = "log.error.log.level"  value = "ERROR"  />
     <!--異步寫日志的隊列大小配置,默認為256-->
     < property  name = "log.async.queue.size"  value = "1024"  />
 
     <!--配置日志的上下文名稱-->
     < contextName >${log.context.name}</ contextName >
 
     <!--對應spring環境變量為local的日志配置,只做控制台輸出配置-->
     < springProfile  name = "local" >
         <!--控制台日志輸出配置,可以匹配色彩和高亮-->
         < appender  name = "STDOUT"  class = "ch.qos.logback.core.ConsoleAppender" >
             < encoder >
                 < pattern >%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{50}) - %yellow([%file:%line]) - %msg%n</ pattern >
                 <!--<pattern>${log.pattern}</pattern>-->
                 < charset >${log.charset}</ charset >
             </ encoder >
         </ appender >
     </ springProfile >
 
     < springProfile  name = "mu,dohko,pre,production" >
         <!-- 服務器上使用的appender start -->
         <!-- 默認的file appender,按天切分日志 -->
         < appender  name = "ROLLING_FILE_DEFAULT"  class = "ch.qos.logback.core.rolling.RollingFileAppender" >
             < file >${log.directory}${log.context.name}/${HOSTNAME}-%d{yyyyMMdd}.log</ file >
             < append >true</ append >
             < rollingPolicy  class = "ch.qos.logback.core.rolling.TimeBasedRollingPolicy" >
                 < fileNamePattern >${log.directory}${log.context.name}/${HOSTNAME}.%d{yyyy-MM-dd}.%i.log</ fileNamePattern >
                 < maxHistory >${log.maxHistory}</ maxHistory >
                 < totalSizeCap >30gb</ totalSizeCap >
                 < timeBasedFileNamingAndTriggeringPolicy  class = "ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP" >
                   < maxFileSize >2gb</ maxFileSize >
                 </ timeBasedFileNamingAndTriggeringPolicy >
          </ rollingPolicy >
             < encoder >
                 < pattern >${log.pattern}</ pattern >
                 < charset >${log.charset}</ charset >
             </ encoder >
         </ appender >
 
         <!-- 錯誤日志,按天切分 -->
         < appender  name = "ROLLING_FILE_ERROR"  class = "ch.qos.logback.core.rolling.RollingFileAppender" >
             < filter  class = "ch.qos.logback.classic.filter.LevelFilter" >
                 < level >${log.error.log.level}</ level >
                 < onMatch >ACCEPT</ onMatch >
                 < onMismatch >DENY</ onMismatch >
             </ filter >
             < file >${log.directory}${log.context.name}/${HOSTNAME}_error-%d{yyyyMMdd}.log</ file >
             <!-- 日志追加配置 -->
             < append >true</ append >
             < rollingPolicy  class = "ch.qos.logback.core.rolling.TimeBasedRollingPolicy" >
                 < fileNamePattern >${log.directory}${log.context.name}/${HOSTNAME}_error.%d{yyyy-MM-dd}.log</ fileNamePattern >
                 < maxHistory >${log.maxHistory}</ maxHistory >
             </ rollingPolicy >
             <!-- 此日志文件只記錄error級別的 -->
             < encoder >
                 < pattern >${log.pattern}</ pattern >
                 < charset >${log.charset}</ charset >
             </ encoder >
         </ appender >
 
         <!-- 異步寫日志文件的配置 -->
         < appender  name  = "ASYNC_FILE"  class "ch.qos.logback.classic.AsyncAppender" >
             <!-- 當隊列達到配置隊列大小的80%時,不將日志丟失 如果為-1 則超過隊列80%的日志丟掉-->
             < discardingThreshold  >0</ discardingThreshold >
             < queueSize >${log.async.queue.size}</ queueSize >
             < appender-ref  ref  "ROLLING_FILE_DEFAULT" />
         </ appender >
     </ springProfile >
 
     <!-- rabbitmq的日志專屬配置 -->
     < logger  name  "org.springframework.amqp.rabbit.listener.BlockingQueueConsumer"  level  = "WARN" />
     <!-- zookeeper 的日志專屬配置 -->
     < logger  name  "org.apache.zookeeper.ClientCnxn"  level  = "WARN" />
     <!-- 多數據源 的日志專屬配置 -->
     < logger  name  "com.hualala.commons.multidatasource.curator.CuratorClient"  level  = "WARN" />
     < logger  name  "com.hualala.commons.multidatasource.datasource.DynamicDataSource"  level  = "WARN" />
     <!-- 設置falcon監控的日志輸出格式 -->
     < logger  name  "com.hualala.infrastructure.falcon.FalconMonitor"  level  = "WARN" />
 
     <!--mybatis的日志專屬配置 -->
     < logger  name = "jdbc.sqltiming"  level = "debug" />
     < logger  name = "com.ibatis"  level = "debug"  />
     < logger  name = "com.ibatis.common.jdbc.SimpleDataSource"  level = "debug"  />
     < logger  name = "com.ibatis.common.jdbc.ScriptRunner"  level = "debug"  />
     < logger  name = "com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate"  level = "debug"  />
     < logger  name = "java.sql.Connection"  level = "debug"  />
     < logger  name = "java.sql.Statement"  level = "debug"  />
     < logger  name = "java.sql.PreparedStatement"  level = "debug"  />
     < logger  name = "java.sql.ResultSet"  level = "debug"  />
 
     < logger  name = "org.springframework"  level = "WARN"  />
 
     <!-- 當前項目 的不同環境的日志級別配置 -->
     < logger  name = "com.hualala"  level = "debug"  additivity = "false" >
         < springProfile  name = "local" >
             < appender-ref  ref = "STDOUT"  />
         </ springProfile >
 
         < springProfile  name = "mu,dohko,pre" >
             < appender-ref  ref = "ASYNC_FILE"  />
             < appender-ref  ref = "ROLLING_FILE_ERROR"  />
         </ springProfile >
 
         < springProfile  name = "production" >
             < appender-ref  ref = "ASYNC_FILE"  />
             < appender-ref  ref = "ROLLING_FILE_ERROR"  />
         </ springProfile >
     </ logger >
 
     < root >
         < springProfile  name = "local" >
             < level  value = "info" />
             < appender-ref  ref = "STDOUT"  />
         </ springProfile >
 
         <!-- dohko環境用來測試,日志級別盡量可以設置的低,便於定位問題 -->
         < springProfile  name = "mu,dohko,pre" >
             < level  value = "info" />
 
             < appender-ref  ref = "ASYNC_FILE"  />
             < appender-ref  ref = "ROLLING_FILE_ERROR"  />
         </ springProfile >
 
         <!-- pre環境用來做壓測,避免對測試環境的日志服務產生壓力,日志級別設置為warn -->
         < springProfile  name = "pre" >
             < level  value = "warn" />
 
             < appender-ref  ref = "ASYNC_FILE"  />
             < appender-ref  ref = "ROLLING_FILE_ERROR"  />
         </ springProfile >
 
         <!-- production為生產環境,需要記錄能夠定位問題或流程流轉的日志,但是非必要的日志無須記錄 -->
         < springProfile  name = "production" >
             < level  value = "info" />
             < appender-ref  ref = "ASYNC_FILE"  />
             < appender-ref  ref = "ROLLING_FILE_ERROR"  />
         </ springProfile >
     </ root >
</ configuration >

 

配置解析

property:將配置中引用的公共的常量做全局設置,便於修改及維護
springProfile:配置spring的環境變量名稱(對應application.yml中的profilename,name可以為單個或多個,多個名稱用“,”隔開,還可取反,比如!local,代表非local環境的其它所有環境),appender節點的日志級別在未明確指定的情況下,繼承自root根結點指定等級及其父等級
root:root根結點配置,內部配置多個環境變量對應的日志引用,為每個環境變量設置對應等級,在local本地環境變量下配置終端輸出日志,其它環境則配置寫入文件
logger:直接指定第三方服務的根目錄報名,設置日志級別高於其默認輸出的日志級別,將限制其日志輸入;
如果將其日志級別設置為小於等於其日志輸出級別,且小於root根節點的日志級別,此時需要輸出logger指定日志,則需要配置當前項目的的日志級別為logger中指定的日志級別,

參考資料

github項目配置參考

springboot+logback日志配置

logback官方文檔

logback 異步日志配置


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM