Docker部署ELK 8.8.2(5)-logstash filter & kibana数据展示

一、syslog数据展示


1.1表格展示


logstash的syslog input自动将syslog的日志做了处理,因此这里先介绍syslog input的数据添加。

Visualize Library-创建数据视图


我们希望只关联syslog日志,因此配置如下
名称:可以随意命名
索引模式:logstash-syslog-*    匹配以logstash-syslog-开头的所有索引
时间戳字段:@timestamp        通过filebeat采集日志,filebeat会添加时间戳,logstash直接接收的syslog,logstash也会添加时间戳


Discover

 
现在只有一个数据视图,已经默认选中了刚刚创建的数据视图,点击查看所有匹配项后,会列出一个表格,可以在左侧可用字段中点击添加将希望展示的列添加到表格中
这里添加了syslog日志中常用字段:时间、日志级别、主机名、主机IP、日志类型、服务类型、进程名称、进程ID、日志信息

也可以直接搜索字段名,然后添加字段到表格,或从表格删除字段

表格列头的按钮可以操作向左/向右移动列、删除列等

可以点击某个字段后的加、减按钮进行筛选、取消筛选操作

例如:筛选所有级别为Notice的日志

 也可以手动添加更复杂的过滤条件,条件支持and、or组合

 也可以直接在搜索框搜索,输入字段名称会有相应搜索提示

例如可疑用“字段名:值”搜索进程ID等于1的日志

 点击页面右上角保存按钮,将调整好的表格视图保存,为了便于区分,这里保存的名称是syslog-table。

 

1.2 图形展示


Visualize Library

 新建可视化

 点击基于聚合,我们创建一些常见的简单图形了解Kibana对Elasticsearch数据的展示


选择饼图-创建一个展示syslog不同日志级别占比及数量的饼图

 这里可以选择索引,也可以选择我们上一步创建的表格视图syslog-table,我们并没有在syslog-table中排除一些数据,所以选择syslog-table和选择logstash-syslog索引,获取的数据都一样。

 

存储桶这里,选择基于“词”,字段选择“日志级别名称关键字”,点击更新,可以看到已经按照不同的日志级别做了展示,可以直观的看到不同日志级别的数量占比,鼠标放上去可以看到占比数字和具体日志数量。
保存

 新建仪表板,将饼图命名为syslog-bingtu添加到新建的仪表板

可以看到仪表板中只有一个刚刚的饼图,点击从库中添加

 我们再把之前创建的syslog-table添加过来

 可以拖动调整每个组件的位置、大小

可以根据需要再添加更多的图形,这里仅展示操作步骤,不再添加更多图形,将仪表板保存

 

二、logstash filter


syslog的日志logstash已经自动做了处理,所以直接在Kibana中添加索引,选择日志字段进行展示即可。
但如果logstash没有对日志做处理,日志只是message字段的一条信息,这时我们就需要使用logstash的filter将message中的数据转化为我们可以直观查看的日志字段,logstash有很多filter插件,这里只介绍常用的grok和mutate

grok的pattern可以从github下载
https://github.com/logstash-plugins/logstash-patterns-core/tree/main/patterns
点击ecs-v1

点击grok-patterns

可以看到支持的pattern,也可以自定义pattern,在filter调用时指定pattern所在目录

 

我们先把nginx的配置文件改一下,指定error日志的路径到宿主机目录
[root@kylin ~]# vi /usr/local/nginx/nginx/nginx.conf
error_log  /var/log/error.log notice;

 

重启nginx容器生效
[root@kylin ~]# docker restart nginx

进入filebeat目录,修改filebeat配置文件,采集access日志和error日志
[root@kylin ~]# cd filebeat/
[root@kylin filebeat]# vi filebeat.yml
[root@kylin filebeat]# cat filebeat.yml
filebeat.inputs:
- type: filestream
  paths:
    - /usr/local/nginx/log/access.log*
  fields_under_root: true
  fields:
    logtype: "nginx-access"
  ignore_older: 72h

- type: filestream
  paths:
    - /usr/local/nginx/log/error.log*
  fields_under_root: true
  fields:
    logtype: "nginx-error"
  ignore_older: 72h

processors:
  - add_host_metadata: ~
  - drop_fields:
     fields: ["host.hostname", "host.os", "host.architecture", "host.id", "host.mac", "host.containerized", "agent", "ecs", "input"]

output.logstash:
  hosts: ["192.168.80.50:5044"]


在后台运行filebeat,且使用nohup将输出信息重定向到文件
[root@kylin filebeat]# nohup ./filebeat -e -c filebeat.yml &

 
进入nginx日志所在目录
[root@kylin ~]# cd /usr/local/nginx/log/
访问nginx触发几条日志,查看access日志
[root@kylin log]# tail -n 1 access.log 
192.168.80.1 - - [06/Jul/2023:13:43:31 +0000] "GET /login HTTP/1.1" 404 555 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36" "-"


