ELK日志实时监控

目录

一、ELK/EFK简介

1.1 什么是ELK/EFK?

1.2 常见架构 

1、Elasticsearch + Logstash + Kibana

2、Elasticsearch + Logstash + Filebeat + Kibana

3、Elasticsearch + Logstash + Filebeat + Kibana + Redis

4、Elasticsearch + Fluentd + Filebeat + Kibana

1.3 基本流程

二、ELK部署

2.1 环境准备

2.2 部署ElasticSearch集群环境

2.2.1 安装Elasticsearch

2.2.2 配置Elasticsearch集群

2.2.3 检查Elasticsearch集群

2.3 部署Redis+Keepalived高可用环境 

 2.4 部署Kibana及nginx代理访问环境

三、ELK日志收集

3.1 客户机日志收集操作(Logstash)

 3.1.1 logstash 介绍

3.1.2 安装logstash

3.1.3 logStash配置语法 

3.1.4 logstash插件  

3.2 客户机日志收集操作(Filebeat)

3.2.1 安装 Filebeat

3.2.2 配置 Filebeat


一、ELK/EFK简介

1.1 什么是ELK/EFK?

ELK 是三个开源软件的缩写,分别表示: Elasticsearch , Logstash, Kibana , 它们都是开源软件。新增了一个FileBeat ,它是一个轻量级的日志收集处理工具 (Agent) Filebeat 占用资源少,适合于在各个服务器上搜集日志后传输给Logstash ,官方也推荐此工具。
Elasticsearch 是个开源分布式搜索引擎,提供搜集、分析、存储数据三大功能。它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful 风格接口,多数据源,自动搜索负载等。
Logstash 主要是用来日志的搜集、分析、过滤日志的工具,支持大量的数据获取方式。一般工作方式为c/s 架构, client 端安装在需要收集日志的主机上, server 端负责将收到的各节点日志进行过滤、修改等操作在一并发往elasticsearch 上去。
Kibana 也是一个开源和免费的工具, Kibana 可以为 Logstash ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助汇总、分析和搜索重要数据日志。
ELK EFK:
        由于logstash 内存占用较大,灵活性相对没那么好, ELK 正在被 EFK 逐步替代 . 其中本文所讲的 EFK 是Elasticsearch+Fluentd+Kafka。
        Kubernetes 中比较流行的日志收集解决方案是 Elasticsearch Fluentd Kibana EFK )技术栈,也是官方现在比较推荐的一种方案。
        Fluentd是一个收集日志文件的开源软件,目前提供数百个插件可用于存储大数据用于日志搜索,数据分析和存储。
Fluentd 适用于以下场景。
        收集多台服务器的访问日志进行可视化
        在AWS 等云端使用 AutoScaling 时把日志文件收集至 S3( 需要安装插件 )
        收集客户端的信息并输出至Message Queue ,供其他应用处理

1.2 常见架构 

1Elasticsearch + Logstash + Kibana

        这是一种简单架构。这种架构,通过logstash 收集日志, elasticsearch 分析日志,然后再 kibana 中展示,生产中很少使用。

2Elasticsearch + Logstash + Filebeat + Kibana

        与上一个架构相比,增加了filebeat 模块,它是一个轻量级的日志收集处理工具 (Agent) ,部署在客户端,Filebeat 占用资源少,适合于在各个服务器上搜集日志后传输给 Logstash ,生产中使用较多,但缺点是logstash 出现故障,会造成日志丢失。

3Elasticsearch + Logstash + Filebeat + Kibana + Redis

这种架构,通过增加中间件来避免日志丢失。 

4Elasticsearch + Fluentd + Filebeat + Kibana

        这种使用了fluentd 代替了 logstash 。当然,我们也可以使用 Fluentd 的插件( fluent-plugin
elasticsearch )直接将日志发送给 Elasticsearch ,可以根据自己的需要替换掉 Filebeat ,从而形成
Fluentd => ElasticSearch => Kibana 的架构,也称作 EFK

1.3 基本流程

下面以第三种架构为例,基本流程如下:

1 Logstash-Shipper 获取日志信息发送到 redis
2 Redis 在此处的作用是防止 ElasticSearch 服务异常导致丢失日志,提供消息队列的作用。
3 logstash 是读取 Redis 中的日志信息发送给 ElasticSearch
4 ElasticSearch 提供日志存储和检索。
5 Kibana ElasticSearch 可视化界面插件。

二、ELK部署

2.1 环境准备

主机名IP地址角色
 
elk-node01192.168.186.161es01,redis01
elk-node02192.168.186.162es02,redis02(vip:192.168.186.100)
elk-node03192.168.186.163es03,kibana,nginx

1、设置主机名和hosts解析

[root@elk-node01 ~]# cat >> /etc/hosts << EOF
192.168.186.161 elk-node01
192.168.186.162 elk-node02
192.168.186.163 elk-node03
EOFcat >> /etc/hosts << EOF192.168.186.161 elk-node01192.168.186.162 elk-node02192.168.186.163 elk-node03
EOF[root@elk-node01 ~]# tail -3 /etc/hosts 
192.168.186.161 elk-node01
192.168.186.162 elk-node02
192.168.186.163 elk-node03

2、时间同步

3、部署jdk

三台机器都部署jdk,建议内存3G以上

[root@elk-node01 ~]# rpm -ivh jdk-8u261-linux-x64.rpm [root@elk-node01 ~]# java -version
java version "1.8.0_261"
Java(TM) SE Runtime Environment (build 1.8.0_261-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.261-b12, mixed mode)

