再議java日誌管理logback

1、問題描述

關於java中的日誌管理logback,去年寫過關於logback介紹的文章,這次項目中又優化了下,記錄下,希望能幫到需要的朋友。

2、解決方案

這次其實是碰到了一個問題,一般的情況是,會單獨在linux上創建個用戶,線上和開發環境一樣,這樣腳本中假如有相對目錄的話,也能保持一致,但是這次因爲線上環境創建其他用戶有問題,只能用root用戶操作,導致logback定義的目錄,開發和線上不一致,線上是root/***,開發環境沒有權限訪問該目錄(開發環境使用的普通用戶),所以logback的目錄,需要配置化,但是無法從application中獲取,換了個方式解決的,記錄下。

2.1 配置

<?xml version="1.0" encoding="UTF-8"?>

<configuration>
    <springProperty scope="context" name="LOG_HOME" source="path.log"/>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
    </appender>
    <appender name="FILE"  class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>${LOG_HOME}/laowangtest.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
            <MaxHistory>30</MaxHistory>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <MaxFileSize>1kb</MaxFileSize>
<!--                <MaxFileSize>5MB</MaxFileSize>- -->
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- 日誌輸出級別 -->
    <root level="INFO">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="FILE" />
    </root>

</configuration>

簡要說明

1、目錄配置化

 <springProperty scope="context" name="LOG_HOME" source="path.log"/>

其中application.yml中配置是這樣的:

path:
  log: e:/laowang/test

實際項目中還有另外的配置文件:application-dev.yml、application-test.yml、application-prod.yml,path.log是配置在每個文件中,每個裏面的值不一樣,而不是配置在公共配置application.yml中,這樣根據打包規則就能獲取不同的日誌目錄了。

另外至於爲什麼無法通過${}方式獲取值,網上或者官方給的答案是,在容器中,logback先與application.yml加載了,所以通過${}方式就拿不到值了;同時保險起見,將logback.xml文件名稱更改爲logback-***.xml,例如:logback-spring.xml。

2、簡單介紹下目前的配置

配置了兩個Appender,一個打印到控制檯,一個是到文件,以前把文件按照info、warn、errro,根據日誌級別區分了打印文件,現在感覺沒必要,就打印一個裏面去,還按照以前方式滾動,首先按天,其次按大小滾動日誌

   <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>${LOG_HOME}/laowangtest.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
            <MaxHistory>30</MaxHistory>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <MaxFileSize>1kb</MaxFileSize>
<!--                <MaxFileSize>5MB</MaxFileSize>- -->
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>

其中幾個參數:

(1)FileNamePattern,文件目錄;

(2)MaxHistory:日誌保留天數;

(3)MaxFileSize:多大開始滾動(新增)日誌,記得是5MB,後面還有B不要漏掉了。

2.2 效果

爲了展示效果,把大小給成1kb滾動,弄個測試方法進行驗證

(1)測試方法

@Api(value = "test")
@RestController
public class TestController {
    Logger logger = LoggerFactory.getLogger(TestController. class);

    @RequestMapping(value ="/logTest")
    @ResponseBody
    public  String logTest() {
        logger.info("老王是帥哥老王是帥哥老王是帥哥");
        return "老王是帥哥!";
    }
}

(2)執行效果

瀏覽器

生成文件

文件內容:


更多信息請關注公衆號:「軟件老王」,關注不迷路,軟件老王和他的IT朋友們,分享一些他們的技術見解和生活故事。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章