打开kibana-卡法工具-Grok Debugger
样例数据:复制我们看到的nginx access日志到这里
Grok模式:这里使用grok pattern匹配日志对应信息,书写格式为%{pattern:自定义字段名}
这里按照如下配置
%{IPORHOST:sourceip} - %{DATA:username} \[%{DATA:time}\] \"%{WORD:http_method} %{DATA:request_url} HTTP/%{NUMBER:http_version}\" %{NUMBER:response_code} %{NUMBER:body_bytes_sent]} \"%{DATA:http_referer}\" \"%{DATA:http_user_agent}\" \"%{DATA:http_x_forwarded_for}\"

点击模拟,可以看到从样例数据中使用grok解析出的日志


同理写error日志的pattern,访问nginx不存在的一个url,触发错误日志
[root@kylin log]# tail error.log 
2023/07/06 13:54:13 [notice] 1#1: nginx/1.21.5
2023/07/06 13:54:13 [notice] 1#1: built by gcc 10.2.1 20210110 (Debian 10.2.1-6) 
2023/07/06 13:54:13 [notice] 1#1: OS: Linux 4.19.90-24.4.v2101.ky10.x86_64
2023/07/06 13:54:13 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1073741816:1073741816
2023/07/06 13:54:13 [notice] 1#1: start worker processes
2023/07/06 13:54:13 [notice] 1#1: start worker process 23
2023/07/06 13:54:13 [notice] 1#1: start worker process 24
2023/07/06 13:54:13 [notice] 1#1: start worker process 25
2023/07/06 13:54:13 [notice] 1#1: start worker process 26
2023/07/06 13:54:33 [error] 23#23: *1 open() "/usr/share/nginx/html/login" failed (2: No such file or directory), client: 192.168.80.1, server: localhost, request: "GET /login HTTP/1.1", host: "192.168.80.50"

 

grok模式:error日志的grok如下

%{DATA:time} \[%{LOGLEVEL:loglevel}\] %{NUMBER:error_pid}#%{NUMBER:error_tid}: (\*%{NUMBER:error_connection_id}) %{GREEDYDATA:error_message}, client: %{IP:sourceip}, server: %{DATA:dest_hostname}, request: \"%{WORD:http_method} %{DATA:request_url} HTTP/%{NUMBER:http_version}\", host: \"%{IPORHOST:destinationip}\"

 之前介绍过,我们可以在开发工具中访问指定索引,查看索引内日志数据,我们可以看到日志中有一些没什么作用的字段,logstash也可以像filebeat一样添加、移除字段

进入logstash pipeline目录,修改filebeat对应的的pipeline
[root@kylin ~]# cd /usr/local/logstash/pipeline/filebeat/

 

如果logtype等于nginx-access
if [logtype] == "nginx-access" 
使用grok去提取message字段的数据,双引号内写上kibana开发工具测试完毕的grok
grok {
            match => { "message" => "" }

logtype不是nginx-access时,会继续匹配是不是nginx-error,是nginx-error则执行error日志的grok
else if [logtype] == "nginx-error"
最后使用mutate移除一些不需要的字段
mutate {
        remove_field

所有配置如下
[root@kylin filebeat]# cat logstash-filebeat.conf
input {
  beats {
    port => 5044
  }
}

filter {
    if [logtype] == "nginx-access" {
        grok {
            match => { "message" => "%{IPORHOST:sourceip} - %{DATA:username} \[%{DATA:time}\] \"%{WORD:http_method} %{DATA:request_url} HTTP/%{NUMBER:http_version}\" %{NUMBER:response_code} %{NUMBER:body_bytes_sent]} \"%{DATA:http_referer}\" \"%{DATA:http_user_agent}\" \"%{DATA:http_x_forwarded_for}\"" }
        }
    } else if [logtype] == "nginx-error" {
        grok {
            match => { "message" => "%{DATA:time} \[%{LOGLEVEL:loglevel}\] %{NUMBER:error_pid}#%{NUMBER:error_tid}: (\*%{NUMBER:error_connection_id}) %{GREEDYDATA:error_message}, client: %{IP:sourceip}, server: %{DATA:dest_hostname}, request: \"%{WORD:http_method} %{DATA:request_url} HTTP/%{NUMBER:http_version}\", host: \"%{IPORHOST:destinationip}\""}
        }
    }
    mutate {
           remove_field => ["timestamp", "@version", "event", "tags"]
        remove_field => ["@version"]
    }
}

output {
    elasticsearch {
        hosts => ["https://192.168.80.50:9200"]
        index => "logstash-filebeat-%{+YYYY.MM.dd}"
        user => "elastic"
        password => "123456"
        ssl_verification_mode => none
    }
}


重启logstash
[root@kylin filebeat]# docker restart logstash

 

在kibana开发工具查看filebeat索引,可以看到nginx access日志已经解析成我们需要的字段,可以使用kibana的表格和各种图形化来搜索、展示日志字段的信息了

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值