日志收集系统搭建-BELK

前言

    日志是咱们分析系统运行状况、问题定位、优化分析等主要数据源头。目前,主流的业务系统都采用了分布式、微服务的形式。若是想要查看日志,就须要从不一样的节点上去查看,并且对于整个业务链路也很是不清晰。所以,咱们首先引入日志收集框架,将分布在各个节点的日志统一汇总到一处。方便日志查询、分析与问题定位。html

    根据咱们目前的技术栈,咱们的服务是在spring cloud下搭建的。于是使用spring sleuth搭建日志收集是快而便捷的。我的使用spring sleuth + kafka +zipkin + mysql,搭建起一个系统间的trace日志追踪系统。该套框架的优点在于,使用简单(只要引入本身封装好的starter,指定kafka及zookeeper地址便可)。spring sleuth会自动拦截http请求,并分配统一trace id来追踪这一次的请求全链路。最后,经过zipkin的可视化页面,咱们能很是方便的看出一次请求的整个链路,并且能直观的看出各个系统的耗时,对于性能分析比较有帮助。可是,相较于本文要说的ELK日志系统而言,spring sleuth仍是有几个明显的缺点的:node

    1. spring sleuth只会获取过滤到的http请求信息,对于收集系统打印的业务日志信息较麻烦,可定制化相较于ELK太差。(这也是选择ELK的主要缘由)mysql

    2. spring sleuth的日志生成、收集、生产、消费,都共同消耗服务资源。linux

    反观ELK,有两种选择,便可以嵌入到系统(使用log4j的socket发送日志到ELK),也能够独立存在(logstash直接读取日志文件)。并且,对于日志文件中内容的获取,有更灵活的配置(基于logstash的filter插件)。So, it's ELK!git

    最后再说一点,说了这么多,应该都知道ELK指的是elasticsearch+logstash+kibana。对于logstash,若是你的server所在的机器上,资源比较紧张,那么能够选择elastic家族中的Filebeat来作server日志的收集工做。这也正是官方所推荐的(The Filebeat client is a lightweight, resource-friendly tool that collects logs from files on the server and forwards these logs to your Logstash instance for processing. Filebeat is designed for reliability and low latency. Filebeat has a light resource footprint on the host machine, and the Beats input plugin minimizes the resource demands on the Logstash instance.)。咱们日志系统的搭建也是使用了Filebeat来收集日志,统一汇总到日志系统的logstash,而后再由logstash将日志信息推送到elasticsearch。在此,暂且叫BELK。用一个图来形象的表述一下关系:github

1. 环境准备

    首先,咱们须要准备日志系统须要的环境。正则表达式

    1. JRE须要1.8+。spring

    2. ES等须要建立文件限制提高到65536+;虚拟内存区域最大数量262144+。sql

bash
vi  /etc/security/limits .conf
# 添加下面内容
test  - nofile 65536   # test为操做帐号
vi  /etc/sysctl .conf
# 添加下面内容
vm.max_map_count=262144
# 保存并生效
sysctl -p

2. 安装elasticsearch

    1. 到官网下载压缩包。本例使用的是6.2.2版本。elasticsearch-6.2.2.zip。json

    2. 解压:unzip elasticsearch-6.2.2.zip -d /sinochem/software/elasticsearch-6.2.2

    3. 配置文件修改。配置文件在解压目录中的./config下的elasticsearch.yml文件。须要咱们修改的项为:

         

elasticsearch.yml
cluster.name: es-application # 集群名字
 
node.name: node-1 # 当前节点名字
 
path.data: /sinochem/software/elasticsearch-6.2.2/data # es数据存放路径
 
path.logs: /sinochem/software/elasticsearch-6.2.2/logs # es日志路径
 
network.host: 10.144.132.70 # 当前节点IP地址
 
http.port: 9200 # 监听端口号

 

    4. 启动服务。nohup ./bin/elasticsearch >/dev/null & 

    注:目前ES只是单机模式,后续升级支持集群模式。

