作者:lao6345790 | 来源:互联网 | 2023-06-11 15:20
原文地址,转载请注明出处:https://blog.csdn.net/qq_34021712/article/details/79502672 ©王赛超
谈到ELK,说起日志传输,首先想到的就是Logstash,Logstash主要的优点就是它的灵活性,这还主要因为它有很多插件。丰富的输入插件可以采集各种样式、大小和来源的数据。丰富的过滤插件可以实时解析和转换数据,能够动态地转换和解析数据,不受格式或复杂度的影响,Logstash 提供众多输出选择,您可以将数据发送到您要指定的地方,并且能够灵活地解锁众多下游用。
Logstash致命的问题是它的性能以及资源消耗(默认的堆大小是 1GB)。尽管它的性能在近几年已经有很大提升,与它的替代者们相比还是要慢很多的。如果服务器性能较差,并不推荐为每个服务器安装 Logstash ,这样就需要一个轻量的日志传输工具,将数据从服务器端经由一个或多个 Logstash 中心服务器传输到 Elasticsearch。
FileBeat介绍
Filebeat是一个轻量级的日志传输工具,它的存在正弥补了,Logstash的缺点:Filebeat作为一个轻量级的日志传输工具可以将日志推送到Logstash 或者缓冲池中。
详细参考官网介绍:https://www.elastic.co/cn/products/beats/filebeat
FileBeat的配置文件官网地址
下载
https://www.elastic.co/downloads/beats/filebeat点击LINUX 64-BIT下载,linux64位tar包。
安装
①解压tar -zxvf filebeat-6.2.2-linux-x86_64.tar.gz
②重命名
mv filebeat-6.2.2-linux-x86_64 filebeat
环境介绍
主机 | 安装软件 | 收集日志 |
172.20.1.186 | filebeat,Kibana | 系统日志和es日志 |
172.20.1.187 | Logstash,Elasticsearch+head插件 | 收集各个节点filebeat日志 |
使用的软件版本为:Elasticsearch6.2+Logstash6.2+Kibana6.2+FileBeat6.2ElasticSearch6.2单机安装Elasticsearch-head插件安装Logstash6.2单机安装Kibana6.2安装使用
FileBeat+Logstash配置过程
①为什么通过使用SSL 编辑保护与Logstash的通信?
数据在远程传输过程中,可能被劫持和获取,继而造成的后果是数据信息泄露,那么如何有效的进行数据传输呢,您可以使用SSL相互身份验证来保护Filebeat和Logstash之间的连接。这可确保Filebeat仅将加密数据发送到受信任的Logstash服务器,并确保Logstash服务器仅从受信任的Filebeat客户端接收数据。
②生成密钥
在172.20.1.186(Filebeat所在服务器)上执行下面命令生成秘钥,为了区分,生成文件后面加个186来区分服务器:openssl req -subj '/CN=172.20.1.186/' -x509 -days $((100 * 365)) -batch -nodes -newkey rsa:2048 -keyout /etc/pki/tls/private/filebeat186.key -out /etc/pki/tls/certs/filebeat186.crt
在172.20.1.187(Logstash所在的服务器)上执行下面命令生成秘钥:
openssl req -subj '/CN=172.20.1.187/' -x509 -days $((100 * 365)) -batch -nodes -newkey rsa:2048 -keyout /etc/pki/tls/private/logstash.key -out /etc/pki/tls/certs/logstash.crt
使用以下命令将172.20.1.186上生成的FileBeat秘钥拷贝到Logstash所在的服务器上:
scp /etc/pki/tls/certs/filebeat186.crt root@172.20.1.187:/etc/pki/tls/certs/
使用以下命令将172.20.1.187上生成的Logstash秘钥拷贝到FileBeat所在的服务器上:
scp /etc/pki/tls/certs/logstash.crt root@172.20.1.186:/etc/pki/tls/certs/
③配置Filebeat
先使用 echo "" > filebeat.yml 将配置文件清空,因为里面有很多的注释,看起来很乱。
172.20.1.186(Filebeat)配置文件修改为:filebeat.prospectors:
- type: log#设置为true使该配置生效enabled: truepaths:#收集日志路径,多个往下继续写就可以了- /var/log/messagesfields:#自定义属性,用来区分不通服务器上的日志log_source: 172.20.1.186-system
- type: logenabled: truepaths:- /usr/local/elk/elasticsearch/logs/es6.2.logfields:log_source: 172.20.1.186-es#下面三个属性配置根据[ 将java异常堆栈收集为一条消息,也可以logstash中配置multiline.pattern: '^\['multiline.negate: truemultiline.match: after#该属性可以配置只收集error级别和warn级别的日志,如果有配置多行收集,一定要将这个配置放在多行的后面include_lines: ['ERROR','WARN']#该属性配置不收集DEBUG级别的日志,如果配置多行 这个配置也要放在多行的后面exclude_lines: ['DEBUG']
output.logstash:#如果是多个logstash将下面三条属性打开#hosts: ["localhost:5044", "localhost:5045"]#loadbalance: true#worker: 3hosts: ["172.20.1.187:5044"]#这个index的值也可以自定义,用来修改@metadata[beat]值,默认是filebeatindex: "filebeat"ssl.certificate_authorities: ["/etc/pki/tls/certs/logstash.crt"]ssl.certificate: "/etc/pki/tls/certs/filebeat186.crt"ssl.key: "/etc/pki/tls/private/filebeat186.key"
配置解释:
type: log 读取日志文件的每一行(默认)
enabled: true 该配置是否生效,如果改为false,将不收集该配置的日志
paths: 要抓取日志的全路径
fields: 自定义属性,可以定义多个,继续往下排就行
multiline.pattern: 正则表达式
multiline.negate: true 或 false;默认是false,匹配pattern的行合并到上一行;true,不匹配pattern的行合并到上一行
multiline.match: after 或 before,合并到上一行的末尾或开头
include_lines: ['ERROR','WARN'] 该属性可以配置只收集error级别和warn级别的日志,如果有配置多行收集,一定要将这个配置放在多行的后面
exclude_lines: ['DEBUG'] 该属性配置不收集DEBUG级别的日志,如果配置多行 这个配置也要放在多行的后面
hosts: Logstash所在的主机
loadbalance: 如果设置为TRUE和配置了多台logstash主机,输出插件将负载均衡的发布事件到所有logstash主机。如果设置为false,输出插件发送所有事件到随机的一台主机上,如果选择的不可达将切换到另一台主机。默认是false。
worker: 每个配置的主机发布事件到Logstash的工作者数量。这最适用于启用负载平衡模式。示例:如果您有2个主机和3个工作人员,则共有6个工作人员启动(每个主机3个)。
ssl.certificate_authorities: CA 证书,即用来签署证书的证书。这里表示配置 Filebeat 使其信任所有由该 CA 证书发行的证书。因为自签名证书的发行者和证书主体相同,所以这里直接使用 Logstash 证书使 Filebeat 信任使用该证书的 Logstash server
ssl.certificate & ssl.certificate_key: Filebeat 证书和 key 文件。Filebeat 将使用它们向 Logstash server 证明自己的可信身份。
④配置Logstash
172.20.1.189(Logstash)配置:vim logstash.conf
input { beats { port => 5044 ssl => true #如果收集多个filebeat日志,用逗号隔开配置#["/etc/pki/tls/certs/filebeat186.crt","/etc/pki/tls/certs/filebeat181.crt"]ssl_certificate_authorities => ["/etc/pki/tls/certs/filebeat186.crt"] ssl_certificate => "/etc/pki/tls/certs/logstash.crt" ssl_key => "/etc/pki/tls/private/logstash.key" ssl_verify_mode => "force_peer" }
} output { elasticsearch { hosts => ["http://172.20.1.187:9200"] #默认使用[@metadata][beat]来区分不同的索引,也就是filebeat中配置的index字段 #index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}" #我使用自定义fields字段来区分不同的索引 index => "%{[fields][log_source]}-%{[@metadata][version]}-%{+YYYY.MM.dd}" } }
ssl_verify_mode: force_peer将使服务器要求客户提供证书。如果客户端没有提供证书,连接将被关闭
logstash中如何获取filebeat中添加的fields字段:
%{[fields][添加的字段名]}
⑤启动ELK+FileBeat
#FileBeat控制台启动方式
./filebeat -e -c filebeat.yml -d "publish"
控制台报以下异常:
ERROR pipeline/output.go:74 Failed to connect: x509: cannot validate certificate for 172.20.1.187 because it doesn't contain any IP SANs
解决办法:
删除之前的logstash证书,然后编辑logstash所在的服务器 vim /etc/pki/tls/openssl.cnf
找到 [ v3_ca ]
加入下边一行:
subjectAltName = IP:172.20.1.187(前面的两个大写字母IP要带上,后面的地址为logstash所在的ip)
然后再将重新生成的logstash的证书,重新拷贝到filebeat所在的服务器。之前生成的Filebeat证书不用动。
⑥重新启动ELK+FileBeat
之后就可以在Elasticsearch-head插件中看到有两个新的索引创建了。
我们可以使用下面的命令往Elasticsearch的日志文件中输入一句话测试一下
echo "我是王赛超" > /usr/local/elk/elasticsearch/logs/es6.2.log
然后看FIleBeat的控制台打印
Kibana中也可以搜索到该日志信息:
测试FileBeat的java异常收集,为了方便测试直接修改FileBeat本机上安装的elasticsearch配置文件中的network.host: 0.0.0.0.0 然后日志中报以下异常然后在Kibana中也可以搜索到该日志信息,FileBeat已将java异常多行收集为同一个日志时间: