ELK-LogStash配置解析
1、配置解析
1.1、目录结构
root@logstash:~# tree -L 1 /etc/logstash/ /etc/logstash/ ├── conf.d # 子配置的目录 ├── jvm.options # java相关的配置文件 ├── log4j2.properties # 日志的输出格式 ├── logstash-sample.conf # logstash 的模板文件 ├── logstash.yml # logstash的主配置文件 ├── pipelines.yml # 流水线配置参数 └── startup.options # 启动参数
1.2、配置结构组成
root@logstash:~# cat /etc/logstash/logstash.yml | grep '\-\-\-' # ------------ Node identity ------------ # ------------ Data path ------------------ # ------------ Pipeline Settings -------------- # ------------ Pipeline Configuration Settings -------------- # ------------ API Settings ------------- # ------------ Module Settings --------------- # ------------ Cloud Settings --------------- # ------------ Queuing Settings -------------- # ------------ Dead-Letter Queue Settings -------------- # ------------ Debugging Settings -------------- # ------------ Other Settings -------------- # ------------ X-Pack Settings (not applicable for OSS build)-------------- # 在这么多配置项中,我们一般关注比较多的是Node、Data path、Pipeline,我们可以基于实际的主机环境来调整相关参数
1.3、核心配置
1.3.1、默认的配置示例
root@logstash:~# cat /etc/logstash/logstash-sample.conf | grep -Ev '^$|#' input { beats { port => 5044 } } output { elasticsearch { hosts => ["http://localhost:9200"] index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}" } }
1.3.2、属性解析
logstash 的配置主要有各种插件功能组成,默认配置文件中使用了两个插件input和output
input设置的内容是从5044端口从 beats中获取数据
output设置的内容是将数据输从到elasticsearch中
hosts 用于设定elasticsearch的连接地址
index 用于设定数据存储到elasticsearch中的时候,数据的索引定义格式,索引的名称可以基于字符串也可以基于变量的方式来设定,@metadata 表示数据的属性信息,[beat] 表示从元属性信息中获取heat属性的值
user 当elasticsearch存在认证信息的时候,输入用户名
password 当elasticsearch存在认证信息的时候,输入与用户名匹配的密码信息。
2、插件
2.1、插件信息
查看logstash默认支持的插件 ]$ logstash-plugin list --verbose ]$ logstash-plugin list | wc -l 113 结果显示: logstash默认支持105个插件,包含五大类: codec 编解码相关插件 filter 过滤规则相关插件 input 输入信息相关插件 output 输出相关插件 patterns 模式相关插件
2.2、插件功能
我们知道对于logstash来说,他的三大内容就是 input、filter、output,filter的主要作用就是对接受的数据进行筛选,将筛选后的符合条件的数据传输到对应的数据存储目标中,对于logstash7来说, 它支持46种过滤功能插件,满足我们各种场景的数据筛选和精确分析工作,我们在kibana中展示数据的时候,直接忽略掉无效数据,提高分析效率。 常见的工作场景: 正则匹配-grok、时间处理-date、数据修改-mutate、 地址查询-geoip、编解码-json、数值统计-metrics等
3、codec实践
3.1、简介
Codec 是 logstash 从 1.3.0 版开始新引入的概念(Codec 来自 Coder/decoder 两个单词的首字母缩写)。在此之前,logstash 只支持纯文本形式输入,然后以过滤器处理它。按照我们之前的理解 logstash其实仅仅是一个按照 input-filter-output 方式处理的数据流,当我们了解codec的作用之后,我们就会知道,一个完整的logstash其实是按照 input-decode-filter-encode-output 方式来处理的数据流。 对于7版本的logstash来说,他的codec支持25+种编解码的插件,在input中的编码插件中,我们用的最多的就是json,而在output中的编码插件用的比较多的仅仅是调试用的rubydebug。接下来我们主要以json和rubydebug的方式来演示。
3.2、stdout配置解析
3.2.1、配置
input { beats { port => 5044 codec => json } } output { stdout { codec => json|rubydebug } }
3.2.2、解析
注意: beats 表示我们从beats组件中接收传输过来的数据 port 表示logstash与beats对接的端口是5044 codec 用于输入数据的编解码器,默认是plain-单行字符串,若设置为json,表示按照json方式解析 rubydebug 一般会与output的stdout结合起来使用,表示信息的调试。
3.3、示例1-接收filebeat传输的json格式数据,并在当前屏幕上展示效果
3.3.1、配置filebeat.yml
cat << 'CAT_END' > my_nginx_json.yml filebeat.inputs: - type: log id: nginx_access_json enabled: true paths: - /var/log/nginx/access_json.log fields: log_type: "access" fields_under_root: true json.keys_under_root: true json.overwrite_keys: true - type: log id: nginx_error enabled: true paths: - /var/log/nginx/error.log fields: log_type: "error" fields_under_root: true output.logstash: hosts: ["192.168.10.28:5044"] CAT_END # 启动filebeat配置文件 filebeat -e -c my_nginx_json.yml
3.3.2、配置logstash配置文件
cat << 'CAT_END' > my_nginx_logstash.yml input { beats { port => 5044 codec => json } } output { stdout { codec => rubydebug } } CAT_END # 启动logstash测试 logstash -f my_nginx_logstash.yml
3.3.3、刷新nginx查看日志
[WARN ] 2023-06-07 20:44:57.759 [defaultEventExecutorGroup-4-1] json - Relying on default value of `pipeline.ecs_compatibility`, which may change in a future major release of Logstash.
To avoid unexpected changes when upgrading Logstash, please explicitly declare your desired ECS Compatibility mode. { "tags" => [ [0] "beats_input_raw_event" ], "http_referrer" => "-", "@timestamp" => 2023-06-07T12:44:56.666Z, "agent" => { "name" => "filebeat", "type" => "filebeat", "hostname" => "filebeat", "version" => "7.17.10", "ephemeral_id" => "173cebe8-afb2-4b63-bde6-d2c1d6fccaa1", "id" => "c90b2a4b-82fd-4113-a77b-91a6073867eb" }, "request_time" => "0.000", "http_x_real_ip" => "-", "http_x_forwarded_for" => "-", "host" => { "name" => "filebeat" }, "remote_addr" => "192.168.10.1", "status" => "304", "@version" => "1", "input" => { "type" => "log" }, "remote_user" => "-", "ecs" => { "version" => "1.12.0" }, 结果显示: 我们将filebeat所有格式的数据都接收了,不仅能够按照定制的格式显示,还有我们增加的扩展字段。
3.4、示例2-将收集到的不同格式数据,传输到不同的es索引中
3.4.1、配置if语法
我们的数据有扩展字段,可以基于这个扩展字段将,数据识别出来,然后借助于logstash的if语句对 elasticsearch输出组件进行定制索引,格式如下: output { if [字段名] == "属性值1"{ elasticsearch { hosts => ["master.itcast.com:9200"] index => "索引名1" } } if [字段名] == "属性值2"{ ... } } 属性解析: == 是字符串的比较条件
3.4.2、logstash配置
cat << 'CAT_END' > my_nginx_logstash.yml input { beats { port => 5044 codec => json } } output { if [log_type] == "access" { elasticsearch { hosts => ["192.168.10.25:9200"] index => "my-nginx-access-%{+yyyy.MM.dd}" } } if [log_type] == "error"{ elasticsearch { hosts => ["192.168.10.25:9200"] index => "my-nginx-error-%{+yyyy.MM.dd}" } } } CAT_END
# 启动logstash测试 logstash -f my_nginx_logstash.yml
3.4.2、配置filebeat.yml
cat << 'CAT_END' > my_nginx_json.yml filebeat.inputs: - type: log id: nginx_access_json enabled: true paths: - /var/log/nginx/access_json.log fields: log_type: "access" fields_under_root: true json.keys_under_root: true json.overwrite_keys: true - type: log id: nginx_error enabled: true paths: - /var/log/nginx/error.log fields: log_type: "error" fields_under_root: true setup.template.settings: index.number_of_shards: 5 index.number_of_replicas: 1 output.logstash: hosts: ["192.168.10.28:5044"] CAT_END # 启动filebeat配置文件 filebeat -e -c my_nginx_json.yml
3.4.3、访问nginx查看效果