2.2 部署ElasticSearch集群环境

2.2.1 安装Elasticsearch

三台机器都部署

使用清华镜像源,本文安装7.2.0

# vim /etc/yum.repos.d/elk.repo
[elk]
name=elk 7.x
baseurl=https://mirrors.tuna.tsinghua.edu.cn/elasticstack/yum/elastic-7.x/
gpgcheck=0安装:# yum install -y elasticsearch-7.2.0

2.2.2 配置Elasticsearch集群

elk-node01节点的配置

root@elk-node01 ~]# grep '^[a-Z]' /etc/elasticsearch/elasticsearch.yml
cluster.name: elk-node01
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.host: 192.168.186.161
http.port: 9200
discovery.seed_hosts: ["elk-node01", "elk-node02","elk-node03"]
cluster.initial_master_nodes: ["elk-node01"]
node.master: true
node.data: false
node.ingest: false
node.ml: false
cluster.remote.connect: false

安装**head插件**,在5.0版本之后不支持直接把插件包放入es安装目录的plugin目录下,需要单独安装。

1>安装环境支持,需要安装nodejs

[root@elk-node01 ~]# yum install -y nodejs npm

2>下载head插件

[root@elk-node01 elasticsearch]# cd /var/lib/elasticsearch/[root@elk-node01 elasticsearch]#  wget https://github.com/mobz/elasticsearch-head/archive/master.zip

3>安装依赖包

[root@elk-node01 elasticsearch]# yum install openssl bzip2 unzip -y下载运行head必要的文件(放置在文件夹/tmp下)[root@elk-node01 elasticsearch]# cd /tmp
[root@elk-node01 tmp]# wget https://npm.taobao.org/mirrors/phantomjs/phantomjs-2.1.1-linux-x86_64.tar.bz2用以下命令把下载到的包添加到npm cache目录中\# npm cache add phantomjs执行npm install,它便会使用本地缓存的xxx.tgz,而跳过下载过程。npm安装卡时可以打开info level的log,命令如下#npm config set loglevel info解压master.zip\# unzip master.zip开始安装依赖:[root@elk-node01 elasticsearch]# cd elasticsearch-head-master/\# npm install\# 直接使用npm安装时间久,依赖网络,替换为淘宝的cnpmnpm install -g cnpm --registry=https://registry.npm.taobao.org\# 安装依赖cnpm install
4> 修改配置文件
修改 Gruntfile.js
在该文件中添加如下,务必注意不要漏了添加“,”号,这边的hostname:’*’,表示允许所有IP可以访问
options: {
port: 9100,
base: '.',
keepalive: true,
hostname: '*'
}
修改elasticsearch-head默认连接地址,将localhost改为本机IP
# vim _site/app.js
this.base_uri = this.config.base_uri || this.prefs.get( "app-base_uri" ) ||
"http://192.168.186.161:9200" ;

 5>修改elasticSearch配置文件并启动ElasticSearch

修改 elasticsearch 的配置文件 elasticsearch.yml ,以允许跨域访问,在文末追加如下代码即可
[root@elk-node01 elasticsearch]# vim elasticsearch.yml

重启:

[root@elk-node01 elasticsearch]# systemctl restart elasticsearch

启动插件:
# cd /var/lib/elasticsearch/elasticsearch-head-master/
# nohup ./node_modules/grunt/bin/grunt server &

访问IP:9100就能看到我们集群信息  

安装Bigdesk插件

 1>下载

# cd /var/lib/elasticsearch/
# yum install git -y
# git clone https://github.com/hlstudio/bigdesk

2>启动web服务器,默认监听端口号8000,指定启动端口,并后台启动  

# cd /var/lib/elasticsearch/bigdesk/_site
# nohup python -m SimpleHTTPServer &
此时通过访问 web 界面来监控我们的集群状态。
http://IP:8000

 

安装cerebro插件

 1>下载cerebro插件:

git 项目: https://github.com/lmenezes/cerebro/releases
# wget https://github.com/lmenezes/cerebro/releases/download/v0.8.3/cerebro- 0.8.3.tgz

2>上传到安装目录、解压:

 # tar xf cerebro-0.8.3.tgz -C /var/lib/elasticsearch

# ln -s /var/lib/elasticsearch/cerebro-0.8.3 /var/lib/elasticsearch/cerebro

3>启动cerebro

 # cd /var/lib/elasticsearch/cerebro

# nohup ./bin/cerebro &
4 、浏览器访问 IP:9000
就能看到数据分片信息。
配置插件开机自启动:
/etc/rc.d/rc.local 添加以下内容:
cd /var/lib/elasticsearch/elasticsearch-head-master/ && /usr/bin/nohup
./node_modules/grunt/bin/grunt server &
cd /var/lib/elasticsearch/bigdesk/_site && /usr/bin/nohup python -m   SimpleHTTPServer &
cd /var/lib/elasticsearch/cerebro && /usr/bin/nohup ./bin/cerebro &
chmod + x /etc/rc.d/rc.local

 注意:不添加执行权限,脚本等无法执行

安装: # yum install -y elasticsearch-7.2.0
elk-node02 elk-node03 节点的配置
[root@elk-node02 ~]# grep '^[a-Z]' /etc/elasticsearch/elasticsearch.yml 
node.name: elk-node02
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.host: 192.168.186.162
node.master: false
node.data: true
node.ingest: false
node.ml: false
cluster.remote.connect: false[root@elk-node03 ~]# grep '^[a-Z]' /etc/elasticsearch/elasticsearch.yml 
node.name: elk-node03
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.host: 192.168.186.163
node.master: false
node.data: true
node.ingest: false
node.ml: false
cluster.remote.connect: false
插件安装和 elk-node01 相同。
启动 elasticsearch 服务:
systemctl restart elasticsearch
systemctl enable elasticsearch

