1. 程式人生 > >flume1.7.0-taildirSource 支援多檔案監控和斷點續傳

flume1.7.0-taildirSource 支援多檔案監控和斷點續傳

flume 1.7.0 推出了 taildirSource 元件。tail 監控 目錄下匹配上正則表示式的 的所有檔案,實現斷點續傳。

問題

但是官方的 taildirSource 元件貌似是支援nginx 日誌,對於log4j 日誌好像不太管用。
因為log4j 日誌會自動切分,log4j 切分日誌其實就是新建一個檔案,然後把原來的日誌檔案都改名。但是 taildirSource 元件時不支援檔案改名的。如果檔案改名會認為是新檔案,就會重新讀取,這就導致了日誌檔案重讀。

解決

為了解決這個問題,我去讀了 taildirSource 的原始碼。

發現了兩個地方 需要修改

1.修改 ReliableTaildirEventReader

修改ReliableTaildirEventReader 類的 updateTailFiles 方法。

將其中的 tf.getPath().equals(f.getAbsolutePath()) 判斷條件去除。
只用判斷檔案不為空即可,不用判斷檔案的名字,因為log4j 日誌切分檔案被重新命名了。


//        if (tf == null || !tf.getPath().equals(f.getAbsolutePath())) {
                if (tf == null) {//檔案不存在 position 中則全讀。

2.修改TailFile

修改TailFile 類的 updatePos 方法

此處同樣的原因,inode 已經能夠確定唯一的 檔案了,所以不用加 path 作為判定條件了。所以去掉該條件就支援了檔案重新命名情況。

   //     if (this.inode == inode && this.path.equals(path)) 
          if (this.inode == inode) 

修改這兩個地方就支援了檔案重新命名 的問題,實現了目錄下多檔案監控,斷點續傳。

新增自定義source入口,也就是將原始碼拷貝過來,然後將修改過的程式碼打包為自定義source的jar 包執行flume 。

3.配置檔案

提供 taildirsource 的配置檔案如下

a1.sources = r1

a1.sources.r1.type = com.xx.xx.source.taildir.TaildirSource
a1.sources.r1.channels = c1
a1.sources.r1.positionFile = /opt/apps/log4j/taildir_position.json
a1.sources.r1.filegroups = f1
a1.sources.r1.filegroups.f1 = /opt/apps/log4j/logs/*.log.*
a1.sources.r1.fileHeader = true

通過這些修改就 實現了多檔案監控和斷點續傳。支援log4j 日誌監控。

4. 監控多個資料夾下的多個檔案

監控多個資料夾下的多個檔案,只用 配置多個filegroups 即可。

a1.sources = r1

a1.sources.r1.type = com.xx.xx.source.taildir.TaildirSource
a1.sources.r1.channels = c1
a1.sources.r1.positionFile = /opt/apps/log4j/taildir_position.json

a1.sources.r1.filegroups = f1 f2
a1.sources.r1.filegroups.f1=/opt/apps/log4j/test*.log
a1.sources.r1.filegroups.f2=/opt/apps/log4j2/test*.log
a1.sources.r1.fileHeader = true