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