3 Beats 收集数据
Beats 是一些工具集,包括以下,其中 filebeat 应用最为广泛
filebeat:收集日志文件数据。最常用的工具 packetbeat:用于收集网络数据。一般用zabbix实现此功能 metricbeat:从OS和服务收集指标数据,比如系统运行状态、CPU 内存利用率等。 winlogbeat: 从Windows平台日志收集工具。 heartbeat: 定时探测服务是否可用。支持ICMP、TCP 和 HTTP,也支持TLS、身份验证和代理 auditbeat:收集审计日志 Functionbeat:使用无服务器基础架构提供云数据。面向云端数据的无服务器采集器,处理云数据
注意: Beats 版本要和 Elasticsearch 相同的版本,否则可能会出错
3.3 利用 Filebeat 收集日志
Filebeat 是用于转发和集中日志数据的轻量级传送程序。作为服务器上的代理安装,Filebeat监视您指定 的日志文件或位置,收集日志事件,
并将它们转发到Elasticsearch或Logstash进行索引。 Logstash 也可以直接收集日志,但需要安装JDK并且会占用至少 500M 以上的内存 生产一般使用filebeat代替logstash, 基于go开发,部署方便,重要的是只需要10M多内存,比较节约资源. filebeat 支持从日志文件,Syslog,Redis,Docker,TCP,UDP,标准输入等读取数据,对数据做简单处理,
再输出至Elasticsearch,logstash,Redis,Kafka等 #Filebeat 官方说明 https://www.elastic.co/guide/en/beats/filebeat/current/filebeat-overview.html #支持多个源采集,但是只能输出到一个地方,没有强大的数据清理能力
注意: Filebeat 支持多个输入,但不支持同时有多个输出,如果多输出,会报错如下
Exiting: error unpacking config data: more than one namespace configured accessing 'output' (source:'/etc/filebeat/stdout_file.yml')
3.3.1 安装 Filebeat 和配置说明
下载链接 https://www.elastic.co/cn/downloads/beats/filebeat https://mirrors.tuna.tsinghua.edu.cn/elasticstack/8.x/apt/pool/main/f/filebeat/
3.3.1.1 安装 Filebeat
#新版下载 [root@ubuntu ~]#wget https://mirrors.tuna.tsinghua.edu.cn/elasticstack/8.x/apt/pool/main/f/filebeat/filebeat-8.12.2-amd64.deb #安装 [root@ubuntu ~]#dpkg -i filebeat-8.12.2-amd64.deb #配置文件 #[root@ubuntu ~]#vim /etc/filebeat/filebeat.yml #默认没有启动 #[root@ubuntu ~]#systemctl enable --now filebeat
3.3.2 案例: 从标准输入读取再输出至标准输出
3.3.2.1 创建配置
#这里不用默认配置文件/etc/filebeat/filebeat.yml,自己写一个 [root@ubuntu ~]#vim /etc/filebeat/stdin.yml filebeat.inputs: - type: stdin #enabled: true #默认为启用 tags: ["stdin-tags","myapp"] #添加新字段名tags,可用于判断不同类型的输入,实现不同的输出(放的列表) fields: status_code: "200" #添加"fields":{"status_code":"200"},可用于判断不同类型的输入,实现不同的输出 #a:1 #相当于多个键值对"fields":{"status_code":"200","a":1} output.console: #控制台输出 pretty: true #格式优化 enable: true #语法检查,注意:stdin.yml的相对路径是相对于/etc/filebeat的路径,而不是当前路径 [root@ubuntu2204 ~]#filebeat test config -c stdin.yml Config OK #执行 [root@ubuntu ~]#filebeat -c stdin.yml #输入非json,会转成json格式输出 #输入json内容,没有解析,依然在message中作为字符串
范例:解析json格式文本
#以后kibana可以通过字段直接挑出来 [root@ubuntu2204 ~]#cat /etc/filebeat/test.yml filebeat.inputs: - type: stdin json.keys_under_root: true #解析json output.console: pretty: true #执行 [root@ubuntu ~]#filebeat -c test.yml #输入非json,和原来一样,输入json字段会提取出来,没有message字段了
3.3.3 案例: 从标准输入读取再输出至 Json 格式的文件
3.3.3.1 创建配置
[root@ubuntu ~]#vim /etc/filebeat/stdout_file.yml filebeat.inputs: - type: stdin enabled: true json.keys_under_root: true #默认False会将json数据存储至message,true则会将数据以独立字段存储,并且删除message字段,如果是文本还是放在message字段中 output.file: #文件没有会自动生成 path: "/tmp" filename: "filebeat.log" #执行 [root@ubuntu ~]#filebeat -c stdout_file.yml [root@ubuntu tmp]#ls filebeat.log-20241016.ndjson [root@ubuntu tmp]#cat /tmp/filebeat.log-20241016.ndjson {"@timestamp":"2024-10-16T11:07:29.073Z","@metadata":{"beat":"filebeat","type":"_doc","version":"8.12.2"},"agent":{"version":"8.12.2","ephemeral_id":"9265b135-9549-436c-92df-19cd4361e9d6","id":"e2ffd767-7bd8-425d-9f6f-de7a35b30554","name":"ubuntu","type":"filebeat"},"log":{"offset":0,"file":{"path":""}},"json":{},"message":"hello world","input":{"type":"stdin"},"ecs":{"version":"8.0.0"},"host":{"name":"ubuntu"}}
3.3.4 案例: 从文件读取再输出至标准输出
filebeat 会将每个文件的读取数据的相关信息记录在/var/lib/filebeat/registry/filebeat/log.json文 件中,可以实现日志采集的持续性,而不会重复采集
1.当日志文件大小发生变化时,filebeat会接着上一次记录的位置继续向下读取新的内容
2.当日志文件大小没有变化,但是内容发生变化,filebeat会将文件的全部内容重新读取一遍
[root@ubuntu ~]#vim /etc/filebeat/file_to_stdout.yml filebeat.inputs: - type: log json.keys_under_root: true #解析json enabled: true paths: #- /var/log/syslog - /var/log/test.log output.console: pretty: true enable: true #filebeat有个文件记录了上次读的位置,即使中途停了,再启动,也是接着继续读 #执行 [root@ubuntu ~]#filebeat -c file_to_stdout.yml #测试 [root@ubuntu ~]#echo "hello world" >> /var/log/test.log
3.3.5 案例: 利用 Filebeat 收集系统日志到 ELasticsearch
#先备份文件 [root@elk-web1 ~]#cp /etc/filebeat/filebeat.yml{,.bak} [root@elk-web1 ~]#vim /etc/filebeat/filebeat.yml #删除所有原有内容,只添加下面内容 filebeat.inputs: - type: log json.keys_under_root: true enabled: true #开启日志 paths: #- /var/log/* #指定收集的日志文件 - /var/log/syslog - /var/log/auth.log #-------------------------- Elasticsearch output ------------------------------ output.elasticsearch: hosts: ["10.0.0.151:9200","10.0.0.152:9200","10.0.0.153:9200"] #指定ELK集群任意节点的地址和端口,多个地址容错 #启动服务 [root@ubuntu ~]#systemctl enable --now filebeat.service #kibana上查看,左侧stack management下,索引管理能看到新加的索引,创建数据视图 名称:filebeat 索引模式:filebeat-* 时间戳字段已经有了,直接点击添加 #点击左侧分析下的discover,左上角点击要看的视图
3.3.6 案例: 自定义索引名称收集日志到 ELasticsearch
3.3.6.1 修改配置
范例:自定义索引名称收集所有系统日志到 ELasticsearch
[root@ubuntu ~]#vim /etc/filebeat/filebeat.yml filebeat.inputs: - type: log json.keys_under_root: true #测试下来这个好像和include_lines有冲突 enabled: true #开启日志 paths: - /var/log/system.log #指定收集的日志文件 #include_lines: ['sshd','failed', 'password'] #只过滤指定包含关健字的日志 #include_lines: ['^ERR', '^WARN'] #只过滤指定包含关健字的日志 #exclude_lines: ['Debug'] #排除包含关健字的日志 #exclude_files: ['.gz$'] #排除文件名包含关健字的日志文件 output.elasticsearch: hosts: ["10.0.0.151:9200"] #指定ES集群服务器地址和端口 index: "wang-%{[agent.version]}-%{+yyyy.MM.dd}" #自定义索引名称,8.X的索引为.ds-wang, agent.version是filebeat添加的元数据字段 #注意: 8.X版生成的索引名为 .ds-wang-%{[agent.version]}-日期-日期-00000n #注意:如果自定义索引名称,没有添加下面三行的配置会导致filebeat无法启动,提示错误日志如下 #filebeat:Exiting: setup.template .name and setup.template .pattern have to be set if index name is modifiedsystemd:
#filebeat.service: main process exited, code=exited,status=1/FAILURE setup.ilm.enabled: false #关闭索引生命周期ilm功能,默认开启时索引名称只能为filebeat-*,自定义索引名必须修改为false setup.template.name: "wang" #定义模板名称,要自定义索引名称,必须指定此项,否则无法启动 setup.template.pattern: "wang-*" #定义模板的匹配索引名称,要自定义索引名称,必须指定此项,否则无法启动 #下面为默认切片副本数量 setup.template.settings: index.number_of_shards: 3 index.number_of_replicas: 1 [root@ubuntu ~]#systemctl restart filebeat.service #测试 [root@ubuntu ~]#echo '{"name":"sshd","age":"18","phone":"0123456789"}' >> /var/log/system.log #kibana上查看,左侧stack management下,索引管理能看到新加的索引,创建数据视图 名称:wangindex 索引模式:wang-* 时间戳字段已经有了,直接点击添加 #点击左侧分析下的discover,左上角点击要看的视图
3.3.7 案例: 利用 tags 收集 Nginx的 Json 格式访问日志和错误日志 到 Elasticsearch 不同的索引
3.3.7.1 安装 nginx 配置访问日志使用 Json 格式
[root@ubuntu ~]#apt install nginx [root@ubuntu ~]#systemctl stop nginx.service #改为json格式 [root@ubuntu ~]#vim /etc/nginx/nginx.conf ..... log_format access_json '{"@timestamp":"$time_iso8601",' '"host":"$server_addr",' '"clientip":"$remote_addr",' '"size":$body_bytes_sent,' '"responsetime":$request_time,' '"upstreamtime":"$upstream_response_time",' '"upstreamhost":"$upstream_addr",' '"http_host":"$host",' '"uri":"$uri",' '"domain":"$host",' '"xff":"$http_x_forwarded_for",' '"referer":"$http_referer",' '"tcp_xff":"$proxy_protocol_addr",' '"http_user_agent":"$http_user_agent",' '"status":"$status"}'; access_log /var/log/nginx/access_json.log access_json ; #access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; ...... [root@ubuntu ~]#systemctl start nginx.service #访问 [root@ubuntu ~]#curl 10.0.0.154 [root@ubuntu ~]#curl 10.0.0.154/xxx.html #错误访问测试 #查看日志 [root@ubuntu ~]#tail -f /var/log/nginx/access_json.log [root@ubuntu ~]#vim /etc/filebeat/filebeat.yml filebeat.inputs: - type: log json.keys_under_root: true enabled: true paths: #- /var/log/nginx/access.log - /var/log/nginx/access_json.log output.elasticsearch: hosts: ["10.0.0.151:9200"] index: "mynginx-%{[agent.version]}-%{+yyyy.MM.dd}" setup.ilm.enabled: false setup.template.name: "mynginx" setup.template.pattern: "mynginx-*" setup.template.settings: index.number_of_shards: 3 index.number_of_replicas: 1 [root@ubuntu ~]#systemctl restart filebeat.service
3.3.7.2 修改 Filebeat 配置文件
区分日志,往不同的索引里写入
[root@ubuntu ~]#vim /etc/filebeat/filebeat.yml filebeat.inputs: - type: log enabled: true paths: - /var/log/nginx/access_json.log json.keys_under_root: true #默认false,只识别为普通文本,会将全部日志数据存储至message字段,改为true则会以Json格式存储 json.overwrite_keys: true #设为true,使用json格式日志中自定义的key替代默认的message字段,此项可选 tags: ["nginx-access"] #指定tag,用于分类 - type: log enabled: true paths: - /var/log/nginx/error.log tags: ["nginx-error"] output.elasticsearch: hosts: ["10.0.0.151:9200","10.0.0.152:9200","10.0.0.153:9200"] indices: - index: "nginx-access-%{[agent.version]}-%{+yyy.MM.dd}" when.contains: tags: "nginx-access" #如果记志中有access的tag,就记录到nginx-access的索引中 - index: "nginx-error-%{[agent.version]}-%{+yyy.MM.dd}" when.contains: tags: "nginx-error" #如果记志中有error的tag,就记录到nginx-error的索引中 setup.ilm.enabled: false #关闭索引生命周期ilm功能,默认开启时索引名称只能为filebeat-* setup.template.name: "nginx" #定义模板名称,要自定义索引名称,必须指定此项,否则无法启动 setup.template.pattern: "nginx-*" #定义模板的匹配索引名称,要自定义索引名称,必须指定此项,否则无法启动 [root@ubuntu ~]#systemctl restart filebeat.service #创建两个数据视图,一个json,一个不是json
3.3.9 案例: 利用 Filebeat 收集 Tomat 的 Json 格式的访问日志和错 误日志到 Elasticsearch
3.3.9.1 安装 Tomcat 并配置使用 Json 格式的访问日志
[root@ubuntu ~]#apt install tomcat9 #访问日志改为json格式 (二进制安装路径 /usr/local/tomcat/conf/server.xml) [root@ubuntu ~]#vim /etc/tomcat9/server.xml ....... <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" ########################添加下面行,注意是一行,不要换行##################################### pattern="{"clientip":"%h","ClientUser":"%l","authenticated":"%u","AccessTime":"%t","method":"%r","status":"%s","SendBytes":"%b","Query?string":"%q","partner":"%{Referer}i","AgentVersion":"%{User-Agent}i"}"/> ############################################################################### [root@ubuntu ~]#systemctl restart tomcat9.service #访问tomcat [root@ubuntu ~]#curl 10.0.0.154:8080 [root@ubuntu ~]#cat /var/log/tomcat9/localhost_access_log.2024-10-17.txt {"clientip":"10.0.0.154","ClientUser":"-","authenticated":"-","AccessTime":"[17/Oct/2024:07:00:10 +0000]","method":"GET / HTTP/1.1","status":"200","SendBytes":"1895","Query?string":"","partner":"-","AgentVersion":"curl/7.81.0"}
3.3.9.2 修改 Filebeat 配置文件
[root@ubuntu ~]#vim /etc/filebeat/filebeat.yml filebeat.inputs: - type: log enabled: true paths: #- /usr/local/tomcat/logs/localhost_access_log.* #二进制安装 - /var/log/tomcat9/localhost_access_log.* #包安装 json.keys_under_root: true #默认False会将json数据存储至message,改为true则会独立message外存储 tags: ["tomcat-access"] - type: log enabled: true paths: #- /usr/local/tomcat/logs/catalina.*.log #二进制安装 - /var/log/tomcat9/catalina.*.log #包安装 tags: ["tomcat-error"] output.elasticsearch: hosts: ["10.0.0.151:9200"] #指定ELK集群服务器地址和端口,为了高可用最好多写几个 indices: - index: "tomcat-access-%{[agent.version]}-%{+yyyy.MM.dd}" when.contains: tags: "tomcat-access" - index: "tomcat-error-%{[agent.version]}-%{+yyyy.MM.dd}" when.contains: tags: "tomcat-error" setup.ilm.enabled: false setup.template.name: "tomcat" setup.template.pattern: "tomcat-*" [root@ubuntu ~]#systemctl restart filebeat.service #kibana上创建2个数据视图,进行查看
3.3.10 案例: 利用 Filebeat 收集 Tomat 的多行错误日志到 Elasticsearch
3.3.10.1 Tomcat 错误日志解析
Tomcat 是 Java 应用,当只出现一个错误时,会显示很多行的错误日志
Java 应用的一个错误导致生成的多行日志其实是同一个事件的日志的内容 而ES默认是根据每一行来区别不同的日志,就会导致一个错误对应多行错误信息会生成很多行的ES文档记录 可以将一个错误对应的多个行合并成一个ES的文档记录来解决此问题 官方文档 https://www.elastic.co/guide/en/beats/filebeat/current/multiline-examples.html
3.3.10.3 修改 Filebeat 配置文件
[root@ubuntu ~]#vim /etc/filebeat/filebeat.yml filebeat.inputs: - type: log enabled: true paths: #- /usr/local/tomcat/logs/localhost_access_log.* - /var/log/tomcat9/localhost_access_log.* #包安装 json.keys_under_root: true json.overwrite_keys: false tags: ["tomcat-access"] - type: log enabled: true paths: #- /usr/local/tomcat/logs/catalina.*.log /var/log/tomcat9/catalina.*.log #包安装 tags: ["tomcat-error"] multiline.type: pattern #此为默认值,可省略,匹配模式 multiline.pattern: '^[0-3][0-9]-' #正则表达式匹配以两位,或者为'^\d{2}' multiline.negate: true #negate否定无效(和match组合为选中范围) multiline.match: after multiline.max_lines: 5000 #默认只合并500行,指定最大合并5000行 output.elasticsearch: hosts: ["10.0.0.151:9200"] indices: - index: "tomcat-access-%{[agent.version]}-%{+yyy.MM.dd}" when.contains: tags: "tomcat-access" - index: "tomcat-error-%{[agent.version]}-%{+yyy.MM.dd}" when.contains: tags: "tomcat-error" setup.ilm.enabled: false setup.template.name: "tomcat" setup.template.pattern: "tomcat-*" #kibana上索引管理里把索引删了重新测试 [root@ubuntu ~]#systemctl restart filebeat.service
3.3.11 案例: 利用 Filebeat 收集 Nginx 日志到 Redis
当消息很多,通过先存到redis里,再把redis的数据一点点往后面发。
redis存在内存里适合访问量小。如果数据很多就不行,要放在kafka中(kafka是存在磁盘上)
官方文档: https://www.elastic.co/guide/en/beats/filebeat/master/redis-output.html #将filebeat收集的日志,发送至Redis格式如下 output.redis: hosts: ["localhost:6379"] password: "my_password" key: "filebeat" db: 0 timeout: 5 #在新机器上安装redis [root@ubuntu ~]#apt update && apt install redis -y [root@ubuntu ~]#vim /etc/redis/redis.conf bind 0.0.0.0 requirepass 123456 [root@ubuntu ~]#systemctl restart redis #范例 [root@ubuntu ~]#vim /etc/filebeat/filebeat.yml filebeat.inputs: - type: log enabled: true paths: - /var/log/nginx/access_json.log json.keys_under_root: true json.overwrite_keys: true tags: ["nginx-access"] - type: log enabled: true paths: - /var/log/nginx/error.log tags: ["nginx-error"] output.redis: hosts: ["10.0.0.155:6379"] password: "123456" key: "myfilebeat" #保存的key db: 0 timeout: 5 [root@ubuntu ~]#systemctl restart filebeat.service [root@ubuntu ~]#curl 10.0.0.154 #访问nginx,记录日志看效果 [root@ubuntu ~]#redis-cli -a 123456 127.0.0.1:6379> keys * 1) "myfilebeat" 127.0.0.1:6379> type myfilebeat list #查看列表内容 127.0.0.1:6379> lrange myfilebeat 0 -1
3.3.12 案例: 从标准输入读取再输出至 Kafka
#准备3台机器,创建kafka集群 [root@ubuntu ~]#bash install_kafka_cluster.sh [root@ubuntu ~]#vim /etc/filebeat/filebeat.yml filebeat.inputs: - type: log enabled: true paths: - /var/log/tomcat9/localhost_access_log.* #包安装 json.keys_under_root: true json.overwrite_keys: false tags: ["tomcat-access"] - type: log enabled: true paths: /var/log/tomcat9/catalina.*.log #包安装 tags: ["tomcat-error"] multiline.type: pattern #此为默认值,可省略,匹配模式 multiline.pattern: '^[0-3][0-9]-' #正则表达式匹配以两位,或者为'^\d{2}' multiline.negate: true #negate否定无效(和match组合为选中范围) multiline.match: after multiline.max_lines: 5000 #默认只合并500行,指定最大合并5000行 output.kafka: hosts: ["10.0.0.205:9092", "10.0.0.206:9092", "10.0.0.207:9092"] topic: 'mytopic' #指定kafka的topic partition.round_robin: reachable_only: true #true表示只发布到可用的分区,false 时表示所有分区,如果一个节点down,会block required_acks: 1 #如果为0,错误消息可能会丢失,1等待写入主分区(默认),-1等待写入副本分区 compression: gzip max_message_bytes: 1000000 #每条消息最大长度,以字节为单位,如果超过将丢弃 [root@ubuntu ~]#systemctl restart filebeat.service #访问tomcat [root@ubuntu ~]#curl 10.0.0.154:8080 #Offset Explorer查看kafka内容时修改键和值为string
5 Kibana 图形显示
5.2 安装并配置 Kibana
官方说明: https://github.com/elastic/kibana 下载链接 https://www.elastic.co/cn/downloads/kibana https://mirrors.tuna.tsinghua.edu.cn/elasticstack/
5.2.1.1 Ubuntu 安装
[root@ubuntu ~]#wget https://mirrors.tuna.tsinghua.edu.cn/elasticstack/8.x/apt/pool/main/k/kibana/kibana-8.12.2-amd64.deb [root@ubuntu ~]#dpkg -i kibana-8.12.2-amd64.deb #修改配置 [root@ubuntu ~]#vim /etc/kibana/kibana.yml server.host: "0.0.0.0" #修改此行的监听地址 #修改此行,指向ES任意服务器地址或多个节点地址实现容错,默认为localhost elasticsearch.hosts: ["http://10.0.0.151:9200","http://10.0.0.152:9200","http://10.0.0.153:9200"] i18n.locale: "zh-CN" #修改语言 [root@ubuntu ~]#systemctl enable --now kibana.service #登录kibana图形页面 http://10.0.0.154:5601/
数据视图
点击左侧management下的stack management堆管理,点击数据视图,点击创建数据视图 输入索引模式,比如index*,表示index开头的索引, 名称随便写,保存 点击左侧分析下的discover就能看到要求的索引下的文档整合
标签:filebeat,log,true,Filebeat,Kibana,json,ELK02,ubuntu,root From: https://www.cnblogs.com/ludingchao/p/18490418