首页 > 其他分享 >EBLK日志收集方案

EBLK日志收集方案

时间:2024-04-11 10:34:20浏览次数:21  
标签:filebeat log 收集 EBLK nginx 日志 root es

ELK 是elastic公司提供的一套完整的日志收集以及展示的解决方案,是三个产品的首字母缩写,分别是ElasticSearch、Logstash 和 Kibana。该组合版本会统一发布。

 

ElasticSearch简称ES,它是一个实时的分布式搜索和分析引擎,它可以用于全文搜索,结构化搜索以及分析。

它是一个建立在全文搜索引擎 Apache Lucene 基础上的搜索引擎,使用 Java 语言编写。

Logstash是一个具有实时传输能力的数据收集引擎,用来进行数据收集(如:读取文本文件)、解析,并将数据发送给ES。

Kibana为 Elasticsearch 提供了分析和可视化的 Web 平台。

它可以在 Elasticsearch 的索引中查找,交互数据,并生成各种维度表格、图形。

2.为什么用ELK

一般我们需要进行日志分析场景:直接在日志文件中 grep、awk 就可以获得自己想要的信息。但在规模较大的场景中,此方法效率低下,面临问题包括日志量太大如何归档、文本搜索太慢怎么办、如何多维度查询。需要集中化的日志管理,所有服务器上的日志收集汇总。常见解决思路是建立集中式日志收集系统,将所有节点上的日志统一收集,管理,访问。

一般大型系统是一个分布式部署的架构,不同的服务模块部署在不同的服务器上,问题出现时,大部分情况需要根据问题暴露的关键信息,定位到具体的服务器和服务模块,构建一套集中式日志系统,可以提高定位问题的效率。

一个完整的集中式日志系统,需要包含以下几个主要特点:

  • 收集-能够采集多种来源的日志数据
  • 传输-能够稳定的把日志数据传输到中央系统
  • 存储-如何存储日志数据
  • 分析-可以支持 UI 分析
  • 警告-能够提供错误报告,监控机制

ELK提供了一整套解决方案,并且都是开源软件,之间互相配合使用,完美衔接,高效的满足了很多场合的应用。

ELK组件解释

ELK是三个开源软件的缩写,分别表示:Elasticsearch , Logstash, Kibana , 它们都是开源软件。

新增了一个FileBeat,它是一个轻量级的日志收集处理工具(Agent),Filebeat占用资源少,适合于在各个服务器上搜集日志后传输给Logstash,官方也推荐此工具。

Elasticsearch是个开源分布式搜索引擎,提供搜集、分析、存储数据三大功能。

它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。

Logstash 主要是用来日志的搜集、分析、过滤日志的工具,支持大量的数据获取方式。

一般工作方式为c/s架构,client端安装在需要收集日志的主机上,server端负责将收到的各节点日志进行过滤、修改等操作在一并发往elasticsearch上去。

Kibana 也是一个开源和免费的工具,Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助汇总、分析和搜索重要数据日志。

Filebeat隶属于Beats。

目前Beats包含四种工具:Packetbeat(搜集网络流量数据)Topbeat(搜集系统、进程和文件系统级别的 CPU 和内存使用情况等数据)Filebeat(搜集文件数据)Winlogbeat(搜集 Windows 事件日志数据)

 

3.ELK的用途

传统意义上,ELK是作为替代Splunk的一个开源解决方案。

Splunk 是日志分析领域的领导者。日志分析并不仅仅包括系统产生的错误日志,异常,也包括业务逻辑,或者任何文本类的分析。

而基于日志的分析,能够在其上产生非常多的解决方案,譬如:

1.问题排查。我们常说,运维和开发这一辈子无非就是和问题在战斗,所以这个说起来很朴实的四个字,其实是沉甸甸的。很多公司其实不缺钱,就要稳定,而要稳定,就要运维和开发能够快速的定位问题,甚至防微杜渐,把问题杀死在摇篮里。日志分析技术显然问题排查的基石。基于日志做问题排查,还有一个很帅的技术,叫全链路追踪,比如阿里的eagleeye 或者Google的dapper,也算是日志分析技术里的一种。

