美文网首页
使用logstash的input file filter收集日志

使用logstash的input file filter收集日志

作者: huan1993 | 来源:发表于2021-05-10 16:23 被阅读0次

    一、需求

    使用logstash读取本地磁盘上的文件,并通过标准输出输出出来。

    二、实现步骤

    1、前置知识

    1、读取本地磁盘文件?

     可以通过 input file plugin 来实现。
    

    2、如何保证文件的每一行只读取一次?

    这个是通过 `sincedb`来保证的。
    

    2、编写pipeline文件

    vim multi-input/multi-input.conf

    # 
    input {
        file {
            path => ["/Users/huan/soft/elastic-stack/logstash/logstash/pipeline.conf/multi-input/redis.log"]
            start_position => "beginning"
            sincedb_path => "/Users/huan/soft/elastic-stack/logstash/logstash/pipeline.conf/multi-input/sincedb.db"
            type => "redis"
              mode => "read"
            stat_interval => "1 second"
            discover_interval => 15
            sincedb_write_interval => 15
            add_field => {
                "custom_mode" => "tail"
            }
        }
    
        file {
            path => ["/Users/huan/soft/elastic-stack/logstash/logstash/pipeline.conf/multi-input/springboot.log"]
            start_position => "end"
            sincedb_path => "/Users/huan/soft/elastic-stack/logstash/logstash/pipeline.conf/multi-input/sincedb.db"
              mode => "tail"
            type => "springboot"
        }
    }
    
    # 过滤数据
    filter {
        
    }
    
    # 输出
    output {
    
            # 如果type的值是redis则使用 rubydebug 输出。 type的值是在 input阶段制定的。
        if [type] == 'redis' {
          stdout {
              codec => rubydebug {
                  
              }
          }
        }
    
        if [type] == 'springboot' {
          stdout {
            codec => line {
                charset => "UTF-8"
            }
          }
        }
    }
    

    3、Input 中 file 插件的部分参数解释:

    1. path:指定了从那个地方读取文件,使用的是glob匹配语法。
    ["/var/log/*.log"]  表示匹配的是 /var/log 目录下所有的以 .log 结尾的文件。
    
    ["/var/log/**/*.log"] 表示匹配的是 /var/log 目录下、以及它下方的子目录下所有的以 .log 结尾的文件。
    
    ["/var/log/{redis,springboot}/*.log"] 表示匹配的是 /var/log 目录下方 redis或springboot目录下方所有的以 .log 结尾的文件。
    
    1. exclue: 表示需要排除的文件。

    2. start_position:表示从那个地方开始读取文件

      1. beginning 表示从文件开头读取。
      2. end 表示从文件结尾读取。
    3. sincedb_path: sincedb数据库文件的位置,必须是一个文件,不可是目录。

      1. sincedb 这个记录了当前读取文件的inode、读取到文件字节的position位置、读取的是那个文件、文件最后修改的时候戳。

      2. sincedb的作用
      3. sincedb_path => /dev/null 开发时为了每次都能从文件的开头读取,设置成 /dev/null 可能会报如下错误。

        1. Error: Permission denied - Permission denied 
          Exception: Errno::EACCES Stack: org/jruby/RubyFile.java:1267:in `utime'
          
        2. 解决方案:将 sincedb_path的路径设置成一个具体的文件。

        3. 参考链接: https://discuss.elastic.co/t/logstash-permission-access-denied-error-for-stack-org-jruby-rubyfile-javain-utime/178016

    4. stat_interval: 定时监测文件是否有更新,单位是秒或者string_duration格式。

    5. discover_interval: 每隔多少时间监测是否有新的文件产生,单位是秒。

    6. mode:读取文件的模式,为tailread,默认是tail

      1. 当是read时,默认读取完这个文件后会删除这个文件。
    7. sincedb_write_interval: 多久将文件的position位置写入到sincedb文件中。

    4、启动logstash

    bin/logstash -f logstash/pipeline.conf/multi-input/multi-input.conf
    

    5、测试

    测试结果

    三、参考链接

    1、input file plugin 的使用

    2、sincedb_path 设置成 /dev/null 可能报的一个错

    相关文章

      网友评论

          本文标题:使用logstash的input file filter收集日志

          本文链接:https://www.haomeiwen.com/subject/lpuidltx.html