2.2.3 检查Elasticsearch集群

插件安装和 elk-node01 相同。
启动 elasticsearch 服务:
systemctl restart elasticsearch
systemctl enable elasticsearch
1> 查看集群状态(任意节点执行)
[root@elk-node01 cerebro]# curl -XGET '192.168.186.161:9200/_cluster/health?pretty'
{
  "cluster_name" : "my-elk",
  "status" : "green",
  "timed_out" : false,
  "number_of_nodes" : 3,
  "number_of_data_nodes" : 2,
  "active_primary_shards" : 0,
  "active_shards" : 0,
  "relocating_shards" : 0,
  "initializing_shards" : 0,
  "unassigned_shards" : 0,
  "delayed_unassigned_shards" : 0,
  "number_of_pending_tasks" : 0,
  "number_of_in_flight_fetch" : 0,
  "task_max_waiting_in_queue_millis" : 0,
  "active_shards_percent_as_number" : 100.0
}

2>查看各个节点的信息

 [root@elk-node01 cerebro]# curl -XGET '192.168.186.161:9200/_nodes/process?pretty'
{
  "_nodes" : {
    "total" : 3,
    "successful" : 3,
    "failed" : 0
  },
  "cluster_name" : "my-elk",
  "nodes" : {
    "7TbMO4r2SDWX8oty7YKwlw" : {
      "name" : "elk-node03",
      "transport_address" : "192.168.186.163:9300",
      "host" : "192.168.186.163",
      "ip" : "192.168.186.163",
      "version" : "7.2.0",
      "build_flavor" : "default",
      "build_type" : "rpm",
      "build_hash" : "508c38a",
      "roles" : [
        "data"
      ],
      "attributes" : {
        "xpack.installed" : "true"
      },
      "process" : {
        "refresh_interval_in_millis" : 1000,
        "id" : 1029,
        "mlockall" : false
      }
    },
    "Q02otdo6TlSm4i3paqcxlA" : {
      "name" : "elk-node01",
      "transport_address" : "192.168.186.161:9300",
      "host" : "192.168.186.161",
      "ip" : "192.168.186.161",
      "version" : "7.2.0",
      "build_flavor" : "default",
      "build_type" : "rpm",
      "build_hash" : "508c38a",
      "roles" : [
        "master"
      ],
      "attributes" : {
        "xpack.installed" : "true"
      },
      "process" : {
        "refresh_interval_in_millis" : 1000,
        "id" : 41349,
        "mlockall" : false
      }
    },
    "76e52HahTWOLCv5daqpQ0Q" : {
      "name" : "elk-node02",
      "transport_address" : "192.168.186.162:9300",
      "host" : "192.168.186.162",
      "ip" : "192.168.186.162",
      "version" : "7.2.0",
      "build_flavor" : "default",
      "build_type" : "rpm",
      "build_hash" : "508c38a",
      "roles" : [
        "data"
      ],
      "attributes" : {
        "xpack.installed" : "true"
      },
      "process" : {
        "refresh_interval_in_millis" : 1000,
        "id" : 964,
        "mlockall" : false
      }
    }
  }
}

3>查看单个节点信息

[root@elk-node01 cerebro]# curl -XGET '192.168.186.162:9200/'
{
  "name" : "elk-node02",
  "cluster_name" : "my-elk",
  "cluster_uuid" : "mDzG-BFlToOZfFALXi2epQ",
  "version" : {
    "number" : "7.2.0",
    "build_flavor" : "default",
    "build_type" : "rpm",
    "build_hash" : "508c38a",
    "build_date" : "2019-06-20T15:54:18.811730Z",
    "build_snapshot" : false,
    "lucene_version" : "8.0.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}
 

 4> 插件查看

head 插件

 Bigdesk插件

cerebro插件

 

2.3 部署Redis+Keepalived高可用环境 

1 、安装 redis 服务及主从配置
[root@elk-node01 ~] # yum install redis
# vim /etc/redis.conf
...
bind 0 .0.0.0
daemonize yes
appendonly yes
[root@elk-node01 ~] # systemctl restart redis
[root@elk-node01 ~] # systemctl enable redis
redis 比主配置多一行:
slaveof 192 .168..186.161  6379
2 Keepalived 安装
两个节点都安装
# yum install -y keepalived
3 redis+keepalived 配置

 1>主节点配置

[root@elk-node01 ~]# vim /etc/keepalived/keepalived.conf 

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id redis-slave
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}
 

vrrp_script chk_redis {
   script "killall -0 redis-server"
   interval 2
   timeout 2
   fall 3
}

vrrp_instance redis {
    state BACKUP
    interface ens33
    lvs_sync_daemon_interface ens33
    virtual_router_id 202
    priority 150
    nopreempt
    advert_int 1

    authentication {
        auth_type PASS
        auth_pass 1111
    }

    virtual_ipaddress {

        192.168.186.100
    }

    track_script {
      chk_redis
    }

    notify_master "/etc/keepalived/scripts/redis_master.sh 127.0.0.1 192.168.186.162 6379"
    notify_backup "/etc/keepalived/scripts/redis_backup.sh 127.0.0.1 192.168.186.162 6379"
    notify_fault /etc/keepalived/scripts/redis_fault.sh
    notify_stop /etc/keepalived/scripts/redis_stop.sh

}

注意:主从节点需要安装 psmisc( 提供 killall 命令 )

 2>从节点配置

[root@elk-node02~]# vim /etc/keepalived/keepalived.conf

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id redis-slave
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance redis {
    state BCAKUP
    interface ens33
    lvs_sync_daemon_interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.186.100
    }
     track_script {
      chk_redis
    }

    notify_master "/etc/keepalived/scripts/redis_master.sh 127.0.0.1 192.168.186.161 6379"
    notify_backup "/etc/keepalived/scripts/redis_backup.sh 127.0.0.1 192.168.186.161 6379"
    notify_fault /etc/keepalived/scripts/redis_fault.sh
    notify_stop /etc/keepalived/scripts/redis_stop.sh
}

