ELK安装

 

一 ELK

参考链接https://www.elastic.co/guide/en/elasticsearch/reference/6.0/getting-started.html

image-20200803141734694

 

1 ELK系统

产生背景

为什么要用ELK

【问题排查困难】查询一个服务的日志,需要登录多台服务器;
【日志串接困难】一个流程有多个节点,要把整个流程的日志串接起来工作量大;
【运维管理困难】不是每个同事都有登录服务器查看日志的权限,但又需要根据日志排查问题,就需要有权限的同事下载日志后给到相应负责的同事。
【系统预警困难】无法实现服务出现异常后,及时通知到相应的负责人。

所以需要搭建一套集中式的日志收集、存储、分析系统,将所有节点的日志统一收集、管理
因此选用了ELK

版本介绍

官方推荐【普通用户】启动服务

elasticsearch-7.5.1-linux-x86_64.tar.gz             需要java环境 
kibana-7.5.1-x86_64.rpm                               java环境
logstash-7.5.1.rpm                                     java环境        
filebeat-7.5.1.rpm

安装环境自定义

 

Java环境

如果你服务器中有java环境可忽略此部署操作

 

JDK1.8 安装

linux下安装jdk1.8

解压:

tar xf jdk-8u211-linux-x64.tar.gz
ln -s /data/jdk1.8.0_211 /data/jdk1.8


export JAVA_HOME=/data/jdk1.8
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin

source /etc/profile.d/jdk1.8.sh

 

2 Elasticsearch

下载地址:elasticsearch

用于日志数据存储
端口号:
    #9200
    #9300

解压:

【需要jdk环境】

配置:

####集群名称####
cluster.name: xssh                        
#跨域访问
http.cors.enabled: true
http.cors.allow-origin: "*"               #跨域访问
#节点名称
node.name: node-1
#node.attr.rack: r1
#path.data: /path/to/data
#path.logs: /path/to/logs

bootstrap.memory_lock: false
bootstrap.system_call_filter: false       #内存锁关闭.
network.host: 0.0.0.0                                           #也可以改成主机的ip
http.port: 9200
discovery.seed_hosts: ["192.168.24.129", "192.168.24.133","192.168.24.130"]    #es集群的ip
cluster.initial_master_nodes: ["node-1","node-2","node-3"]                      

【修改系统配置】

vim /etc/security/limits.conf
* soft memlock unlimited
* hard memlock unlimited
* soft nofile 131072
* hard nofile 131072
vim /etc/sysctl.conf
vm.max_map_count=262144

授权:

