Filebeat的Registry文件解读
# Registry 文件
Filebeat 会将自己处理日志文件的进度信息写入到 registry 文件中,以保证 filebeat 在重启之后能够接着处理未处理过的数据,而无需从头开始。
registry 文件内容为一个 list,list 里的每个元素都是一个字典,字典的格式如下:
{
"source": "/data/log/tmp.log",
"offset": 585451484,
"FileStateOS": {
"inode": 75063792,
"device": 64785
},
"timestamp": "2020-06-06T03:10:03.757645551+08:00",
"ttl": 90000000000000
}
2
3
4
5
6
7
8
9
10
每个字段的意义解释:
- source: 记录采集日志的完整路径
- offset: 采集这个日志文件到了哪个位置,总采集字节数
- inode: 日志文件的 inode 号,关于 inode 的详细解释看下文
- device: 日志所在的磁盘编号,下文
stat
命令中 Device 的值 - timestamp: 日志最后一次发生变化的时间戳
- ttl: 采集失效时间,-1 表示永不失效
Filebeat 在每次启动时都会来读取这个文件,如果文件不存在则会创建新文件。
# inode 相关知识
硬盘格式化的时候,操作系统自动将硬盘分成了两个区域。
一个是数据区,用来存放文件的数据信息
一个是 inode 区,用来存放文件的元信息,比如文件的创建者、创建时间、文件大小等等
每一个文件都有对应的 inode,里边包含了与该文件有关的一些信息,可以用stat
命令查看文件的 inode 信息
$ stat /data/log/tmp.log
File: ‘/data/log/tmp.log’
Size: 196901341 Blocks: 503040 IO Block: 4096 regular file
Device: fd11h/64785d Inode: 71012560 Links: 1
Access: (0640/-rw-r-----) Uid: ( 80/ www) Gid: ( 0/ root)
Access: 2020-06-06 03:10:01.841178994 +0800
Modify: 2020-06-06 14:09:48.536169224 +0800
Change: 2020-06-06 14:09:48.536169224 +0800
Birth: -
2
3
4
5
6
7
8
9
我们可能遇到过明明查看磁盘空间还充足,但无法创建新文件的问题,这时候可能就是因为磁盘的 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
2
3
4
5
6
每个 inode 都有一个号码,操作系统就是通过这个号码来识别不同文件的,这个号码就是 filebet 配置中的 inode,可以通过ls -i
命令查看
$ ls -i /data/log/tmp.log
71012560 /data/log/tmp.log
2
可能你查看 registry 文件发现同名的 log 文件记录有很多条,造成这个的主要原因是你的 log 文件可能被重命名过,常见的场景例如 log4j 里边的每日生成一个日志文件,把老的日志文件重命名。
# 重新从头读取日志
有些情况下我们需要让 filebeat 重新从头读取日志,尤其是在调试的时候,有了上边的知识我们就很容易实现 filebeat 重新从头读取日志了,核心的思想就是干掉 registry 文件
找到 registry 文件的位置,如果没有单独配置那么文件路径为
/var/lib/filebeat/registry
,不在也没关心,可以直接 find 命令查找。# find / -name registry /var/lib/filebeat/registry
1
2关闭 filebeat –> 删掉 registry 文件 –> 启动 filebeat。
/etc/init.d/filebeat stop &&\ rm -r /var/lib/filebeat/registry &&\ /etc/init.d/filebeat start
1
2
3查看 registry 文件内容重新生成了数据。