3. 安装Kibana    

    1. 到官网下载压缩包。本例使用的是6.2.2版本。kibana-6.2.2-linux-x86_64.tar.gz。

    2. 解压:tar -zxvf kibana-6.2.2-linux-x86_64.tar.gz

    3. 配置文件修改。配置文件在解压目录中的./config下的kibana.yml文件。须要咱们修改的项为:

         

kibana.yml
server.port: 5601 # 服务端口
 
server.host: "10.xxx.xxx.xxx" # 服务IP地址
 
kibana.index: ".kibana" # kibana在es中的索引

 

    4. 启动服务。nohup ./bin/kibana >/dev/null &

4. 安装Logstash

    1. 到官网下载压缩包。本例使用的是6.2.2版本。logstash-6.2.2.tar.gz。

    2. 解压:tar -zxvf logstash-6.2.2.tar.gz

    3. 配置文件修改。配置文件在解压目录中的./config下新增日志配置文件logstash.conf。文件内容为:

         

logstash.conf
input {
     # beat插件,监听5044端口
     beats {
         port => "5044"
     }
}
filter {
     grok {
         match => [ "message", "%{COMBINEDAPACHELOG}" ]
     }
     date {
         match => [ "timestamp", "yyyy-MM-dd HH:mm:ss.SSS" ]
     }
}
output {
     # 日志输出到ES
     elasticsearch {
         hosts => ["10.xxx.xxx.xxx:9200"]
         index => "logstash-%{+YYYY.MM.dd}"
     }
}

 

    4. 启动服务。nohup ./bin/logstash -f config/logstash.conf --config.reload.automatic >/dev/null &

    5. 日志匹配。

        COMBINEDAPACHELOG基本能知足日志收集需求,若是你想要更加精确的收集本身须要的日志。能够定义本身的正则表达式。grok插件中,自带了一些默认表达式,能够经过https://github.com/logstash-plugins/logstash-patterns-core/blob/master/patterns/grok-patterns 中列举的查看并使用。固然,你也能够直接使用正则表达式。若是想定义本身的,能够在./config(我的喜爱)下,建立本身的正则表达式文件,取名patterns(可随意)。在文件里定义本身的表达式:

patterns
# 自定义正则
MILLISECOND [0-9]{3}
DATA2END [\s\S]*
SINOCHEM_TIME %{YEAR}-%{MONTHNUM}-%{MONTHDAY}[T ]%{HOUR}:%{MINUTE}:%{SECOND}.%{MILLISECOND}

    而后,就能够在上边建立的logstash.conf中使用了,详细配置以下:

input {
     # file {
     #     path => "/letv/message-bus-ilive/logs/chat_gate.log"
     #     type => "producer"
     #     start_position => "beginning"
     #     codec => json
     # }
     beats {
         port => "5044"
     }
}
filter {
     grok {
         # 此处指定自定义的patterns的路径
         patterns_dir => ["./config/patterns"]
         match => {
             # 此处就可使用自定义的变量了
             "message" => ["%{COMBINEDAPACHELOG}","%{SINOCHEM_TIME:time}%{SPACE}%{DATA:thread}%{SPACE}%{LOGLEVEL:loglevel}%{SPACE}\[%{DATA:class}\]%{SPACE}\[%{DATA:traceId},%{DATA:spanId}\]%{SPACE}-%{SPACE}%{DATA2END:message}"]
         }
         # 重写message内容
         overwrite => ["message"]
         remove_field => ["beat"]
     }
}
output {
     elasticsearch {
         hosts => ["10.144.132.70:9200"]
         index => "logstash-%{+YYYY.MM.dd}"
     }
}

    其中SINOCHEM_TIME、DATA2END就是咱们在patterns文件中自定义的变量。

5. 安装Filebeat

    以上几个都是安装在ELK系统体系下的,Filebeat须要安装到各个服务所在机器上。Filebeat使用的是6.3.0版本,使用该版本是为了使用其中的processors。固然以上也可使用6.3.X版本。

    1. 到官网下载压缩包。filebeat-6.3.0-linux-x86_64.tar.gz。

    2. 解压:tar -zxvf filebeat-6.3.0-linux-x86_64.tar.gz

    3. 配置文件修改。配置文件在解压目录中的./config下的filebeat.yml文件。简单配置以下:

filebeat.yml
filebeat.inputs:
# 用户自定义部分 start
- type: log
   paths:
     # 日志文件
     - /sinochem/app/cooperation/monitor-gateway/logs/*-info.log
   exclude_lines: ['^DBG']
   fields:
     # 服务名称
     app_name: monitor-gateway
   fields_under_root: true
 
- type: log
   paths:
     - /sinochem/app/cooperation/monitor-admin-service/logs/*-info.log
   exclude_lines: ['^DBG']
   fields:
     app_name: monitor-admin-service
   fields_under_root: true
# 用户自定义部分 end
 
output.logstash:
   hosts: ["10.xxx.xxx.xxx:5044"]
 
fields:
   # 须要用户设置环境变量,或者直接将本机IP替换变量
   ip_address: "${IP_ADDRESS:UNKNOWN}"
fields_under_root: true
 
processors:
- drop_fields:
   fields: ["host"]
# - add_host_metadata: ~
# - decode_json_fields:
#      fields: ["host"]
 
filebeat.shutdown_timeout: 5s

 

    4. 启动服务。nohup ./bin/filebeat -e -c config/filebeat.yml -d publish >/dev/null &

6. 定时清理索引

    ES中的日志索引增速是可预见的,用太大的存储空间来存储日志信息是不明智的。因此,可根据实际状况,给予一个清理日志的经验值。因为咱们创建logstash的日志索引是按照日期创建的,咱们在这里能够只留15天的日志信息。清理ES索引,使用了elasticsearch-curator。安装配置脚本以下:

 

curator_install.sh
sudo  -i
# public signing key
rpm -- import  https: //packages .elastic.co /GPG-KEY-elasticsearch
# edit yum install info
echo  '[curator-5]
name=CentOS /RHEL  7 repository  for  Elasticsearch Curator 5.x packages
baseurl=https: //packages .elastic.co /curator/5/centos/7
gpgcheck=1
gpgkey=https: //packages .elastic.co /GPG-KEY-elasticsearch
enabled=1
' >  /etc/yum .repos.d /curator .repo
# install
yum  install  elasticsearch-curator
cd  /opt/elasticsearch-curator
mkdir  config
mkdir  log
echo  "actions:
   1:
     action: delete_indices
     description: >-
       Delete indices older than 15 days  for  logstash-
     options:
       ignore_empty_list: True
       # disable_action: True
     filters:
     - filtertype: pattern
       kind: prefix
       value: logstash-
     - filtertype: age
       source : name
       direction: older
       timestring:  '%Y.%m.%d'
       unit: days
       unit_count: 15" >  /opt/elasticsearch-curator/config/action .yml
echo  "client:
   hosts:
     - 10.144.132.70:9200
   # port: 9200
   url_prefix:
   use_ssl: False
   certificate:
   client_cert:
   client_key:
   ssl_no_validate: False
   http_auth:
   timeout: 50
   master_only: False
logging:
   loglevel: DEBUG
   logfile:  '/opt/elasticsearch-curator/log/curator.log'
   logformat: default
   blacklist: [ 'elasticsearch' 'urllib3' ]" >  /opt/elasticsearch-curator/config/config .yml

    安装完后,配置crontab。

crontab.sh
crontab  -e

    追加以下一行:

crontab
10 1 * * * curator --config  /opt/elasticsearch-curator/config/config .yml  /opt/elasticsearch-curator/config/action .yml

 

后记

    至此,基础版本的BELK系统已经搭建完成。咱们能够在浏览器中输入:http://10.xxx.xxx.xxx:5601/ 访问ES的可视化界面。以下图所示,日志信息已经汇总到了ES中。

    目前版本只是雏形,其中还有一些功能须要完善。例如:ES集群的搭建、ES索引、ES历史数据的处理等。ELK搭建也是初次接触,存在使用与认知错误是不可避免的,在此欢迎各位童鞋当面或留言指正,以上。

相关文章
相关标签/搜索