关于java:使用logstash的input-file-filter收集日志文件

1次阅读

共计 2310 个字符,预计需要花费 6 分钟才能阅读完成。

一、需要

应用 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_path => /dev/null 开发时为了每次都能从文件的结尾读取,设置成 /dev/null 可能会报如下谬误。

      1. Error: Permission denied - Permission denied 
    
       2. 解决方案:将 `sincedb_path` 的门路设置成一个具体的文件。3. 参考链接: [https://discuss.elastic.co/t/logstash-permission-access-denied-error-for-stack-org-jruby-rubyfile-javain-utime/178016](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


## 5、测试

![测试后果](https://img-blog.csdnimg.cn/20210510160627722.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Z1X2h1b18xOTkz,size_16,color_FFFFFF,t_70)

# 三、参考链接

1、[input file plugin 的应用](https://www.elastic.co/guide/en/logstash/current/plugins-inputs-file.html)
正文完
 0