2.监控和预警。 日志,监控,预警是相辅相成的。基于日志的监控,预警使得运维有自己的机械战队,大大节省人力以及延长运维的寿命。

3.关联事件。多个数据源产生的日志进行联动分析,通过某种分析算法,就能够解决生活中各个问题。比如金融里的风险欺诈等。这个可以可以应用到无数领域了,取决于你的想象力。

4.数据分析。 这个对于数据分析师,还有算法工程师都是有所裨益的。

经典Web日志架构

更复杂的场景就是
加入kafka
升级logstash集群,ES集群

 

工作ELK日常

每天上班的运维小于,实在没事干,就看看elk日志

1. 网站访问日志,ip是否有异常
2. 网站访问日志,接口是否被攻击
3. 网站访问日志,统计出,公司流量高峰,低谷时间段
4. 采集所有nginx服务器的access.log,统一分析
5. HTTP状态码统一分析、

部署ES单节点

建议恢复机器,重新配置,做实验先入门学习。

建议4G内存以上。

cat > /etc/elasticsearch/elasticsearch.yml <<'EOF'
node.name: devops01
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
bootstrap.memory_lock: true
network.host: 127.0.0.1,10.0.0.18  
http.port: 9200
discovery.seed_hosts: ["10.0.0.18"]
cluster.initial_master_nodes: ["10.0.0.18"]
EOF

