Filebeat的Registry文件解讀


你可能沒有注意但很重要的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文件內容重新生成了數據

相關文章推薦閱讀:


免責聲明!

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



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