一、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的表格和各种图形化来搜索、展示日志字段的信息了