以上的 keepalived.conf 文件中的切换模式设置为 nopreempt ,意思是:
不抢占 VIP 资源,此种模式要是所有的节点都必须设置为 state BACKUP 模式!
需要注意无论主备服务器都需要设置为 BACKUP ,与以往 KeepAlived 的配置不同,其目的就是防止主服务器恢复后重新抢回VIP ,导致 Redis 切换从而影响稳定。
主节点脚本复制到从节点,保证有执行权限。
Keepalived 在转换状态时会依照状态来呼叫:
当进入 Master 状态时会呼叫 notify_master
当进入 Backup 状态时会呼叫 notify_backup
当发现异常情况时进入 Fault 状态呼叫 notify_fault
Keepalived 程序终止时则呼叫 notify_stop
# cat redis_master.sh
#!/bin/bash
REDISCLI = "redis-cli -h $1 -p $3 "
LOGFILE = "/var/log/keepalived-redis-state.log"
echo "[master]" >> $LOGFILE
date >> $LOGFILE
echo "Being master...." >> $LOGFILE 2 >&1
echo "Run SLAVEOF cmd ... " >> $LOGFILE
$REDISCLI SLAVEOF $2 $3 >> $LOGFILE 2 >&1
echo "SLAVEOF $2 cmd can't excute ... " >> $LOGFILE
sleep 10
echo "Run SLAVEOF NO ONE cmd ..." >> $LOGFILE
$REDISCLI SLAVEOF NO ONE >> $LOGFILE 2 >&1
# cat redis_backup.sh
#!/bin/bash
REDISCLI = "redis-cli"
LOGFILE = "/var/log/keepalived-redis-state.log"
echo "[BACKUP]" >> $LOGFILE
date >> $LOGFILE
echo "Being slave...." >> $LOGFILE 2 >&1
echo "Run SLAVEOF cmd ..." >> $LOGFILE 2 >&1
$REDISCLI SLAVEOF $2 $3 >> $LOGFILE
sleep 100
exit 0
# cat redis_fault.sh
#!/bin/bash
LOGFILE = "/var/log/keepalived-redis-state.log"
echo "[fault]" >> $LOGFILE
date >> $LOGFILE
# cat redis_stop.sh
#!/bin/bash
LOGFILE = "/var/log/keepalived-redis-state.log"
echo "[stop]" >> $LOGFILE
date >> $LOGFILE

 3>主从节点启动服务

# systemctl restart keepalived.service
# systemctl enable keepalived.service
4 redis+keepalived 测试
1> 通过 VIP 连接 Redis:

 [root@elk-node01 ~]# redis-cli -h 192.168.186.161 INFO|grep role
role:master
[root@elk-node01 ~]# redis-cli -h 192.168.186.162 INFO|grep role
role:slave
[root@elk-node01 ~]# redis-cli -h 192.168.186.100 INFO|grep role
role:master

2>插入数据测试: 

[root@elk-node01 ~]# redis-cli -h 192.168.186.100 SET Hello Redis
OK
[root@elk-node01 ~]# redis-cli -h 192.168.186.100 GET Hello
"Redis"
[root@elk-node01 ~]# redis-cli -h 192.168.186.161 GET Hello
"Redis"

3> 模拟故障测试 :
停止主节点 redis

[root@elk-node02 ~]# systemctl stop redi

[root@elk-node01 ~]# redis-cli -h 192.168.186.100 INFO|grep role
role:master
[root@elk-node01 ~]# redis-cli -h 192.168.186.161 INFO|grep role
role:master
[root@elk-node01 ~]# redis-cli -h 192.168.186.162 INFO|grep role
Could not connect to Redis at 192.168.186.162:6379: Connection refused

 2.4 部署Kibananginx代理访问环境

Kibana nginx 代理访问环境部署(访问权限控制)。在 elk-node03 节点机上操作
1 kibana 安装配置
[root@elk-node03 ~]# wget https://artifacts.elastic.co/downloads/kibana/kibana-7.2.0-x86_64.rpm
[root@elk-node03 ~] # yum install kibana-7.2.0-x86_64.rpm
由于维护的业务系统比较多,每个系统下的业务日志在 kibana 界面展示的访问权限只给该系统相关人员开放,对系统外人员不开放。所以需要做kibana 权限控制。
        这里通过nginx 的访问验证配置来实现。
可以配置多个端口的 kibana ,每个系统单独开一个 kibana 端口号,比如财务系统 kibana 使用 5601
口、租赁系统 kibana 使用 5602 ,然后 nginx 做代理访问配置。
        每个系统的业务日志单独在其对应的端口的kibana界面里展示。
[root@elk-node03 ~]# vim /etc/cw-5601-kibana/kibana.yml 
server.port: 5601
server.host: "0.0.0.0"
kibana.index: ".cw-kibana"
elasticsearch.hosts: ["http://192.168.186.161:9200"]