[root@es-node1 ~]#systemctl restart elasticsearch.service 
[root@es-node1 ~]#
[root@es-node1 ~]#
[root@es-node1 ~]#
[root@es-node1 ~]#curl 127.0.0.1:9200
{
  "name" : "devops01",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "h7zS7k7zTxClZ3AqTODfdg",
  "version" : {
    "number" : "7.9.1",
    "build_flavor" : "default",
    "build_type" : "rpm",
    "build_hash" : "083627f112ba94dffc1232e8b42b73492789ef91",
    "build_date" : "2020-09-01T21:22:21.964974Z",
    "build_snapshot" : false,
    "lucene_version" : "8.6.2",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}
[root@es-node1 ~]#

部署kibana

[root@es-node1 ~]#grep '^[a-z]' /etc/kibana/kibana.yml 
server.port: 5601
server.host: "10.0.0.18"
elasticsearch.hosts: ["http://localhost:9200"]
kibana.index: ".kibana"
[root@es-node1 ~]#
[root@es-node1 ~]#systemctl start kibana

[root@es-node1 ~]#ss -tnlp| column -t
State   Recv-Q  Send-Q  Local                  Address:Port  Peer                               Address:Port
LISTEN  0       128     10.0.0.18:5601         *:*           users:(("node",pid=20499,fd=18))
LISTEN  0       128     *:22                   *:*           users:(("sshd",pid=1005,fd=3))
LISTEN  0       100     127.0.0.1:25           *:*           users:(("master",pid=1296,fd=13))
LISTEN  0       128     ::ffff:10.0.0.18:9200  :::*          users:(("java",pid=18278,fd=260))
LISTEN  0       128     ::ffff:127.0.0.1:9200  :::*          users:(("java",pid=18278,fd=259))
LISTEN  0       128     ::ffff:10.0.0.18:9300  :::*          users:(("java",pid=18278,fd=256))
LISTEN  0       128     ::ffff:127.0.0.1:9300  :::*          users:(("java",pid=18278,fd=257))
LISTEN  0       128     :::22                  :::*          users:(("sshd",pid=1005,fd=4))
LISTEN  0       100     ::1:25                 :::*          users:(("master",pid=1296,fd=14))
[root@es-node1 ~]#

启动nginx配置日志


#!/bin/bash
yum install nginx -y
rm -rf /etc/nginx/conf.d/*
rm -rf /var/log/nginx/*

cat > /etc/nginx/conf.d/nginx-filebeat.conf <<'EOF'
server{
    listen 80;
    server_name www.yuchaoit.cn;
    access_log /var/log/nginx/access.log;
    root /www;
    index index.html;
}
EOF

mkdir -p /www
echo 'nginx is ok...' > /www/index.html

systemctl restart nginx
curl 127.0.0.1
tail -f /var/log/nginx/access.log

4.客户端安装filebeat

https://www.elastic.co/cn/beats/filebeat

1.安装
[root@es-node2 ~]#rpm -ivh filebeat-7.9.1-x86_64.rpm 
warning: filebeat-7.9.1-x86_64.rpm: Header V4 RSA/SHA512 Signature, key ID d88e42b4: NOKEY
Preparing...                          ################################# [100%]
Updating / installing...
   1:filebeat-7.9.1-1                 ################################# [100%]
[root@es-node2 ~]#


2.改配置
[root@es-node2 ~]#cp /etc/filebeat/filebeat.yml{,.bak}

 

配置文件

输入

 

1.装在client
2.收集目标日志
 13 # ============================== Filebeat inputs ===============================
 14 
 15 filebeat.inputs:
 16 
 17 # Each - is an input. Most options can be set at the input level, so
 18 # you can use different inputs for various configurations.
 19 # Below are the input specific configurations.
 20 
 21 - type: log
 22 
 23   # Change to true to enable this input configuration.
 24   enabled: true
 25 
 26   # Paths that should be crawled and fetched. Glob based paths.
 27   paths:
 28     - /var/log/nginx/*.log
 29     #- c:\programdata\elasticsearch\logs\*

输出

 

146 # ---------------------------- Elasticsearch Output ----------------------------
147 output.elasticsearch:
148   # Array of hosts to connect to.
149   hosts: ["10.0.0.18:9200"]

具体配置

filebeat数据写入es,还可以对es的如分片副本设置参数。

不用的参数可以全删除。

[root@es-node2 ~]#grep -Ev '#|^$' /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/nginx/*.log
output.elasticsearch:
  hosts: ["10.0.0.18:9200"]


[root@es-node2 ~]#systemctl start filebeat.service 

[root@es-node2 ~]#ps -ef|grep filebeat
root       1911      1  2 13:23 ?        00:00:00 /usr/share/filebeat/bin/filebeat --environment systemd -c /etc/filebeat/filebeat.yml --path.home /usr/share/filebeat --path.config /etc/filebeat --path.data /var/lib/filebeat --path.logs /var/log/filebeat

启动检查filebeat数据

 

检查filebeat日志

[root@es-node2 ~]#journalctl -u filebeat

查看日志收集流程

1. nginx记录日志
[root@es-node2 ~]#curl 127.0.0.1/yuchao666
[root@es-node2 ~]#wc -l /var/log/nginx/*
   6 /var/log/nginx/access.log
   5 /var/log/nginx/error.log
  11 total
[root@es-node2 ~]#



2.查看es
GET /filebeat-7.9.1-2022.12.04-000001/_search




3.filebeat会持续性收集目标日志,10s一次

 

es-head查看es

 

kibana查询nginx日志

1. 导入es索引
2. 查看es索引,查询nginx日志

 

添加时间排序规则

 

discover查看日志

 

查看ELK持续收集日志

1.模拟线上用户访问
[root@es-node2 ~]#for i in {1..20000};do curl -s 127.0.0.1/chaoge666 -o  /dev/null ;done

2.看es

 

3.看kibana

 

4.设置时间区间

 

5.解读kibana面板

 

es原始日志数据,字段是message。

6.过滤kibana面板字段

 

再加一个字段

 

移动字段,排序

 

7.注意通配符添加

 

重启filebeat

# 重启,重新生成es下的filebeat索引
[root@es-node1 ~]#systemctl restart filebeat.service 

# 继续在10.0.0.18:9200 查看新的index,以及日志docs

5.filebeat收集nginx日志(json)

1.为什么要转换nginx日志格式

由于nginx普通日志收集过来的日志内容都是存在一个字段中的值,我们想单独对日志中的某一项进行查询统计,比如我只想查看某个IP请求了我那些页面,一共访问了多少次,在普通的日志中是无法过滤的,不是很满意

如下图,可以明显的看出,收集过来的日志信息都是在一块的,不能够根据某一项内容进行查询。

 

因此就需要让filebeat收集json格式日志内容,把日志内容分成不同的字段,也就是Key/value,这样我们就可以根据一个字段去统计这个字段的相关内容了

我们期望日志收集过来是这个样子的

$remote_addr:192.168.81.210
$remote_user:-
[$time_local]:[15/Jan/2021:15:03:39 +0800]
$request:GET /yem HTTP/1.1" 
$status:404 
$body_bytes_sent:3650
$http_referer: -
$http_user_agent:"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36"
$http_x_forwarded_for:-

中文格式更是我们期望的

客户端地址:192.168.81.210
访问时间:[15/Jan/2021:15:03:39 +0800]
请求的页面:GET /yem HTTP/1.1" 
状态码:404 
传输流量:3650
跳转来源: -
客户端程序:"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36"
客户端外网地址:-
请求响应时间:-
后端地址:-

2.修改nginx配置

改进filebeat
1. 修改索引名
2. 修改日志格式,改造access.log 为 key:value形式,可以更自由在kibana展示。


修改nginx.conf

    log_format  json '{"客户端内网地址":"$remote_addr",'
                       '"时间":"$time_iso8601",'
                       '"URL":"$request",'
                       '"状态码":$status,'
                       '"传输流量":$body_bytes_sent,'
                       '"跳转来源":"$http_referer",'
                       '"浏览器":"$http_user_agent",'
                       '"客户端外网地址":"$http_x_forwarded_for",'
                       '"请求响应时间":$request_time,'
                       '"后端地址":"$upstream_addr"}';


    access_log  /var/log/nginx/access.log  json;

3.重启查看新日志nginx格式

 

但是此时es能正确拿到filebeat数据吗?注意删掉旧的filebeat索引,重新查看。

清空,删除所有es 索引,注意测试用法,生产别执行。
[root@es-node1 ~]#curl -X DELETE 'http://localhost:9200/_all'
{"acknowledged":true}
[root@es-node1 ~]#systemctl restart filebeat.service 
[root@es-node1 ~]#

[root@es-node1 ~]#systemctl restart filebeat.service 
[root@es-node1 ~]#

注意再去访问nginx,产生日志,此时filebeat会抓取新日志数据,写入es,生成索引

[root@es-node1 ~]#curl 127.0.0.1
[root@es-node1 ~]#curl 127.0.0.1
[root@es-node1 ~]#curl 127.0.0.1

 

es并没有正常的解析json数据,只是构造了一个整体message数据字符串,不好处理。

 

3.修改filebeat配置

修改数据源的输入格式,改造key成json格式。

[root@es-node1 ~]#cat /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/nginx/*.log
  json.keys_uner_root: true
  json.overwrite_keys: true
output.elasticsearch:
  hosts: ["10.0.0.18:9200"]
[root@es-node1 ~]#


[root@es-node1 ~]#systemctl restart filebeat.service 
[root@es-node1 ~]#
  • 重建filebeat索引
  • 重新访问nginx > filebeat > es
    • 注意坑,我们测试的是access.log,而没修改error.log
curl 10.0.0.18 # 确保正确日志 记录

4.最终es解析nginx(json)

 

5.kibana重新加索引

即使index名一样,也得更新es索引,才能确保kubana拿到最新json格式数据。

6.filebeat修改index名

filebeat采集数据,输入数据的文档

https://www.elastic.co/guide/en/beats/filebeat/current/filebeat-input-log.html

 

需求:期望修改filebeat输入格式

参考文档

https://www.elastic.co/guide/en/beats/filebeat/current/filebeat-input-log.html#_index_12

https://www.elastic.co/guide/en/beats/filebeat/current/configuration-logging.html

https://www.elastic.co/guide/en/beats/filebeat/current/configuration-template.html 修改日志格式

https://www.elastic.co/guide/en/beats/filebeat/8.6/ilm.html 修改默认的模板,修改日志的生命周期(ilm)

修改filebeat配置文件,最终配置

[root@es-node1 ~]#cat /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/nginx/*.log
  json.keys_uner_root: true
  json.overwrite_keys: true
output.elasticsearch:
  hosts: ["10.0.0.18:9200"]
  index: "nginx-%{[agent.version]}-%{+yyyy.MM.dd}"

setup.ilm.enabled: false
setup.template.enabled: false

logging.level: info
logging.to_files: true
logging.files:
  path: /var/log/filebeat
  name: filebeat
  keepfiles: 7
  permissions: 0644
[root@es-node1 ~]#
[root@es-node1 ~]#systemctl restart filebeat
[root@es-node1 ~]#
[root@es-node1 ~]#systemctl status filebeat
● filebeat.service - Filebeat sends log files to Logstash or directly to Elasticsearch.
   Loaded: loaded (/usr/lib/systemd/system/filebeat.service; disabled; vendor preset: disabled)
   Active: active (running) since Thu 2023-02-16 17:05:08 CST; 4s ago
     Docs: https://www.elastic.co/products/beats/filebeat
 Main PID: 2345 (filebeat)
   CGroup: /system.slice/filebeat.service
           └─2345 /usr/share/filebeat/bin/filebeat --environment systemd -c /etc/filebeat/filebeat.yml --path.home /usr/share/filebeat --path.config /etc/filebeat --path.data /...

Feb 16 17:05:08 es-node1 systemd[1]: Started Filebeat sends log files to Logstash or directly to Elasticsearch..
Feb 16 17:05:08 es-node1 systemd[1]: Starting Filebeat sends log files to Logstash or directly to Elasticsearch....
[root@es-node1 ~]#
[root@es-node1 ~]#

# 别忘记给nginx发请求,让filebeat有东西收集!!有输入才能有索引!!

 

查看索引数据

{
    "_index":"nginx-7.9.1-2023.02.16",
    "_type":"_doc",
    "_id":"mtmOWYYBuYvrH-J3Evp7",
    "_version":1,
    "_score":1,
    "_source":{
        "@timestamp":"2023-02-16T09:28:47.420Z",
        "agent":{
            "id":"0e4c5d24-5b1e-4e20-a001-6f0937a831d7",
            "name":"es-node1",
            "type":"filebeat",
            "version":"7.9.1",
            "hostname":"es-node1",
            "ephemeral_id":"b436ec8e-d000-4411-b471-f935fad6c52c"
        },
        "log":{
            "offset":0,
            "file":{
                "path":"/var/log/nginx/access.log"
            }
        },
        "json":{
            "URL":"HEAD / HTTP/1.1",
            "传输流量":0,
            "浏览器":"curl/7.29.0",
            "客户端内网地址":"127.0.0.1",
            "跳转来源":"-",
            "后端地址":"-",
            "状态码":200,
            "客户端外网地址":"-",
            "请求响应时间":0,
            "时间":"2023-02-16T17:28:38+08:00"
        },
        "input":{
            "type":"log"
        },
        "ecs":{
            "version":"1.5.0"
        },
        "host":{
            "name":"es-node1"
        }
    }
}

 

火坑记录

别忘记给nginx发请求,让filebeat有东西收集!!有输入才能有索引!!

让无数运维,反复删除重装的噩梦。

简单理解,就好比你用tail命令,你不输入,就看不到数据。

[root@es-node1 ~]#cd /var/log/filebeat/
[root@es-node1 /var/log/filebeat]#ls
filebeat  filebeat.1  filebeat.2

标签:filebeat,log,收集,EBLK,nginx,日志,root,es
From: https://www.cnblogs.com/sxy-blog/p/18128267

相关文章

  • Log4J日志配置详解
    一、Log4j简介Log4j有三个主要的组件:Loggers(记录器),Appenders(输出源)和Layouts(布局)。这里可简单理解为日志类别,日志要输出的地方和日志以何种形式输出。综合使用这三个组件可以轻松地记录信息的类型和级别,并可以在运行时控制日志输出的样式和位置。1、LoggersLoggers组件......
  • 日志收集系统PLG(Promtail+Loki+Grafana)部署
    一、简介Loki是受Prometheus启发由GrafanaLabs团队开源的水平可扩展,高度可用的多租户日志聚合系统。开发语言:GoogleGo。它的设计具有很高的成本效益,并且易于操作。使用标签来作为索引,而不是对全文进行检索,也就是说,你通过这些标签既可以查询日志的内容也可以查询到监控的数......
  • hadoop篇——nameNode DataNode SecondaryNameNode的作用,以及如何查看操作日志
    集群下的hadoop(112主节点113,114从节点)如果112挂了,数据以及操作日志会丢失无法恢复,又称单点故障。再启动start-all.shhadoop后,主节点会产生name以及secondary两个文件 所在地址在  /root/training/hadoop-2.7.3/tmp/dfs其中name对应的是NameNode节点:接受客户端的请......
  • 分布式任务调度平台XXL-JOB:调度日志打印时区问题
    系列文章目录文章目录系列文章目录前言前言前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。Quartz作为开源作业调度中的佼佼者,是作业调度的首选。但是集群环境中Q......
  • 如何查看jvm中的垃圾收集器
    查看jvm中参数:java-XX:+PrintCommandLineFlags-version返回:-XX:G1ConcRefinementThreads=8-XX:GCDrainStackTargetSize=64-XX:InitialHeapSize=524342912-XX:MaxHeapSize=8389486592-XX:+PrintCommandLineFlags-XX:ReservedCodeCacheSize=251658240-XX:+SegmentedCodeC......
  • P8661 [蓝桥杯 2018 省 B] 日志统计 题解
    好久没写题解了,水一篇。这里主要想讲的是不同的处理方法,在阅读本篇题解前请确保读完题。详解一,排序这很好理解,题目要求将热帖从小到大输出,同时题目中还有相对的时间这一概念,因此将输入的\(id\)与\(ts\)按照优先\(id\)其次\(ts\)的排序方式从小到大,排序,这样输出时就没......
  • Windows 事件日志禁用教程:简单步骤
    事件日志是详细说明主要和次要更改甚至错误的报告。如果服务或启动应用在第一次尝试时无法运行,则会生成日志。但是,当日志数量变得很大时,用户可能希望禁用Windows事件日志。单个日志在磁盘上占用的空间很小,但如果每天生成数千个此类报告并将其存储在SSD上,那么您会看到性能下降......
  • 采用自定义注解 和 AOP 完成日志记录
    1、声明一个自定义注解@Retention注解包含一个RetentionPolicy类型的属性value,用于指定注解的保留策略,常用的保留策略包括:RetentionPolicy.SOURCE:表示注解仅在源代码中保留,编译器编译时会将其忽略,不会保存在编译后的字节码中。RetentionPolicy.CLASS:表示注解在编译后的......
  • 日志脱敏更加优雅性能更好,远超正则。支持 logback+log4j2 插件
    项目介绍日志脱敏是常见的安全需求。普通的基于工具类方法的方式,对代码的入侵性太强,编写起来又特别麻烦。sensitive项目提供基于注解的方式,并且内置了常见的脱敏方式,便于开发。支持logback和log4j2等常见的日志脱敏插件。日志插件解决正则匹配长文本可能出现的回溯......
  • 二十九 4009. 收集卡牌 (数学期望|状压DP)
    4009.收集卡牌(数学期望|状压DP)略importjava.util.*;publicclassMain{privatestaticfinalintN=16,M=1<<N;privatestaticintn,m;privatestaticdouble[]p=newdouble[N];privatestaticdouble[][]dp=newdouble[M][N*5......