Filebeat如何保证在日志文件被切割(或滚动rolling)时依然正确读取文件
来源:互联网 发布:出租房用什么软件 编辑:程序博客网 时间:2024/06/01 07:27
我们的日志收集系统使用Filebeat来收集日志文件,部署时并没有多想,只配置了一下监控的日志文件名。上线几个月,日志监控从没出过问题。后来想想其实这里面有很多点需要考虑的,没出问题真是感谢Filebeat默认配置下想的就很周全。
业务系统使用logback作为日志框架。通过查看源码,发现logback日志切割用的是JDK里File#renameTo()
方法。如果该方法失败,就再尝试使用复制数据的方式切割日志。查找该方法相关资料得知,只有当源文件和目标目录处于同一个文件系统、同volumn(即windows下的C, D盘)下该方法才会成功,切不会为重命名的后的文件分配新的inode值。也就是说,如果程序里一直保存着该文件的描述符,那么当程序再写日志时,就会向重命名后的文件中写。那么问题来了,filebeat是会一直打开并保存文件描述符的,那么它是怎么得知日志被切割这件事的呢?
如果只用当前文件描述符一路监控到天黑的话,那么当logback把日志重命名后,filebeat仍然会监控重命名后的日志,新创建的日志文件就看不到了。实际上,filebeat是通过close_inactive
和scan_frequency
两个参数(机制)来应对这种情况的:
close_inactive
该参数指定当被监控的文件多长时间没有变化后就关闭文件句柄(file handle)。官方建议将这个参数设置为一个比文件最大更新间隔大的值。比如文件最长5s更新一次,那就设置成1min。默认值为5min.scan_frequency
该参数指定Filebeat搜索新文件的频率(时间间隔)。当发现新的文件被创建时, Filebeat会为它再启动一个 harvester 进行监控。默认为10s。
综合以上两个机制,当logback完成日志切割后(即重命名),此时老的harvester仍然在监控重命名后的日志文件,但是由于该文件不会再更新,因此会在close_inactive
时间后关闭这个文件的 harvester。当scan_frequency
时间过后,Filebeat会发现目录中出现了新文件,于是为该文件启动 harvester 进行监控。这样就保证了切割日志时也能不丢不重的传输数据。(不重是通过为每个日志文件保存offset实现的)
- Filebeat如何保证在日志文件被切割(或滚动rolling)时依然正确读取文件
- filebeat--logstash同步日志文件
- Nginx 日志文件切割
- Nginx 日志文件切割
- nginx日志文件切割
- Nginx 日志文件切割
- Nginx 日志文件切割
- nginx日志文件切割
- logrotate切割日志文件
- nginx 日志文件切割
- nginx日志文件切割
- nginx 切割日志文件
- Python文件读取切割
- 在使用UltraEdit时如何保证不生成.bak文件
- 如何正确删除ORACLE归档日志文件
- 如何正确删除ORACLE归档日志文件
- 如何正确删除ORACLE归档日志文件
- 如何正确删除ORACLE归档日志文件
- 如何能成为真正优秀的程序猿,这几点你必须知道!
- python type(object) 与 isinstance(object, base) 区别
- ubuntu16.04安装pycharm生成快捷方式以及命令使用说明
- windows安装solr并配置tomcat
- Execution failed for task ':app:compileDebugJavaWithJavac'. Failed to create MD5 hash for file ...
- Filebeat如何保证在日志文件被切割(或滚动rolling)时依然正确读取文件
- 哈希表处理地址冲突的方法及成功查找的平均长度
- git使用
- 装备系统学习--B站李三影教程
- gpu显存与模型文件的关系
- Netsoft Json 高级用法
- PHP调试时print_r ,var_dump的区别
- PAT 乙级 1076. Wifi密码 (15)
- ClassLoader工作机制