# Kibana is served by a back end server. This setting specifies the port to use.
server.port: 5602
server.host: "0.0.0.0"
kibana.index: ".zl-kibana"
elasticsearch.hosts: ["http://192.168.186.161:9200"]
[root@elk-node03 ~]# egrep -v "#|^$" /etc/cw-5601-kibana/kibana.yml
server.port: 5601
server.host: "0.0.0.0"
elasticsearch.hosts: ["http://192.168.186.161:9200"]
kibana.index: ".cw-kibana"

[root@elk-node03 ~]# egrep -v "#|^$" /etc/zl-5602-kibana/kibana.yml
server.port: 5602
server.host: "0.0.0.0"
elasticsearch.hosts: ["http://192.168.186.161:9200"]
kibana.index: ".zl-kibana"

 提供服务脚本:

[root@elk-node03 ~]# cp -a /etc/systemd/system/kibana.service /etc/systemd/system/kibana_cw.service
[root@elk-node03 ~]# vim /etc/systemd/system/kibana_cw.service

 [root@elk-node03 ~]# cp -a /etc/systemd/system/kibana.service /etc/systemd/system/kibana_zl.service
[root@elk-node03 ~]# vim /etc/systemd/system/kibana_zl.service

启动服务: 

systemctl daemon-reload
systemctl start kibana_cw.service kibana_zl.service
systemctl enable kibana_cw.service kibana_zl.service  

查看:

 [root@elk-node03 ~]# lsof  -i :5601
COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
node    11604 kibana   18u  IPv4 185896      0t0  TCP *:esmagent (LISTEN)
[root@elk-node03 ~]# lsof  -i :5602
COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
node    11605 kibana   18u  IPv4 186696      0t0  TCP *:a1-msc (LISTEN)

配置nginx的反向代理以及访问验证

# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

# yum install nginx -y

配置虚拟主机:

 [root@elk-node03 ~]# cat /etc/nginx/conf.d/cw_kibana.conf
server {
   listen 15601;
   server_name localhost;

   location / {
     proxy_pass http://192.168.186.163:5601/;
     auth_basic "Access Authorized";
     auth_basic_user_file /etc/nginx/conf.d/cw_auth_password;
   }
}

配置虚拟主机:

 

[root@elk-node03 ~]# cat /etc/nginx/conf.d/zl_kibana.conf
server {
        isten 15602;
        server_name localhost;

   location / {
        proxy_pass http://192.168.186.163:5602/;
        auth_basic "Access Authorized";
        auth_basic_user_file /etc/nginx/conf.d/zl_auth_password;
        }
}

设置验证文件

[root@elk-node03 ~]# htpasswd -c /etc/nginx/conf.d/cw_auth_password cwlog
New password: 
Re-type new password: 
Adding password for user cwlog
[root@elk-node03 ~]# htpasswd -c /etc/nginx/conf.d/zl_auth_password zllog
New password: 
Re-type new password: 
Adding password for user zllog

启动nginx

 [root@elk-node03 ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@elk-node03 ~]# systemctl restart nginx
[root@elk-node03 ~]# systemctl enable nginx
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service.

2、查看 

 

 

 

三、ELK日志收集

3.1 客户机日志收集操作(Logstash

 3.1.1 logstash 介绍

        LogStash由 JRuby 语言编写,基于消息( message-based )的简单架构,并运行在 Java 虚拟机
JVM )上。不同于分离的代理端( agent )或主机端( server ), LogStash 可配置单一的代理端
agent )与其它开源软件结合,以实现不同的功能。
logStash 的四大组件
Shipper :发送事件( events )至 LogStash ;通常,远程代理端( agent )只需要运行这个组件即可;
Broker and Indexer :接收并索引化事件;
Search and Storage :允许对事件进行搜索和存储;
Web Interface :基于 Web 的展示界面
正是由于以上组件在 LogStash 架构中可独立部署,才提供了更好的集群扩展性。
LogStash 主机分类
        代理主机(agent host ):作为事件的传递者( shipper ),将各种日志数据发送至中心主机;只需运 行Logstash 代理( agent )程序;
        中心主机(central host ):可运行包括中间转发器( Broker )、索引器( Indexer )、搜索和存储器(Search and Storage )、 Web 界面端( Web Interface )在内的各个组件,以实现对日志数据的接收、处理和存储。

3.1.2 安装logstash

# yum install jdk-8u144-linux-x64.rpm
# yum install logstash-7.2.0.rpm
LogStash 初体验
logstash 的家目录创建三个文件夹。分别用来存放日志, conf 配置文件和 logstash 服务主配置

[root@elk-node03 ~]# mkdir -p /usr/share/logstash/{etc,config,logs}

[root@elk-node03 ~]# cp /etc/logstash/log4j2.properties /usr/share/logstash/config/

[root@elk-node03 ~]# cp /etc/logstash/logstash.yml /usr/share/logstash/config/
[root@elk-node03 ~]# ln -sv /usr/share/logstash/bin/logstash /usr/bin/logstash
'/usr/bin/logstash' -> '/usr/share/logstash/bin/logstash'

启动测试:
# logstash -e 'input { stdin { } } output { stdout {} }'
hello world
{
          "host" => "elk-node03",
      "@version" => "1",
       "message" => "hello world",
    "@timestamp" => 2024-07-02T06:32:51.307Z
}

 将屏幕输入的字符串输出到elasticsearch服务中

[root@elk-node03 ~]# logstash -e 'input { stdin{} } output { elasticsearch { hosts =>
> ["192.168.186.161:9200"] }}'

