TOP

flume1.7.0-taildirSource 支持多文件監控和斷點續傳
2018-11-29 03:21:51 】 瀏覽:443
Tags:

版權聲明:本文為博主編寫文章,未經博主允許轉載,轉載請注明出處。 https://blog.csdn.net/u012373815/article/details/62241528

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


問題

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


解決

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

發現了兩個地方 需要修改

1.修改 ReliableTaildirEventReader

修改ReliableTaildirEventReader 類的 updateTailFiles 方法。

將其中的 tf.getPath().equals(f.getAbsolutePath()) 判斷條件去除。
只用判斷文件不為空即可优乐棋牌app下载,不用判斷文件的名字,因為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

參考:

請關注公眾號獲取更多資料



】【打印繁體】【】【】 【】【】【】 【關閉】 【返回頂部
上一篇Windows64環境下   使用Flum.. 下一篇log4j結合apache flume輸出日志到..