chown  -R forest /data/es1/*

启动:

一定要非root用户启动
/data/es1/bin/elasticsearch -d  &

命令:

一下命令是简单使用

查看集群数量

curl 'localhost:9200/_cat/nodes?v'
ip             heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
192.168.24.130           21         63   0   0.00   0.01     0.05 dilm     *     node-2
192.168.24.133           14         58   0   0.03   0.03     0.05 dilm     -     node-1

查看集群机器状态

curl 'localhost:9200/_cat/health?v'
epoch      timestamp cluster status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent

1597743190 09:33:10 xssh   green           2         2     16   8   0   0       0         0       -       100.0%

查看索引

curl http://localhost:9200/_cat/indices?v

删除索引

删除一个叫wwh_test3的索引
curl -XDELETE  http://192.168.24.130:9200/wwh_test3

 

3 kibana

日志收集后,出图,展示
端口:5601

安装:

yum -y localinstall  kibana-7.5.1-x86_64.rpm

配置:

vim /etc/kibana/kibana.yml
server.host: "192.168.24.128"                                   #第7行

elasticsearch.hosts: ["http://192.168.24.133:9200"]             #第28行 改成es的主机地址

启动:

systemctl restart kibana.service

开机自启

systemctl  enable  kibana.service

查看:

jps命令

注意事项⭐

日志收集等配置文件的格式一定要注意!!!!
格式!!!
格式!!!
格式!!!

4 logstash

主要用于提取redis中日志,过滤.输出到ES中.
端口号:9600

安装:

【需要jdk环境】

yum -y localinstall logstash-7.5.1.rpm

配置:

收集日志的配置文件都需要写在在此目录下面

/etc/logstash/conf.d

启动:

systemctl start logstash

启动报错

# journalctl  -ex
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit logstash.service has finished shutting down.
814 11:40:47 kibana systemd[1]: Started logstash.
-- Subject: Unit logstash.service has finished start-up
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit logstash.service has finished starting up.
--
-- The start-up result is done.

#######################################################################
 ##!!!could not find java没有找到java环境,修改如下文件                                                                                                       /usr/share/logstash/bin/logstash.lib.sh        
                                            ####################################################################
                                           
814 11:40:47 kibana logstash[91224]: could not find java; set JAVA_HOME or ensure java is in PATH  
814 11:40:47 kibana systemd[1]: logstash.service: main process exited, code=exited, status=1/FAILURE
814 11:40:47 kibana systemd[1]: Unit logstash.service entered failed state.
814 11:40:47 kibana systemd[1]: logstash.service failed.
814 11:40:47 kibana systemd[1]: logstash.service holdoff time over, scheduling restart.
814 11:40:47 kibana systemd[1]: Stopped logstash.
-- Subject: Unit logstash.service has finished shutting down
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit logstash.service has finished shutting down.
814 11:40:47 kibana systemd[1]: start request repeated too quickly for logstash.service
814 11:40:47 kibana systemd[1]: Failed to start logstash.
-- Subject: Unit logstash.service has failed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel

备份修改文件

cp   /usr/share/logstash/bin/logstash.lib.sh   /usr/share/logstash/bin/logstash.lib.sh.bak
vim  /usr/share/logstash/bin/logstash.lib.sh
###大概在18行位置添加如下
 18 export JAVA_HOME=/data/jdk1.8/                     #自己的java环境的位置
19 export PATH=$PATH:$JAVA_HOME/bin
如果是其它报错,请检查配/etc/logstash/conf.d下的配置文件的规范格式

重启

systemctl restart logstash

开机自启

systemctl enable logstash

测试:

(1).测试使用

 /usr/share/logstash/bin/logstash  -e 'input {  stdin{} } output { stdout{  codec => rubydebug }}'  #标准输入和输出
[INFO ] 2020-08-17 17:28:23.455 [Api Webserver] agent - Successfully started Logstash API endpoint {:port=>9601}
Hi,lzl        
/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/awesome_print-1.7.0/lib/awesome_print/formatters/base_formatter.rb:31: warning: constant ::Fixnum is deprecated
{
      "message" => "Hi,lzl",                           #信息
   "@timestamp" => 2020-08-17T09:28:43.035Z,           #时间戳
         "host" => "kibana",                           #主机名
     "@version" => "1"                                  
}

(2).检查语义

/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/文件.conf  -t
 -f 指定配置文件
-t 检查语义

示例:#检查game_elfk.conf是否有语义错误
/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/game_elfk.conf -t
#检查game_elfk.conf是否有语义错误

 

5 FileBeat

安装在日志对象的主机机器上,用于收集日志
轻量,消耗占用资源少

安装:

yum -y localinstall filebeat-7.5.1-x86_64.rpm 

#查看filebeat的文件

 rpm -ql  filebeat
/etc/filebeat/fields.yml
/etc/filebeat/filebeat.reference.yml
/etc/filebeat/filebeat.yml                     #filebeat的配置文件
...
...

启动:

开机自启

systemctl enable filebeat

filebeat 收集配置测试是否成功

filebeat -e

 

6.收集

elk架构比较灵活,收集方式很多种,下面简单写些例子
1.filebeat=>elasticsearch=>kibana
2.filebeat=>redis=>logstash=>elasticsearch=>kibana
3.filebeat=>kafka=>logstash=>elasticsearch=kibana
....

 

收集方式1:

filebeat直接输出es

filebeat收集多种日志

【filebeat】==>【ES】==>【kibana】
问题:多个路径的日志需要收集到es中
解决:写多个路径,并打上tags
vim /etc/filebeat/filebeat.yml
filebeat.inputs:
############

##############【es的日志】 ################
- type: log
enabled: true
paths:
   - /var/log/elasticsearch/elasticsearch.log
multiline.pattern: '^\['
multiline.negate: true
multiline.match: after
tags: ["es"]
################【nginx的日志】##############
- type: log
enabled: true
paths:
   - /data/nginx/logs/error.log
# json.keys_under_root: true
# json.overwrite_keys: true
tags: ["nginx"]
################【java的日志】##########
- type: log
enabled: true
paths:
   - /data/home/user00/log/archived/h5_auth_cat.error.2020-06-17.log
multiline.pattern: '^\['
multiline.negate: true
multiline.match: after
tags: ["cat"]
#################【auth的java日志】###############
- type: log
enabled: true
paths:
   - /data/home/user00/log/archived/h5_auth.2020-06-17.log
multiline.pattern: '^\['
multiline.negate: true
multiline.match: after
tags: ["auth"]

###############################
#kibana的ip地址
setup.kibana:
host: "192.168.24.128:5601"
##############【输出对象】#######
output.elasticsearch:
hosts: ["192.168.24.133:9200","192.168.24.130:9200"]
indices:
   - index: "es-%{[agent.version]}-%{+yyyy.MM.dd}"               #es日志的索引
    when.contains:
      tags: "es"
   - index: "auth-error-%{[agent.version]}-%{+yyyy.MM.dd}}"       #auth日志的索引
    when.contains:
      tags: "auth"
   - index: "cat-error-%{[agent.version]}-%{+yyyy.MM.dd}"         #cat日志索引
    when.contains:
      tags: "cat"
   - index: "nginx-error-%{[agent.version]}-%{+yyyy.MM.dd}"       #nginx日志索引
    when.contains:
      tags: "nginx"


setup.template.name: "es"               #索引模板名称    
setup.template.pattern: "es-*"                    
setup.template.overwrite: true          #模板重写
setup.template.enabled: false            #是否开启

#此项设置成【false】!!!!页面不然会一直是默认的filebeat索引开头
setup.ilm.enabled: false                
setup.template.settings:
index.number_of_shards: 3                #分片数


####【下面加不加目前不影响】######
#processors:
# - add_host_metadata: ~
# - add_cloud_metadata: ~
# - add_docker_metadata: ~
# - add_kubernetes_metadata: ~
#

【以上是filebeat直接收取目录日志到es中,如果是收集单个日志,根据上面参考修改即可】

启动:

filebeat

systemctl restart filebeat

收集方式21.filebeat>redis>logstash>ES

问题:收集日志量较多,较大,如果logstas宕了,可能导致数据丢失,不完整。
解决:中间加redis做消息队列进行缓冲。
1.【filebeat】==>【redis】==>【logstash】==>【ES】

#redis安装

yum -y install redis

#redis添加密码

vim /etc/redis.conf  +481               #481行左右打开  requirepass foobared的注释,foobared为密码,可以改成自己想改的
requirepass foobared

#redis启动

systemctl restart redis

#redis开机自启

systemctl enable redis

#redis密码登陆

127.0.0.1:6379> AUTH foobared
OK
单日志收集
收集java日志
【filebeat配置】
vim /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: log
  enabled: true
  paths:
  - /data/home/user00/log/forest_error.log
  multiline.pattern: '^\['
  multiline.negate: true
  multiline.match: after                #是否是json格式

setup.template.settings:
  index.number_of_shards: 5             #分片数

setup.kibana:                                      
  host: "192.168.24.128:5601"           #kibana的链接

setup.template.name: "error"            #索引模板
setup.template.pattern: "error-*"               
setup.template.enabled: false
setup.template.overwrite: true
setup.ilm.enabled: false

output.redis:                            # 输出对象redis
  hosts: ["192.168.24.131:6379"]    	 # redis地址
  key: "forest"    # 在reidis内创建的key名称
  db: 0
  password: "foobared" 
  timeout: 5

image-20200813195132850

【logstash配置】
vim /etc/logstash/conf.d/logstash_ceshi.conf
input {                                         #输入对象
  redis {                                       #redis
    data_type => "list"                         #数据类型 list
    key => "forest"                             #key识别数据
    host => "192.168.24.131"                    #redis所在主机地址
    port => "6379"                              #端口
    db => "0"                                   #库
    password => "foobared"
}}
output {                                        #输出对象
  elasticsearch {                               #elasticsearch
    hosts => ["192.168.24.133:9200"]            #输出对象ip地址
    index =>"forest_err_%{+YYYY.MM.dd}"          #索引展示
}}

检查语义

/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/logstash_ceshi.conf  -t

启动:

filebeat

systemctl restart filebeat

logstash

systemctl restart logstash
多日志收集
问题:
【一台主机需要收集多个路径的日志输入到同一个库】
收集java日志,和nginx日志
输入到redis库(db4)中并利logstash取出到es中

解决:
1.我们给不同的日志文件打上标签(tags),输入redis后,logstash通过判断标签(tags)来进行匹配收集数据,并输出到es中,展示到kibana中.
2.不同主机的日志输入到同一个redis库中,通过tags做标识,然后logstash通过判断tags,也不会影响数据。
配置如下

filebeat配置

vim /etc/filebeat/filebeat.yml
filebeat.inputs: 
- type: log                                           #类型
  enabled: true                                       #开启filebeat收集
  paths:                                              #日志路径
    - /var/log/forest_bench.log                       #日志对象forest_bench.log
  tags: ['134_forest_bench']                          #记住此tags标签,logstash取日志时,需要通过此tags进行判断。
  multiline.pattern: '^\['                            #匹配规则
  multiline.negate: true
  multiline.match: "after"

- type: log
  enabled: true
  paths:
    -  /data/nginx/logs/error.log                      #收集的日志位置
  multiline.pattern: '^\['                             #匹配规则
  multiline.negate: true
  multiline.match: after
  tags: ['134_nginx']                                  #记住此标签。
 

setup.template.settings:
  index.number_of_shards: 5                           #分片数
setup.kibana:                                         #kibana链接
  host: "192.168.24.128:5601"                         #kibana所在主机ip

output.redis:                                         #输出对象redis
  hosts: ["192.168.24.131:6379"]                      # redis所在主机的ip地址
  date_type: "list"                                   #数据类型
  key: "forest"                                       #在reidis内创建的key名称
  db: 4                                               #redis的库
  password: "foobared" 
  timeout: 5                                           

【logstash配置】

vim /etc/logstash/conf.d/logstash_ceshi.conf
input {
  redis {                                               #redis
    data_type => "list"                                         
    key => "forest"                                     #通过key识别
    host => "192.168.24.131"                            #redis主机ip
    port => "6379"                                      #redis端口
    db => "4"                                           #reids库                         
    password => "foobared"
}}
output {                                               #输出
  if "134_nginx" in [tags] {                           #通过匹配tags判断日志源.
    elasticsearch {                                    #输出对象
      hosts => ["192.168.24.133:9200"]                 #输出对象主机ip
      index => "134_nginx_err_more_%{+YYYY.MM.dd}"     #索引展示名称
}}
  if "134_forest_bench" in [tags] {                    
    elasticsearch {                                  
      hosts => ["192.168.24.133:9200"]
      index => "134_forest_err_more_%{+YYYY.MM.dd}"
}}}

#判断filebeat语义是否有问题

filebeat -e

#判断logstash语义是否有问题

/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/logstash_ceshi.conf -t    

启动:

filebeat

systemctl restart filebeat

logstash

systemctl restart logstash

7.索引

清理索引:

时间长了,各种索引时间越来越多,要及时清理.
脚本:
清理一个月前的日志
vim clean_index.sh
#!/bin/bash
DATE=`date +%Y-%m -d -1month`
#echo $DATE
curl -XDELETE  http://localhost:9200/128_game_err_more_$DATE-%"

 

8.调优

1.清理缓存
curl -XPOST "localhost:9200/_cache/clear"

redis

参考链接:cnblog

优化方向

(1)filebeat可以直接输入到logstash(indexer),但logstash没有存储功能,如果需要重启需要先停所有连入的beat,再停logstash,造成运维麻烦;另外如果logstash发生异常则会丢失数据;引入Redis作为数据缓冲池,当logstash异常停止后可以从Redis的客户端看到数据缓存在Redis中;

(2)Redis可以使用list(最长支持4,294,967,295条)或发布订阅存储模式;

(3)redis 做elk 缓冲队列的优化:

 bind 0.0.0.0 #不要监听本地端口

 requirepass xxxx #加密码,为了安全运行

③只做队列,没必要持久存储,把所有持久化功能关掉:快照(RDB文件)和追加式文件(AOF文件),性能更好

save "" 禁用快照

appendonly no 关闭RDB

④ 把内存的淘汰策略关掉,把内存空间最大

 

kibana

优化方向

优化查询语句
1、少用* 等匹配方式
2、尽量指定字段进行匹配,而不是全文索引
3、页面刷新间隔时间一般是设置15分钟
4、es优化
5、kibana集群减轻master或client压力
6、不同的visualize,dashboard建立的视图都应该用刷新间隔至少30分钟以上Save保存;这样就不会导致每个运维打开页面后,visualize,dashboard都在实时刷新,越是查询范围广的,刷新间隔时间约要设置长,例如查全量的404,500有哪些域这种是全量查询,设置的刷新时间要更长一些

logstash

参考链接:

logstash调整分析

logstash.yml的配置参考

【原文】:
检查JVM堆:
如果堆大小太低,通常CPU利用率经常会上升,从而导致JVM不断进行垃圾收集。
频繁的垃圾回收或与内存不足异常相关的JVM崩溃,超出最佳范围的值会导致性能下降。
检查此问题的快速方法是将堆大小加倍,并查看性能是否有所提高。不要增加堆大小超过物理内存量。为操作系统和其他进程留出至少1GB的可用空间。
您可以使用jmap随Java一起分发的命令行实用程序或使用VisualVM 对JVM堆进行更准确的测量。有关更多信息,请参见分析堆。
始终确保将最小(Xms)和最大(Xmx)堆分配大小设置为相同的值,以防止在运行时调整堆大小,这是一个非常昂贵的过程。
【结论】:最小值(Xms)和最大值(Xmx)最好改成一样的    

调整Logstash工作程序设置:
首先使用该-w标志扩大管道工人的数量。这将增加可用于过滤器和输出的线程数。如果需要,可以安全地将其扩展到多个CPU内核,因为线程可以在I / O上变为空闲状态。
您也可以调整输出批次大小。对于许多输出,例如Elasticsearch输出,此设置将对应于I / O操作的大小。对于Elasticsearch输出,此设置对应于批次大小。

(1).运行内存调优

vim /etc/logstash/jvm.options
 1 ## JVM configuration
  2 
  3 # Xms represents the initial size of total heap space
  4 # Xmx represents the maximum size of total heap space
  5 
  #堆内存分配的最小值
  6 -Xms1g              
  #堆内存分配的最大值 
  7 -Xmx1g             

(2).logstash.yml 优化

vim /etc/logstash/logstash.yml 
1)可以优化的参数,可根据自己的硬件进行优化配置

① pipeline 线程数,官方建议是等于CPU内核数

默认配置 ---> pipeline.workers: 2

可优化为 ---> pipeline.workers: CPU内核数(或几倍cpu内核数)

③ 每次发送的事件数

默认配置 ---> pipeline.batch.size: 125

可优化为 ---> pipeline.batch.size: 1000

④ 发送延时

默认配置 ---> pipeline.batch.delay: 5

可优化为 ---> pipeline.batch.size: 10

elasticsearch

(b)limits.conf 配置

vim /etc/security/limits.conf

elasticsearch    soft    nofile          65535
elasticsearch    hard    nofile          65535
elasticsearch    soft    memlock         unlimited
elasticsearch    hard    memlock         unlimited
 
(c)为了使以上参数永久生效,还要设置两个地方

vim /etc/pam.d/common-session-noninteractive

vim /etc/pam.d/common-session

添加如下属性:

session required pam_limits.so

可能需重启后生效


(2)elasticsearch 中的jvm.options配置文件

-Xms2g

-Xmx2g

将最小堆大小(Xms)和最大堆大小(Xmx)设置为彼此相等。

Elasticsearch可用的堆越多,可用于缓存的内存就越多。但请注意,太多的堆可能会使您长时间垃圾收集暂停。

设置Xmx为不超过物理RAM的50%,以确保有足够的物理内存留给内核文件系统缓存。

不要设置Xmx为JVM用于压缩对象指针的临界值以上;确切的截止值有所不同,但接近32 GB。不要超过32G,如果空间大,多跑几个实例,不要让一个实例太大内存


(4)集群的优化

① ES是分布式存储,当设置同样的cluster.name后会自动发现并加入集群;

② 集群会自动选举一个master,当master宕机后重新选举;

③ 为防止"脑裂",集群中个数最好为奇数个

④ 为有效管理节点,可关闭广播 discovery.zen.ping.multicast.enabled: false,并设置单播节点组discovery.zen.ping.unicast.hosts: ["ip1", "ip2", "ip3"]

 

性能

性能的检查
(1)检查输入和输出的性能

#Logstash和其连接的服务运行速度一致,它可以和输入、输出的速度一样快。

(2)检查系统参数

① CPU

#注意CPU是否过载。在Linux/Unix系统中可以使用top -H查看进程参数以及总计。
#如果CPU使用过高,直接跳到检查JVM堆的章节并检查Logstash worker设置。

 

② Memory

#注意Logstash是运行在Java虚拟机中的,所以它只会用到你分配给它的最大内存。
#检查其他应用使用大量内存的情况,这将造成Logstash使用硬盘swap,这种情况会在应用占用内存超出物理内存范围时。

 

③ I/O 监控磁盘I/O检查磁盘饱和度

#使用Logstash plugin(例如使用文件输出)磁盘会发生饱和。
#当发生大量错误,Logstash生成大量错误日志时磁盘也会发生饱和。
#在Linux中,可使用iostat,dstat或者其他命令监控磁盘I/O


④ 监控网络I/O

#当使用大量网络操作的input、output时,会导致网络饱和。
#在Linux中可使用dstat或iftop监控网络情况。


(3)检查JVM heap

 # heap设置太小会导致CPU使用率过高,这是因为JVM的垃圾回收机制导致的。
 # 一个快速检查该设置的方法是将heap设置为两倍大小然后检测性能改进。不要将heap设置超过物理内存大小,保留至少1G内存给操作系统和其他进程。

#  你可以使用类似jmap命令行或VisualVM更加精确的计算JVM heap

分片

当日志量大时,单个分片存在查询慢(默认是1),所以根据具体情况调整分片数

手动设置分片

参考链接:内容类型检查

#原文
Elasticsearch 6.0中即将进行的更改之一是严格的内容类型检查。
有什么变化?
从Elasticsearch 6.0开始,所有包含主体的REST请求还必须为该主体提供正确的内容类型
####
当我们手动添加索引分片时,要加-H指定,不然报错
#  -H  "Content-Type: application/json"
curl -H  "Content-Type: application/json"  -X PUT 'http://localhost:9200/wwh_test3/' -d '{
    "settings" : {
        "index" : {
            "number_of_shards" : 3, 
            "number_of_replicas" : 1 
        }
    }
}'

nginx代理kibana并设置白名单

nginx配置

vim /data/nginx/conf.d/kibana.conf 
upstream kibana_server {
        server  192.168.24.128:5601 weight=1 max_fails=3  fail_timeout=60;
}

server {
        listen 80;
        server_name www.testes.com;                        #公司域名
		allow 114.86.224.135;                             # 放行公司IP
                deny all;
        location / {
        proxy_pass http://kibana_server;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
        }
}

检查语义

nginx -t

启动

systemctl restart nginx

浏览器访问:

www.testes.com

image-20200817165842348

 

拓展

参考链接:zabbix实时监控elk

前言:

zabbix监控日志实时数据,过滤匹配出error,warn,failure,等字段,进行告警;
核心:需要一个插件  【 logstash-output-zabbix】

查看logstash的插件列表

sh logstash-plugin list
logstash-codec-avro
logstash-codec-cef
logstash-codec-collectd
logstash-codec-dots
logstash-codec-edn
logstash-codec-edn_lines
logstash-codec-es_bulk
logstash-codec-fluent
logstash-codec-graphite
logstash-codec-json
logstash-codec-json_lines
......
......
......
logstash-plugin命令还有多种用法,我们来简单了解一下:
【2.1】、列出目前已经安装的插件
将列出所有已安装的插件

 /usr/share/logstash/bin/logstash-plugin list

#将列出已安装的插件及版本信息

 /usr/share/logstash/bin/logstash-plugin list --verbose

#将列出包含namefragment的所有已安装插件

 /usr/share/logstash/bin/logstash-plugin list "http"

#将列出特定组的所有已安装插件( input,filter,codec,output)

 /usr/share/logstash/bin/logstash-plugin   list --group input
 
 【2.2】、安装插件
#要安装某个插件,例如安装kafka插件,可执行如下命令:

 /usr/share/logstash/bin/logstash-plugin   install logstash-output-kafka
#要使用此命令安装插件,需要你的电脑可以访问互联网。此插件安装方法,会检索托管在公共存储库(RubyGems.org)上的插件,然后下载到本地机器并在Logstash安装之上进行自动安装。

【2.3】、更新插件
#每个插件有自己的发布周期和版本更新,这些更新通常是独立于Logstash的发布周期的。因此,有时候需要单独更新插件,可以使用update子命令获得最新版本的插件。

#将更新所有已安装的插件
 /usr/share/logstash/bin/logstash-plugin   update
#将仅更新指定的插件

 /usr/share/logstash/bin/logstash-plugin   update logstash-output-kafka
【2.4】、删除插件
#如果需要从Logstash插件中删除插件,可执行如下命令:

 /usr/share/logstash/bin/logstash-plugin   remove logstash-output-kafka
#这样就删除了logstash-output-kafka插件。

正题:

logstash-output-zabbix是一个社区维护的插件;
#它默认没有在Logstash中安装,但是安装起来也很容易,直接在logstash中运行如下命令即可:
(1).安装插件
 /usr/share/logstash/bin/logstash-plugin  install logstash-output-zabbix
(2).测试例子
vim   /etc/logstash/conf.d/zabbix_elk.conf
input {
        file {
        path => ["/var/log/secure"]
        type => "system"
        start_position => "beginning"
        }
}
filter {
    grok {
             match => { "message" => "%{SYSLOGTIMESTAMP:message_timestamp} %{SYSLOGHOST:hostname} %{DATA:message_program}(?:\[%{POSINT:message_pid}\])?: %{GREEDYDATA:message_content}" }      
        }
      mutate {
             add_field => [ "[zabbix_key]", "oslogs" ]           
             add_field => [ "[zabbix_host]", "%{host}" ]  
         }
        mutate {    
            remove_field => "@version"
            remove_field => "message"
        }
        date {     
                match => [ "message_timestamp","MMM  d HH:mm:ss", "MMM dd HH:mm:ss", "ISO8601"]
        }
}
output {
        if [message_content]  =~ /(ERR|error|ERROR|failure)/  {     
              zabbix {
                        zabbix_host => "[zabbix_host]"     
                        zabbix_key => "[zabbix_key]"      
                        zabbix_server_host => "192.168.24.134" 
                        zabbix_server_port => "10051"          
                        zabbix_value => "message_content"          
                        }
                    }
             # stdout { codec => rubydebug }  
}

【解释!!!】

#你们接触以上配置文件可能存在不明白的问题,如下进行分段解释。

第一段:

首先是input部分,内容如下:

input {
        file {
        path => ["/var/log/secure"]
        type => "system"
        start_position => "beginning"
        }
}
input部分是从/var/log/secure文件中读取数据,start_position 表示从secure文件开头读取内容。
接着是filter部分,内容如下:
filter {
    grok {
             match => { "message" => "%{SYSLOGTIMESTAMP:message_timestamp} %{SYSLOGHOST:hostname} %{DATA:message_program}(?:\[%{POSINT:messag
e_pid}\])?: %{GREEDYDATA:message_content}" }        #这里通过grok对message字段的数据进行字段划分,这里将message字段划分了5个子字段。其中,message_content字段会在output中用到。
        }
      mutate {
             add_field => [ "[zabbix_key]", "oslogs" ]      #新增的字段,字段名是zabbix_key,值为oslogs。
             add_field => [ "[zabbix_host]", "%{host}" ]   #新增的字段,字段名是zabbix_host,值可以在这里直接定义,也可以引用字段变量来获取。这里的%{host}获取的就是日志数据的主机名,这个主机名与zabbix web中“主机名称”需要保持一致。
         }
        mutate {        #这里是删除不需要的字段
            remove_field => "@version"
            remove_field => "message"
        }
        date {      #这里是对日志输出中的日期字段进行转换,其中message_timestamp字段是默认输出的时间日期字段,将这个字段的值传给 @timestamp字段。
                match => [ "message_timestamp","MMM  d HH:mm:ss", "MMM dd HH:mm:ss", "ISO8601"]
        }
}

#filter部分是个重点,在这个部分中,重点关注的是message_timestamp字段、message_content字段。
最后是output部分,内容如下:

output {
        if [message_content]  =~ /(ERR|error|ERROR|Failed)/  {      #定义在message_content字段中,需要过滤的关键字信息,也就是在message_content字段中出现给出的这些关键字,那么就将这些信息发送给zabbix。
              zabbix {
                        zabbix_host => "[zabbix_host]"      #这个zabbix_host将获取上面filter部分定义的字段变量%{host}的值
                        zabbix_key => "[zabbix_key]"        #这个zabbix_key将获取上面filter部分中给出的值
                        zabbix_server_host => "172.16.213.140"  #这是指定zabbix server的IP地址
                        zabbix_server_port => "10051"           #这是指定zabbix server的监听端口
                        zabbix_value => "message_content"              #这个很重要,指定要传给zabbix监控项item(oslogs)的值, zabbix_value默认的值是"message"字段,因为上面我们已经删除了"message"字段,因此,这里需要重新指定,根据上面filter部分对"message"字段的内容划分,这里指定为"message_content"字段,其实,"message_content"字段输出的就是服务器上具体的日志内容。
                        }
                    }
              #stdout { codec => rubydebug }   #这里是开启调试模式,当第一次配置的时候,建议开启,这样过滤后的日志信息直接输出的屏幕,方便进行调试,调试成功后;已默认进行注释,如果第一次配置调试,可自行打开。
}

将上面三部分内容合并到一个文件file_to_zabbix.conf中,然后启动logstash服务:

调试模式

image-20200820141716549

(3)zabbix添加主机

image-20200819200725584

image-20200819201030629

 

2.添加zabbix收集器。

添加自定义模板 

image-20200820110145551

 

添加监控项,配置采集器

image-20200820110653033

 

image-20200820111530087

 

将创建logstash-output-zabbix模板添加到主机中

 

image-20200820112855360

 

 

模拟创建错误信息

 

image-20200820113257710

image-20200820113223896

image-20200820114004269

添加触发器

点击主机-添加触发器--》选择————》strlen类型——》点击结果,大于0  
点击恢复表达式--》结果小于等于0--》点击添加。

image-20200820154722932

image-20200820155053786

设置动作:触发邮件告警

image-20200820150246209

image-20200820155448874

操作

image-20200820155751113

点击恢复操作

image-20200820155948788

微信查看告警信息。

image-20200820160008121

 

额外补充

在添加完zabbix监控项后,其实我们还可以用zabbix_sender检测是否成功

zabbix_sender  -z 192.168.24.134 -s kibana1  -k oflogs -o ceshi

Response from "192.168.24.134:10051": "processed: 1; failed: 0; total: 1; seconds spent: 0.000027"

-z server端机器ip
-s agent端机器ip
-k 键值
-o ceshi 测试内容

image-20200821151844457

 



 

<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">

posted @ 2020-09-01 14:47  名字长的像一只老山羊  阅读(18)  评论(0编辑  收藏  举报