输入:hello stash,然后在elasticsearch中查看logstash新加的索引

 LogStash启动慢解决:

检查了一下系统的熵数池
[root@elk-node03 ~]# cat /proc/sys/kernel/random/entropy_avail 
3521
如果返回值小于 1000,大于就不用了 , 那么就需要安装 haveged 包。
# yum install http://rpmfind.net/linux/epel/7/x86_64/Packages/h/haveged-1.9.1-
1.el7.x86_64.rpm
[root@localhost ~] # systemctl start haveged
[root@localhost ~] # systemctl status haveged

3.1.3 logStash配置语法 

Logstash 社区通常习惯用 shipper broker indexer 来描述数据流中不同进程各自的角色。 如下
图:

 

语法:
Logstash 设计了自己的 DSL ,包括有区域, 注释, 数据类型 ( 布尔值, 字符串, 数值, 数组, 哈希) , 条件判断, 字段引用等。
区段 (section)

Logstash 用 {} 来定义区域。 区域内可以包括插件区域定义, 你可以在一个区域内定义多个插件。

input {
        stdin {}
        syslog {}
}

数据类型

Logstash 支持少量的数据值类型:

bool debug = > true
string host = > "hostname"
number port = > 514
array match = > [ "datetime" , "UNIX" , "ISO8601" ]
hash options = > {
key1 = > "value1" ,
key2 = > "value2" }
字段引用 (field reference)
        在 Logstash 配置中使用字段的值, 只需要把字段的名字写在中括号 [] 里就行了, 这就叫字段引用。
条件判断 (condition)
Logstash 1.3.0 版开始支持条件判断和表达式。

 表达式支持下面这些操作符:

== ( 等于 ), != ( 不等于 ), < ( 小于 ), > ( 大于 ), <= ( 小于等于 ), >= ( 大于等于 )
=~ ( 匹配正则 ), !~ ( 不匹配正则)
in ( 包含 ), not in ( 不包含 )
and ( ), or ( ), nand( 非与 ), xor( 非或 )
() ( 复合表达式 ), !() ( 对复合表达式结果取反 )

命令行参数

Logstash 提供了一个 shell 脚本叫 logstash 方便快速运行。 它支持以下参数: -e ,即执行
--config -f ,意即文件
--configtest -t ,意即测试
--log -l ,意即日志。

设置文件

 从 Logstash 5.0 开始, 新增了 $LS_HOME/config/logstash.yml 文件, 可以将所有的命令行参数都通过 YAML 文件方式设置。 同时为了反映命令行配置参数的层级关系, 参数也都改成用:而不是-了。

3.1.4 logstash插件  

学习编写 conf 格式
输入插件配置,此处以读取文件 file 为例,可以设置多个
记住一个原则: Logstash 配置一定要有一个 input 和一个 output
如果没有写明 input ,默认就会使用 input/stdin ,同理,没有写明的 output 就是 output/stdout
input {
        file {
                path = > "/var/log/messages"
                type = > "syslog"
        }
file {
        path = > "/var/log/apache/access.log"
        type = > "apache"
        }
}
收集文件的方式,可以使用数组方式或者用 * 匹配,也可以写多个 path
path = > [ "/var/log/messages" , "/var/log/*.log" ]
path = > [ "/data/mysql/mysql.log" ]
学习编写 input file 插件
input 插件之 file
sincedb_path :记录 logstash 读取位置的路径
start_postion : 包括 beginning end ,指定收集的位置,默认是 end ,从尾部开始
add_field 加一个域
discover_internal 发现间隔,每隔多久收集一次,默认 15
input {
        file {
                path = > [ "/var/log/*.log" , "/var/log/message" ]
                type = > "system"
                start_position = > "beginning"
        }
}
output file 插件
output {
        file {
                path = > ...
                codec = > line { format = > "custom format: %{message}" }
        }
}

