使用logstash的input file filter收集日誌文件

1、需求

使用logstash讀取本地磁盤上的文件,並經過標準輸出輸出出來。html

2、實現步驟

一、前置知識

一、讀取本地磁盤文件?java

​ 能夠經過 input file plugin 來實現。node

二、如何保證文件的每一行只讀取一次?redis

​ 這個是經過 sincedb來保證的。spring

二、編寫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"
        }
      }
    }
}
複製代碼

三、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: 表示須要排除的文件。vim

  2. start_position:表示從那個地方開始讀取文件springboot

    1. beginning 表示從文件開頭讀取。
    2. end 表示從文件結尾讀取。
  3. sincedb_path: sincedb數據庫文件的位置,必須是一個文件,不但是目錄。ruby

    1. sincedb 這個記錄了當前讀取文件的inode、讀取到文件字節的position位置、讀取的是那個文件、文件最後修改的時候戳。bash

    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. 參考連接: discuss.elastic.co/t/logstash-…

  4. stat_interval: 定時監測文件是否有更新,單位是秒或者string_duration格式。

  5. discover_interval: 每隔多少時間監測是否有新的文件產生,單位是秒。

  6. mode:讀取文件的模式,爲tailread,默認是tail

    1. 當是read時,默認讀取完這個文件後會刪除這個文件。
  7. sincedb_write_interval: 多久將文件的position位置寫入到sincedb文件中。

四、啓動logstash

bin/logstash -f logstash/pipeline.conf/multi-input/multi-input.conf
複製代碼

五、測試

測試結果

3、參考連接

一、input file plugin 的使用

二、sincedb_path 設置成 /dev/null 可能報的一個錯

相關文章
相關標籤/搜索