你可能沒有注意但很重要的filebeat小知識node
Filebeat會將本身處理日誌文件的進度信息寫入到registry文件中,以保證filebeat在重啓以後可以接着處理未處理過的數據,而無需從頭開始bash
registry文件內容爲一個list,list裏的每一個元素都是一個字典,字典的格式以下:app
{
"source": "/home/logs/app/exception.log",
"offset": 8137,
"FileStateOS": {
"inode": 1048,
"device": 29
},
"timestamp": "2019-03-28T13:31:10.87878789+08:00",
"ttl": -1
}
複製代碼
每一個字段的意義解釋:spa
source: 記錄採集日誌的完整路徑操作系統
offset: 採集這個日誌文件到了哪一個位置,總採集字節數調試
inode: 日誌文件的inode號,關於inode的詳細解釋看下文日誌
device: 日誌所在的磁盤編號,下文stat
命令中Device的值code
timestamp: 日誌最後一次發生變化的時間戳cdn
ttl: 採集失效時間,-1表示永不失效事件
Filebeat在每次啓動時都會來讀取這個文件,若是文件不存在則會建立新文件
硬盤格式化的時候,操做系統自動將硬盤分紅了兩個區域。
一個是數據區,用來存放文件的數據信息
一個是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裏邊的每日生成一個日誌文件,把老的日誌文件重命名
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文件
/var/lib/filebeat/registry
,不在也沒關心,能夠直接find命令查找# find / -name registry
/var/lib/filebeat/registry
複製代碼
/etc/init.d/filebeat stop &&\
rm -r /var/lib/filebeat/registry &&\
/etc/init.d/filebeat start
複製代碼
相關文章推薦閱讀: