ELK日志采集系统构建实战讲解,让小伙伴更深入的理解ELK。
1、首先确保服务器已经运行了 ES 集群


2、确保服务器上已经安装部署了 logstash

3、在 Logstash 安装路径下的 config 目录中,新建一个 conf 文件,取名为 es_log.conf,并且填入以下内容:

input {
file {
path => "/home/elk/elk/teaching/elasticsearch-7.7.0/logs/my-elk.log"
start_position => "beginning"
codec => multiline {
pattern => "^\["
negate => truewhat => "previous"
}
}
}
output {
elasticsearch {
hosts => ["http://172.18.194.140:9200"]
index => "es-log-%{+YYYY.MM.dd}"
}
stdout{}
}
4、进入 Logstash 的 bin 目录执行 ./logstash -f ../config/es_log.conf
5、控制台会输出:

6、我们到浏览器查询:

发现 ES 中确实创建了一个索引 es-log-2020.07.08
7、在 ES 中查询这个索引的内容

8、仔细检查存入的日志内容,发现日志信息是作为整体存入 message 字 段的:

有没有办法存入的更细粒些呢?
9、仔细分析 es 的日志,呈现了一定的结构化特征:

总是: “[时间戳][日志级别][输出信息的类名][节点名]具体的日志信息 ”这种格式,所以我们完全可以考虑使用过滤器插件对文本进行分析后再存 入 es,怎么分析?可以用 grok 过滤器。
10、 在 Logstash 安装路径下的 config 目录中,新建一个 conf 文件,取名 为 log_grok.conf,并且填入以下内容:
input {
file {
path => "/home/elk/elk/teaching/elasticsearch-7.7.0/logs/my-elk.log"
start_position => "beginning"
codec => multiline {
pattern => "^\["
negate => true
what => "previous"
}
}
}
filter{
grok {
match => {message =>
"\[%{TIMESTAMP_ISO8601:time}\]\[%{LOGLEVEL:level}%{SPACE}\]\[%{NOT
SPACE:loggerclass}%{SPACE}\]%{SPACE}\[%{DATA:nodename}\]%{SPACE}
%{GREEDYDATA:msg}"
}
}
}
output {
stdout{}
}
11、如果担心自己写的 conf 有语法问题,可以执行 ./logstash -f xxxxxxx.conf -t 检查 conf,当然只能检查语法,不能检查诸如
正则表达式是否正确这类问题。
12、执行./logstash -f ../config/log_grok.conf,如果发现程序没有输出,有 可能是 elk 的日志文件已经被处理过,logstash 不会重复处理,这时可以到 logstash 的/data/plugins/inputs/file 目录下,删除.sincedb 文件(这个文件是个 隐藏文件),再执行。

可以看见,每条日志已经成功的被解析了。
13、现在考虑如何存入 es,按照原来的
定义好索引的 mapping(映射),注意要和我们对日志的分解一一对应。
14、创建一个新的 conf 文件,取名 es_log_grok.conf,内容如下:
input {
file {
path => "/home/elk/elk/teaching/elasticsearch-7.7.0/logs/my-elk.log"
start_position => "beginning"
codec => multiline {
pattern => "^\["
negate => true
what => "previous"
}
}
}
filter{
grok {
match => {
message =>
"\[%{TIMESTAMP_ISO8601:time}\]\[%{LOGLEVEL:level}%{SPACE}\]\[%{NOT
SPACE:loggerclass}%{SPACE}\]%{SPACE}\[%{DATA:nodename}\]%{SPACE}
%{GREEDYDATA:msg}"
}
}
}
output {
elasticsearch {
hosts => ["http://172.18.194.140:9200"]
index => "es-log-text-%{+YYYY.MM.dd}"
template_name => "es_template*"
template => "/home/elk/elk/teaching/logstash-7.7.0/config"
}
stdout{}
}
主要是在 elasticsearch 插件中增加了对刚才新增的 json 文件的读取。
15、执行./logstash -f ../config/es_log_grok.conf,会看到控制台的输出,同 时在浏览器中,也会看到解析后的日志:
ELK实战demo到此结束,下一篇我们分析es的性能优化策略,敬请期待。