一、logstash pipeline介绍
Logstash的核心是pipeline,包含两个必需的元素,输入(inputs)和输出(outputs),以及一个可选的元素,过滤器(filters)。输入插件使用来自源的数据,过滤器插件根据过滤规则修改数据,输出插件将数据写入目的地。
二、logstash容器创建
pull镜像
docker pull docker.elastic.co/logstash/logstash:8.8.2
创建容器 docker run -itd --name logstash docker.elastic.co/logstash/logstash:8.8.2
创建用于映射容器目录的宿主机目录
mkdir -p /usr/local/logstash
拷贝logstash容器文件到宿主机目录
docker cp logstash:/usr/share/logstash/config /usr/local/logstash/
docker cp logstash:/usr/share/logstash/pipeline /usr/local/logstash/
删除容器
docker rm -f logstash
重新创建logstash容器,并映射宿主机目录,映射5044端口接收filebeat日志,映射514端口接收syslog日志 docker run -itd --name logstash -p 5044:5044 -p 514:514 -v /usr/local/logstash/config:/usr/share/logstash/config -v /usr/local/logstash/pipeline:/usr/share/logstash/pipeline docker.elastic.co/logstash/logstash:8.8.2
三、接收filebeat日志
进入宿主机映射的logstash目录,目录下有config配置文件目录和pipeline配置文件目录
cd /usr/local/logstash/
查看配置文件config目录,重点查看pipelines.yml配置
ll config/
cat config/pipelines.yml
下面配置的意思是,pipeline的配置文件在/usr/share/logstash/pipeline目录
path.config: "/usr/share/logstash/pipeline"
由于我们将/usr/share/logstash/pipeline目录映射到了宿主机/usr/local/logstash/pipeline目录,所以我们直接查看宿主机目录
[root@kylin logstash]# ll pipeline/
查看目录下的配置文件,使用5044端口接收beats的日志(可以是各种beat,filebeat、metricbeat、winlogbeat等),使用stdout标准输出显示接收到的日志
[root@kylin logstash]# cat pipeline/logstash.conf
创建一个nginx容器,用filebeat采集日志发送给logstash
创建nginx容器
[root@kylin ~]# docker run -itd --name nginx -p 80:80 nginx
626c82719d6e59f2647a3c5ac1f6290062f93cf54f3e3bedb53c92ad07e1d1ea
进入容器,确认一下配置文件和日志文件所在目录
[root@kylin ~]# docker exec -it nginx bash
root@626c82719d6e:/# ls /etc/nginx/
conf.d fastcgi_params mime.types modules nginx.conf scgi_params uwsgi_params
root@626c82719d6e:/# ls /var/log
apt btmp dpkg.log faillog lastlog nginx wtmp
root@626c82719d6e:/# exit
exit
在宿主机创建目录,映射给nginx容器使用
[root@kylin ~]# mkdir /usr/local/nginx
将nginx容器的配置目录和日志模板复制到宿主机
[root@kylin ~]# docker cp nginx:/etc/nginx /usr/local/nginx
Successfully copied 16.9kB to /usr/local/nginx
[root@kylin ~]# docker cp nginx:/var/log /usr/local/nginx
Successfully copied 108kB to /usr/local/nginx
nginx容器对日志目录需要有写入权限,这里加一下权限
[root@kylin ~]# chmod -R 777 /usr/local/nginx/log/
删除容器
[root@kylin ~]# docker rm -f nginx
nginx
修改nginx配置文件,指定访问日志存储位置,改到/var/log/access.log,相当于宿主机的/usr/local/nginx/log/access.log
[root@kylin ~]# cd /usr/local/nginx/nginx/
[root@kylin nginx]# vi nginx.conf
[root@kylin nginx]# cat nginx.conf | grep access.log
access_log /var/log/access.log main;
重新创建nginx容器,映射宿主机目录
[root@kylin ~]# docker run -itd --name nginx -p 80:80 -v /usr/local/nginx/nginx:/etc/nginx -v /usr/local/nginx/log:/var/log nginx
打开浏览器,访问 http://宿主机IP:80
进入宿主机日志目录
[root@kylin ~]# cd /usr/local/nginx/log/
[root@kylin log]# ls
access.log apt btmp dpkg.log faillog lastlog nginx wtmp
可以看到nginx访问日志
[root@kylin log]# cat access.log
192.168.80.1 - - [06/Jul/2023:04:00:23 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Edg/114.0.1823.67" "-"
Filebeat配置文件修改如下,output指向logstash容器宿主机映射端口
[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
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 ./filebeat -e -c filebeat.yml &
pgrep filebeat 可以查看到filebeat的进程ID,说明filebeat在正常运行
logstash容器的默认配置是标准输出stdout,因此使用docker logs可以查看到标准输出中filebeat发送过来的日志
docker logs -n 100 logstash
四、接收syslog日志
进入logstash配置目录
[root@kylin ~]# cd /usr/local/logstash/config
备份pipeline配置文件
[root@kylin config]# cp pipelines.yml pipelines.yml.bak
编辑pipeline配置文件,删除所有内容,然后指定syslog和filebeat的配置文件目录
[root@kylin config]# vi pipelines.yml
[root@kylin config]# cat pipelines.yml
- pipeline.id: syslog
path.config: "/usr/share/logstash/pipeline/syslog/*.conf"
- pipeline.id: filebeat
path.config: "/usr/share/logstash/pipeline/filebeat/*.conf"
进入pipeline配置文件目录
[root@kylin config]# cd /usr/local/logstash/pipeline/
[root@kylin pipeline]# ls
logstash.conf
创建syslog和filebeat目录
[root@kylin pipeline]# mkdir syslog filebeat
将默认pipeline配置文件分别拷贝给syslog、filebeat使用
[root@kylin pipeline]# cp logstash.conf syslog/
[root@kylin pipeline]# cp logstash.conf filebeat/
删除/usr/local/logstash/pipeline/目录默认pipeline
[root@kylin pipeline]# rm logstash.conf
rm:是否删除普通文件 'logstash.conf'?y
进入syslog目录
[root@kylin pipeline]# cd syslog/
重命名pipeline文件,以便于从文件名就可以知道这是syslog的pipeline配置
[root@kylin syslog]# mv logstash.conf logstash-syslog.conf
4.1 input:tcp方式接收日志
logstash支持多种input,我们使用其中的tcp接收syslog日志
将logstash-syslog.conf pipeline配置中input部分修改为TCP 514端口接收,
[root@kylin syslog]# vi logstash-syslog.conf
[root@kylin syslog]# cat logstash-syslog.conf
input {
tcp {
port => 514
type => syslog
}
}
output {
stdout {
codec => rubydebug
}
}
重启logstash,使刚刚修改的pipeline生效
[root@kylin ~]# docker restart logstash
给宿主机安装rsyslog软件包
[root@kylin ~]# yum install -y rsyslog
配置rsyslog,使用TCP协议,将所有级别日志发送到logstash 514端口(2个@是TCP协议发送,1个@是UDP协议发送,这里logstash使用容器部署,映射的是TCP端口,因此配置为TCP协议发送)
[root@kylin ~]# vi /etc/rsyslog.conf
在配置文件结尾添加一行,*.* @@192.168.80.50:514
[root@kylin ~]# tail -n 1 /etc/rsyslog.conf
*.* @@192.168.80.50:514
重启rsyslog服务
[root@kylin ~]# systemctl restart rsyslog
添加用户的操作会产生日志,我们手动触发一条日志的生成
[root@kylin ~]# useradd test
查看日志输出,可以看到syslog日志
[root@kylin ~]# docker logs -n 100 logstash
4.2 input:syslog方式接收日志
我们也可以使用logstash支持的syslog input接收syslog日志
[root@kylin ~]# vi /usr/local/logstash/pipeline/syslog/logstash-syslog.conf
[root@kylin ~]# cat /usr/local/logstash/pipeline/syslog/logstash-syslog.conf
input {
syslog {
port => 514
}
}
output {
stdout {
codec => rubydebug
}
}
重启logstash,使刚刚修改的pipeline生效
[root@kylin ~]# docker restart logstash
再触发一些日志
[root@kylin ~]# userdel -r test
[root@kylin ~]# useradd test
查看logstash日志输出,可以看到syslog日志
[root@kylin ~]# docker logs -n 100 logstash
相比TCP接收,syslog直接将收到的原始日志(original)做了处理,从中提取出了name(audit日志)、pid(进程pid)等信息,并且添加了日志的级别(Notice)等字段
五、日志发送给elasticsearch
进入pipeline配置目录
[root@kylin ~]# cd /usr/local/logstash/pipeline/
修改syslog pipeline的output,输出到elasticsearch
ssl_verification_mode elasticsearch使用https协议,这里忽略SSL的验证,否则需要配置证书等信息
index => "logstash-syslog-%{+YYYY.MM.dd}" 生成索引,以logstash-syslog-开头,后面是变量,即每天的日志,例如今天是2023年7月6日,生成的索引名为logstash-syslog-2023.07.06
[root@kylin pipeline]# vi syslog/logstash-syslog.conf
[root@kylin pipeline]# cat syslog/logstash-syslog.conf
input {
syslog {
port => 514
}
}
output {
elasticsearch {
hosts => ["https://192.168.80.50:9200"]
index => "logstash-syslog-%{+YYYY.MM.dd}"
user => "elastic"
password => "123456"
ssl_verification_mode => none
}
}
登录Kibana-点击Management
点击索引管理,可以看到logstash的output输出到elasticsearch创建的索引
kibana页面,Management(不用点击Management)下面有个开发工具
左侧输入API请求,点击发送请求按钮,右侧可以看到所有的索引和索引内的数据
GET /_search
也可以直接访问指定索引的数据,例如访问logstash生成的filebeat 7月6号的索引
GET /logstash-filebeat-2023.07.06/_search
同理,访问syslog的索引
GET /logstash-syslog-2023.07.06/_search