请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

logstash 读取 log4j 回滚日志 如何避免漏掉

 logstash 读取 all.log 日志文件并将此日志发送到es。

每天凌晨会把 all.log 重命名后压缩移动到不同的文件夹,然后新建一个空的 all.log

logstash 因为会记录自己读取完日志文件的位置,然后将自己读取内容的偏移量保存到一个隐藏文件 sincedb中

所以 不会 从 all.log 的第一行开始读

这样会漏掉一些日志,

请问怎么解决

 

就是 同一个 log 文件被清空后,

怎么让 logstash 重置 sincedb里记录的偏移量,

然后 logstash 可以从第一行重新开始读

正在回答

1回答

请发下你 logstash input 的配置看下

0 回复 有任何疑惑可以回复我~
  • 提问者 慕虎2082646 #1
    input{
        file {
            path => "/home/java/smart_drive_api/s1/logs/app/log_all.log"
            type => "smart_drive_api"
            start_position => "beginning"
        }
    }
    
    filter {
        if [type] == "smart_drive_api" {
            mutate {
                remove_field => ["host"]
            }
            mutate { 
                add_field => { "host" => "centos7_server_7"}
            }
        }
    }
    
    output{
         if [type] == "smart_drive_api" {
            elasticsearch{
                hosts => [""]
                index => "logstash-%{type}"
                user => ''
                password => ""
            }
        }
    }
    回复 有任何疑惑可以回复我~ 2021-06-23 16:34:15
  • rockybean 回复 提问者 慕虎2082646 #2
    看配置没什么问题,估计和你的日志滚动的策略有关系。logstash 识别唯一性文件的标识是 inode。一般滚动策略是类似于下面的命令
    1. mv log_all.log log_all.old.log
    2. touch log_all.log
    3. 压缩 log_all.old.log
    这个时候的 log_all.log 的inode 已经变了,对于 logstash 来说是一个新的文件,那么记录的offset 也就是从头开始。你遇到的这个情况可能是滚动方式有问题,导致inode 没变,那么它的offset 就还是之前的,这就有问题了。
    日志滚动建议用 logrotate 之类的成熟工具来实现。
    https://cloud.tencent.com/developer/article/1592659
    回复 有任何疑惑可以回复我~ 2021-06-24 16:40:34
  • 另外 log4j 自带的滚动策略应该也没问题才对。你可以把滚动策略调低,然后自己测试下
    回复 有任何疑惑可以回复我~ 2021-06-24 16:41:34
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信