Filebeat的Registry檔案解讀

運維咖啡吧發表於2019-03-29

你可能沒有注意但很重要的filebeat小知識

Registry檔案

Filebeat會將自己處理日誌檔案的進度資訊寫入到registry檔案中,以保證filebeat在重啟之後能夠接著處理未處理過的資料,而無需從頭開始

registry檔案內容為一個list,list裡的每個元素都是一個字典,字典的格式如下:

{
    "source": "/home/logs/app/exception.log",
    "offset": 8137,
    "FileStateOS": {
        "inode": 1048,
        "device": 29
    },
    "timestamp": "2019-03-28T13:31:10.87878789+08:00",
    "ttl": -1
}
複製程式碼

每個欄位的意義解釋:

source: 記錄採集日誌的完整路徑

offset: 採集這個日誌檔案到了哪個位置,總採集位元組數

inode: 日誌檔案的inode號,關於inode的詳細解釋看下文

device: 日誌所在的磁碟編號,下文stat命令中Device的值

timestamp: 日誌最後一次發生變化的時間戳

ttl: 採集失效時間,-1表示永不失效

Filebeat在每次啟動時都會來讀取這個檔案,如果檔案不存在則會建立新檔案

inode相關知識

硬碟格式化的時候,作業系統自動將硬碟分成了兩個區域。

一個是資料區,用來存放檔案的資料資訊

一個是inode區,用來存放檔案的元資訊,比如檔案的建立者、建立時間、檔案大小等等

每一個檔案都有對應的inode,裡邊包含了與該檔案有關的一些資訊,可以用stat命令檢視檔案的inode資訊

# stat /home/logs/app/exception.log
  File: '/home/logs/app/exception.log'
  Size: 40210     	Blocks: 80         IO Block: 4096   regular file
Device: 1dh/29d	Inode: 1038        Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2019-03-28 00:27:01.522594000 +0800
Modify: 2019-03-28 15:59:14.582594000 +0800
Change: 2019-03-28 15:59:14.582594000 +0800
 Birth: -
複製程式碼

我們可能遇到過明明檢視磁碟空間還充足,但無法建立新檔案的問題,這時候可能就是因為磁碟的inode用完了,磁碟的inode可以通過命令df -i檢視

# df -i
Filesystem        Inodes IUsed     IFree IUse% Mounted on
none           104855552 39836 104815716    1% /
tmpfs            1024703    16   1024687    1% /dev
tmpfs            1024703    10   1024693    1% /sys/fs/cgroup
/dev/vdc1      104855552 39836 104815716    1% /etc/hosts
複製程式碼

每個inode都有一個號碼,作業系統就是通過這個號碼來識別不同檔案的,這個號碼就是filebet配置中的inode,可以通過ls -i命令檢視

# ls -i /home/logs/app/exception.log
1048 /home/logs/app/exception.log
複製程式碼

可能你檢視registry檔案發現同名的log檔案記錄有很多條,造成這個的主要原因是你的log檔案可能被重新命名過,常見的場景例如log4j裡邊的每日生成一個日誌檔案,把老的日誌檔案重新命名

logstash有關配置引數

registry_file: registry檔案路徑,可以只寫檔名,那麼檔案會建立在預設的${path.data}目錄下,也可以指定一個絕對路徑

registry_file_permissions: registry檔案的許可權,預設是0600,只有屬主有讀寫許可權

registry_flush: registry檔案的重新整理時間,預設為0,表示實時重新整理,filebeat處理一條日誌就實時的將資訊寫入到registry檔案中,這在日誌量大的時候會頻繁讀寫registry檔案,可考慮適當增加這個值來降低磁碟開銷

如果filebeat在處理髮送事件時還沒有等到output的響應就意外關閉或僵死了,新傳送的日誌狀態沒有來得及記錄進registry檔案中,那麼在filebeat重新啟動後會去讀取registry檔案記錄的資訊重新傳送日誌,這確保了所有日誌都被髮送過,但可能會有重複的日誌被髮送

重新從頭讀取日誌

有些情況下我們需要讓filebeat重新從頭讀取日誌,尤其是在除錯的時候,有了上邊的知識我們就很容易實現filebeat重新從頭讀取日誌了,核心的思想就是幹掉registry檔案

  1. 找到registry檔案的位置,如果沒有單獨配置那麼檔案路徑為/var/lib/filebeat/registry,不在也沒關心,可以直接find命令查詢
# find / -name registry
/var/lib/filebeat/registry
複製程式碼
  1. 關閉filebeat --> 刪掉registry檔案 --> 啟動filebeat
/etc/init.d/filebeat stop &&\
rm -r /var/lib/filebeat/registry &&\
/etc/init.d/filebeat start
複製程式碼
  1. 檢視registry檔案內容重新生成了資料

Filebeat的Registry檔案解讀

相關文章推薦閱讀:

相關文章