logstash    JRuby

公司需求:需要把不同地方不同服务器的dns日志收集上来,并做一些格式转换. logstash的socket发送数据,filter处理转换即可处理这些业务. 不用考虑使用其他工具就完成需求.

以前只是改写过配置文件,没有部署和深入了解这个工具,现在把流程和学习过程写一下.

第一篇文档, 要开启博客之旅了~~~.

1.下载 在官网右键复制 下载tar.gz文件格式 的按钮即可
  wget https://artifacts.elastic.co/downloads/logstash/logstash-6.6.2.tar.gz
  
2.解压 tar -zxvf logstash-6.6.2.tar.gz -C /Application/

3.测试
  建两个不同的实例 采集端 /Application/logstash-6.6.2-test1/  存储端 /Application/logstash-6.6.2-test2/
3.1 接收控制台输入,Logstash解析输出到控制台
    cd /Application/logstash-6.6.2-test1/
    bin/logstash -e 'input { stdin { } } output { stdout {} }'  #第一次输入会报一些其他信息,再发送一些数据就可以了

3.2 把命令放到文件中使用, 控制台输入,输出至控制台 
在testFile目录下创建 std_test.conf 文件,添加内容:

input {
     stdin{
     }
 }
 output {
     stdout{
     }
 }bin/logstash -f /Application/logstash-6.6.2-test1/testFile/std_test.conf

3.3 采集监控目录变化,输出到控制台
也可以监控整个目录,对目录名做匹配  path => "/Application/testData/*"
也支持多个目录监控

vi test.conf
 input {
     file{
         path => "/Application/testData/test.txt"
     }
  }
 output {
      stdout {}
  }bin/logstash -f /Application/logstash-6.6.2-test1/testFile/std_test.conf

echo "hello word" >> /Application/testData/test.txt   第一次发送的数据丢失:原因是Logstash启动时间长,没有等到它启动就开始发送第一条数据了

3.4 采集监控目录变化,socket传输输出到端口号; 另一个logsatsh监控端口号,输出到控制台
----第一次测试: 发现数据是多行合并传输,没有换行,且合并的数据中包含message,host,path,port等信息
采集端:

input {
     file{
         path => "/Application/testData/*"
     }
 }
 output {
     tcp{
     host => "192.168.1.210"
     port => 6777
     codec => json
     }
 }

存储端:

input {
     tcp{
         host => "192.168.1.210"
         port => "6777"
     }
 }
 output {
     stdout{
     }
 }

-----------第二次测试: 使用codec插件,选用json_lines. 并且在采集端input时使用multiline,合并非固定开头的混淆行数据
可以看一下json_lines json line 的区别. 输入输出是有区别的.
最终 采集端tcp codec json_lines; 存储端input 设置json_lines   output中使用 codec => line { format => "%{message}"} 只提取message

采集端:

input {
     file{
            path => "/Application/testData/*"
            codec=>multiline  {
                    pattern => "^\d{2}"
                    auto_flush_interval => 2
                    negate => true
                    what => "previous"
            }
            ignore_older=>0
     }
 }
 output {
     tcp{
     host => "192.168.1.210"
     port => 6777
     codec => json_lines
     }
 }

存储端:

input {
     tcp{
         host => "192.168.1.210"
         port => "6777"
         codec => json_lines
     }
 }
 output {
     file{
          path => "/Application/testSave/%{+YYYY-MM-dd}-log.gz"
          codec => line { format => "%{message}"}
          gzip => true
     }
 }

----ERROR汇总
1.

tar: /Application: Not found in archive
 tar: Exiting with failure status due to previous errors


原因是: tar后面忘记加 -C 这个参数了

2.could not find java; set JAVA_HOME or ensure java is in PATH
  发现有一台没有装Java,懒得装了,直接在一台服务器上使用两个实例
  
3.采集和存储两端 有警告. 原因: 两端的对接应该为相同的结构  codec应该设置为相同的

[WARN ][logstash.codecs.jsonlines] JSON parse error, original data now in message field {:error=>#<LogStash::Json::ParserError: Unexpected character ('-' (code 45)): Expected space separating root-level values