filebeat 读取日志时支持随时移动删除文件,但是用 golang os.Open 方法读取文件时想要删除或移动文件的时候会提示文件被占用。 请问 filebeat 是使用了什么机制原理实现了?
1
codehz 2019-08-29 16:57:00 +08:00 via Android
读取完关闭了就好
|
3
Trim21 2019-08-29 17:05:51 +08:00
filebeat 在 github 上有源码...
|
5
Vegetable 2019-08-29 17:42:11 +08:00
会吗 ?我记得不会吧,是 windows 吗?
|
7
flynaj 2019-08-29 17:48:11 +08:00 via Android
open 的时候设置权限
|
8
Vegetable 2019-08-29 17:49:01 +08:00 1
|
9
CEBBCAT 2019-08-29 17:49:22 +08:00 via Android
软链接行吗?瞎想的
|
10
Vegetable 2019-08-29 17:53:58 +08:00
@JKeita ..我 linux 测试没有你说的问题
linux 的就这么一段 // ReadOpen opens a file for reading only func ReadOpen(path string) (*os.File, error) { flag := os.O_RDONLY perm := os.FileMode(0) return os.OpenFile(path, flag, perm) },和 os.Open 一样的。 // Open opens the named file for reading. If successful, methods on // the returned file can be used for reading; the associated file // descriptor has mode O_RDONLY. // If there is an error, it will be of type *PathError. func Open(name string) (*File, error) { return OpenFile(name, O_RDONLY, 0) } |
11
Vegetable 2019-08-29 18:02:21 +08:00
我印象比较深,linux 中有程序占用文件的时候删除文件,是没有真正删除的,进程还是可以写到文件里,只有进程释放文件之后才会真正被删除。因为之前清理服务器上的垃圾日志时删了文件空间没有释放,所以专门去查了一下。
也就是说理论上 linux 不需要专门处理,读就完了,但是你要监控这个文件是不是被删了,filebeat 有一个 IsRemoved 的方法,可能就是检测这个文件是不是删掉了,删掉了就释放资源的功能。 |