3.2 客户机日志收集操作(Filebeat

Beats 是用于单用途数据托运人的平台。它们以轻量级代理的形式安装,并将来自成百上千台机器的数据发送到Logstash Elasticsearch
通俗地理解,就是采集数据,并上报到 Logstash Elasticsearch
Beats 对于收集数据非常有用。它们位于你的服务器上,将数据集中在 Elasticsearch 中, Beats 也可以发送到Logstash 来进行转换和解析。

3.2.1 安装 Filebeat

# yum install filebeat-7.2.0-x86_64.rpm

3.2.2 配置 Filebeat

配置文件: filebeat.yml
filebeat 默认的配置文件为 filebeat.yml,filebeat 还提供了一个比较完整的配置文件
filebeat.reference.yml
inputs 支持的 type 有:
        log
        sdtin
        redis
        udp
        tcp
        syslog
outputs 支持的类型有:
        logstash
        elasticsearch
        kafka
        file
        redis
        console

场景1:输入为file,输出为console  

[root@Filebeat filebeat]# vim file_console.yml

#============ Filebeat inputs ====================
filebeat.inputs:

## 配置多个input
- type: log
  enabled: true
  paths:
## 配置多个log
    - /tmp/echo1.log
    - /tmp/echo2.log

    
- type: log
paths:
## 通配符
   - /opt/*.log
#================ Console output ================
output.console:
   pretty: true

测试:

 [root@localhost filebeat]# filebeat -e -c file_console.yml

打开另一终端:给测试文件追加内容
[root@localhost filebeat] # echo hello >> /tmp/echo1.log
{
  "@timestamp": "2024-07-02T07:17:05.552Z",
  "@metadata": {
    "beat": "filebeat",
    "type": "_doc",
    "version": "7.4.0"
  },
  "log": {
    "offset": 6,
    "file": {
      "path": "/tmp/echo1.log"
    }
  },
  "message": "hello",
  "input": {
    "type": "log"
  },
  "ecs": {
    "version": "1.1.0"
  },
  "host": {
    "name": "Filebeat"
  },
  "agent": {
    "ephemeral_id": "1d365811-2178-4742-b26a-28307dad2bcc",
    "hostname": "Filebeat",
    "id": "88c4bee9-c823-406d-9341-3470ee4c6df6",
    "version": "7.4.0",
    "type": "filebeat"
  }
}

场景2:输出为file  

[root@Filebeat filebeat]# cat file_file.yml
filebeat.inputs:

- type: log
  enabled: true
  paths:
          - /tmp/echo1.log

output.file:
        path: /home/logstash/

        filename: filebeat_file_2_file_out 

 测试:

[root@localhost filebeat] # filebeat -e -c file_file.yml
打开另一终端:给测试文件追加内容
[root@localhost filebeat] # echo hello2 >> /tmp/echo1.log
运行两次后查看:
[root@Filebeat filebeat]# ll /home/logstash/
总用量 8
-rw------- 1 root root 420 7月   2 16:08 filebeat_file_2_file_out
-rw------- 1 root root 420 7月   2 15:21 filebeat_file_2_file_out.1
 

 场景3:输出为logstash

filebeat 配置

 [root@Filebeat filebeat]# cat file_logstash.yml
filebeat.inputs:

- type: log
  enabled: true
  paths:
          - /tmp/echo1.log

output.logstash:
        hosts: ["127.0.0.1:5054"]

 logstash配置

[root@elk-node03 conf.d]# cat filebeat_in.conf
input {
    beats {
        port => 5054
    }
}
output {
    stdout {}
}

 测试:三个终端

一个开启 filebeat [root@localhost filebeat]# filebeat -e -c file_logstash.yml
一个开启 logstash [root@localhost conf.d]# logstash -f filebeat_in.conf
另一个追加数据: # echo hello5 >> /tmp/echo1.log
logstash 输出:
{
        "message" = > "hello5" ,
                "ecs" = > {
        "version" = > "1.0.0"
        ...
        },
        "input" = > {
        "type" = > "log"
        }
}

场景4:输出为elasticsearch 

[root@Filebeat filebeat]# cat file_elasticsearch.yml
filebeat.inputs:
- type: log
  enabled: true
  paths:
          - /tmp/echo1.log

output.elasticsearch:
        hosts: ["192.168.186.161:9200","192.168.186.162:9200","192.168.186.163:9200"]

测试:

[root@localhost filebeat]# filebeat -e -c file_elasticsearch.yml

[root@localhost filebeat] # echo hello6 >> /tmp/echo1.log

 默认索引是:filebeat-

自定义索引:

[root@Filebeat filebeat]# cat file_elasticsearch2.yml 
setup.template.enabled: false
setup.template.name: 'demo_index'
setup.template.pattern: 'demo_index-*'
setup.ilm.rollover_alias: 'demo_index'
setup.template.overwrite: true
filebeat.inputs:

- type: log
  enabled: true
  paths:
          - /tmp/echo1.log
output.elasticsearch:
        hosts: ["192.168.186.161:9200","192.168.186.162:9200","192.168.186.163:9200"]
        index: "demo_index--%{[beat.version]}-%{+yyyy.MM}"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/39594.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JVM专题之垃圾收集算法

标记清除算法 第一步:标记 (找出内存中需要回收的对象,并且把它们标记出来) 第二步:清除 (清除掉被标记需要回收的对象,释放出对应的内存空间) 缺点: 标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致以后在程序运行过程中需 要分配较大对象时,无法找到…

反射--通俗易懂

一、反射(Reflection) 反射就是:加载类&#xff0c;并允许以编程的方式解剖类中的各种成分(成员变量、方法、构造器等) 动态语言&#xff0c;是一类在运行时可以改变其结构的语言&#xff1a;例如新的函数、对象、甚至代码可以被引进&#xff0c;已有的函数可以被删除或是其他…

多重奖励拿到手软,OPENAIGC开发者大赛燃爆这个夏天!

你是否渴望在AI领域一展身手&#xff1f; 你是否拥有开创性的技术和创意&#xff1f; 2024 OPENAIGC开发者大赛就是你的最佳舞台&#xff01; 不论你是经验丰富的开发者&#xff0c; 还是技术领域的创新者&#xff0c; 都有机会在这里大放异彩&#xff01; 由联想拯救者、…

每日一题 7月1日

1 设数组data[m]作为循环队列的存储空间,front为队头指针,rear为队尾指针,则执行出队操作后其头指针front值为____ 2 采用滑动窗口机制对两个相邻结点A(发送方)和B(接收方)的通信过程进行流量控制。假定帧的序号长度为3比特,发送窗口与接收窗口的大小均为7,当A发送了…

分析Profiler Timeline中的算子序列,通过寻找频繁项集的办法,得到TOPK可融合的算子序列

分析Profiler Timeline中的算子序列,通过寻找频繁项集的办法,得到TOPK可融合的算子序列 1.相关链接2.代码【仅分析带通信算子的Pattern】3.在实际工程中发现 [all_gather, matrix_mm_out]频率最高4.[Ascend MC2](https://gitee.com/ascend/MindSpeed/blob/master/docs/features…

1:25万基础电子地图(西藏版)

我们为你分享过四川版、云南版、江西版、贵州版、重庆版和青海版的1比25万基础电子地图&#xff0c;现在再为你分享西藏版的电子地图。 如果你需要西藏版的1比25万基础电子地图&#xff0c;你可以在文末查看该数据的领取方法。 基础电子地图西藏版 西藏版1:25万基础电子地图…

压缩pdf文件大小,压缩pdf文件大小软件哪个好

在数字化时代&#xff0c;PDF文件因其卓越的跨平台兼容性和稳定性而成为工作与学习的好帮手。然而&#xff0c;当PDF文件体积过大时&#xff0c;传输和存储便成了一项挑战。别担心&#xff0c;本文将为你揭秘如何快速压缩PDF文件&#xff0c;让你的文档轻装上路&#xff01; 压…

postman请求访问:认证失败,无法访问系统资源

1、使用postman时&#xff0c;没有传入相应的token&#xff0c;就会出现这种情况&#xff0c;此时需要把token放进去 发现问题: { "msg": "请求访问&#xff1a;/getInfo&#xff0c;认证失败&#xff0c;无法访问系统资源", "code": 401 } 1…

Monorepo(单体仓库)与 MultiRepo(多仓库): Monorepo 单体仓库开发策略与实践指南

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 一、引言1. Monorepo 和 MultiRepo 简介2. 为什么选择 Monorepo&#xff1f; 二、Monorepo 和 MultiRepo 的区别1. 定义和概述2. 各自的优点和缺点3. 适用场景 三、Monorepo 的开发策略1. 版本控制2. 依赖管理3. 构建和发布…

python-切片、集合

序列是指&#xff1a;内容连续、有序&#xff0c;可使用下标索引的一类数据容器 序列的常用操作 - 切片 切片的语法 序列的常用操作 - 切片 注意切片的范围是左闭右开 为什么使用集合 集合的常用操作 - 修改 集合的常用操作 - 集合长度 集合常用功能总结 集合的特点

程序员鱼皮的写简历指南(保姆级)2、简历优化

大家好&#xff0c;我是程序员鱼皮。做知识分享这些年来&#xff0c;我看过太多简历、也帮忙修改过很多的简历&#xff0c;发现很多同学是完全不会写简历的、会犯很多常见的问题&#xff0c;不能把自己的优势充分展示出来&#xff0c;导致措施了很多面试机会&#xff0c;实在是…

AI时代来临,程序员如何应对AI挑战?

随着 AI 技术的飞速发展&#xff0c;特别是大模型的出现&#xff0c;传统的程序员角色正在经历深刻的变革&#xff0c;AI 已经对现有的软件开发模式和程序员的工作模式造成了冲击&#xff0c;并且大语言模型在某些特定语言内的表现甚至超过了大部分的程序员。 但人工智能没有情…

深度学习——卷积神经网络(convolutional neural network)CNN详解(一)——概述. 步骤清晰0基础可看

在CNN的学习过程中我会提供相应的手算例子帮助理解训练过程。 其他关于神经网络的学习链接如下&#xff1a; 一、了解卷积神经网络 卷积神经网络的作用 总的来说&#xff0c;卷积神经网络的第一个主要作用是对图像进行特征提取&#xff0c;所谓特征提取&#xff0c;就是明白…

java入门-基础语法(运算符)

运算符是对变量、字面量进行运算的 符号 &#xff08;一&#xff09;基本的算术运算符、符号做连接符 &#xff08;1&#xff09;基本运算符&#xff1a;(加)&#xff0c; - &#xff08;减&#xff09;、 * &#xff08;乘&#xff09;、 / &#xff08;除&#xff09;、%&…

有哪些好的 Stable Diffusion 提示词(Prompt)可以参考?

Docker 作图咒语生成器 docker-prompt-generator 是一个开源项目&#xff0c;可以利用模型反推出提示词&#xff0c;让你偷偷懒&#xff0c;无需琢磨怎么写prompt&#xff0c;只需要找一个差不多的模型反推一下&#xff0c;直接用就好了&#xff0c;支持支持 MidJourney、Stab…

linux中的进程以及进程管理

程序和进程的区别和联系 程序&#xff08;Program&#xff09;&#xff1a; 程序是一组指令的集合&#xff0c;通常存储在磁盘或其他存储设备上&#xff0c;是一种静态的概念。程序本身并没有运行&#xff0c;它只是一个可执行的文件或脚本&#xff0c;包含了一系列的指令和数…

42、nginx之nginx.conf

nginx----web服务器 一、nginx http就是apache&#xff0c;在国内很少。 nginx是开源的&#xff0c;是一款高性能&#xff0c;轻量级的web服务软件。 稳定性高&#xff0c;而且版本迭代比较快&#xff08;修复bug速度比较快&#xff0c;安全性快&#xff09; 消耗系统资源…

uni-app打包小程序的一些趣事~

前言 Huilderx版本&#xff1a;4.15 uni-app Web端版本&#xff1a;3.4.21 问题1 Web端/APP端样式好好的&#xff0c;打包微信小程序就乱了咋整&#xff1f; 使用::v-deep/::deep/deep(){}都是没用滴~~ 原因&#xff1f; 解决&#xff1a; <script lang"ts"…

python小练习04

三国演义词频统计与词云图绘制 import jieba import wordcloud def analysis():txt open("三国演义.txt",r,encodingutf-8).read()words jieba.lcut(txt)#精确模式counts {}for word in words:if len(word) 1:continueelif word "诸葛亮" or word &q…

RK3568驱动指南|第十五篇 I2C-第183章 SMBus总线介绍

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…