前言

日志是我们分析系统运行情况、问题定位、优化分析等主要数据源头。目前,主流的业务系统都采用了分布式、微服务的形式。如果想要查看日志,就需要从不同的节点上去查看,而且对于整个业务链路也非常不清晰。因此,我们首先引入日志收集框架,将分布在各个节点的日志统一汇总到一处。方便日志查询、分析与问题定位。

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

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

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

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

最后再说一点,说了这么多,应该都知道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。用一个图来形象的表述一下关系:

1. 环境准备

首先,我们需要准备日志系统需要的环境。

1. JRE需要1.8+。

2. ES等需要创建文件限制提升到65536+;虚拟内存区域最大数量262144+。

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。

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搭建也是初次接触,存在使用与认知错误是不可避免的,在此欢迎各位童鞋当面或留言指正,以上。

日志收集系统搭建-BELK的更多相关文章

  1. ELK日志收集系统搭建

     架构图 ELK  架构图:其中es 是集群,logstash 是单节点(猜想除非使用nginx对log4j的网络输出分发),kibana是单机(用不着做成集群). 1.拓扑图 2.logstash ...

  2. Syslog+Fluentd+InfluxDB日志收集系统搭建

    环境配置 节点 配置 类型 操作系统 Sched 2G 2CPU 50GB ens3=>192.168.200.11 KVM虚拟机 CentOS 7 Nova 4G 2CPU 50GB ens3 ...

  3. 容器云平台No.9~kubernetes日志收集系统EFK

    EFK介绍 EFK,全称Elasticsearch Fluentd Kibana ,是kubernetes中比较常用的日志收集方案,也是官方比较推荐的方案. 通过EFK,可以把集群的所有日志收集到El ...

  4. 快速搭建应用服务日志收集系统(Filebeat + ElasticSearch + kibana)

    快速搭建应用服务日志收集系统(Filebeat + ElasticSearch + kibana) 概要说明 需求场景,系统环境是CentOS,多个应用部署在多台服务器上,平时查看应用日志及排查问题十 ...

  5. 用ElasticSearch,LogStash,Kibana搭建实时日志收集系统

    用ElasticSearch,LogStash,Kibana搭建实时日志收集系统 介绍 这套系统,logstash负责收集处理日志文件内容存储到elasticsearch搜索引擎数据库中.kibana ...

  6. 搭建日志收集系统时使用客户端连接etcd遇到的问题

    问题: 在做日志收集系统时使用到etcd,其中server端在linux上,首先安装第三方包(windows)(安装过程可能会有问题,我遇到的是连接谷歌官网请求超时,如果已经出现下面的两个文件夹并且文 ...

  7. 日志收集系统ELK搭建

    一.ELK简介 在传统项目中,如果在生产环境中,有多台不同的服务器集群,如果生产环境需要通过日志定位项目的Bug的话,需要在每台节点上使用传统的命令方式查询,这样效率非常低下.因此我们需要集中化的管理 ...

  8. ELK+kafka构建日志收集系统

    ELK+kafka构建日志收集系统   原文  http://lx.wxqrcode.com/index.php/post/101.html   背景: 最近线上上了ELK,但是只用了一台Redis在 ...

  9. [转载] 一共81个,开源大数据处理工具汇总(下),包括日志收集系统/集群管理/RPC等

    原文: http://www.36dsj.com/archives/25042 接上一部分:一共81个,开源大数据处理工具汇总(上),第二部分主要收集整理的内容主要有日志收集系统.消息系统.分布式服务 ...

随机推荐

  1. 【转载】wget 命令用法详解

    wget是在Linux下开发的开放源代码的软件,作者是Hrvoje Niksic,后来被移植到包括Windows在内的各个平台上.它有以下功能和特点:(1)支持断点下传功能:这一点,也是网络蚂蚁和Fl ...

  2. FreeRtos堆栈检测应用

    Free rtos每个任务都有自己的栈空间,每个任务需要的栈大小也是不同的.如果堆栈过小就会造成栈溢出,有时候栈溢出发生在某种特定顺序的任务切换中,比较难检测出.所以前期测试和监控任务栈用量就显得尤其 ...

  3. LVS 命令使用

    LVS 命令使用 查询命令 ipvsadm -L # 查看lvs负载均衡信息ipvsadm -L -n # -n 查看IP端口ipvsadm -L -c   # 显示当前连接ipvsadm -L -- ...

  4. 主攻ASP.NET.4.5.1 MVC5.0之重生:系统角色与权限(二)

    系统角色篇 数据结构 用户管理 Controller代码 public class SystemUserController : Controller { //public void Log() // ...

  5. 跨平台移动开发 Xuijs超轻量级的框架+Emile CSS动画

    Xuijs超轻量级的框架+Emile CSS动画效果图 示例代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional// ...

  6. Android LCD(二):常用接口原理篇【转】

    本文转载自:http://blog.csdn.net/xubin341719/article/details/9125799 关键词:Android LCD TFT TTL(RGB)  LVDS  E ...

  7. MongoDB快速入门(六)- 更新文档

    更新文档 MongoDB的update()和save()方法用于更新文档到一个集合. update()方法将现有的文档中的值更新,而save()方法使用传递到save()方法的文档替换现有的文档. M ...

  8. Logistic回归python实现

    2017-08-12 Logistic 回归,作为分类器: 分别用了梯度上升,牛顿法来最优化损失函数: # -*- coding: utf-8 -*- ''' function: 实现Logistic ...

  9. 算法总结之 在单链表和双链表中删除倒数第k个节点

    分别实现两个函数,一个可以删除单链表中倒数第k个节点,另一个可以删除双链表中倒数第k个节点 思路: 如果链表为空,或者k<1 参数无效 除此之外 让链表从头开始走到尾,每移动一步,就让k的值减1 ...

  10. 【P1369】矩形(贪心)

    蒟蒻现在连DP都做不出来了,就只能做一些XJB贪心题,这个题题目向非常友好,100的数据范围一看就是让你跑O(n^4)的做法的,然而实际上并不是那么多,大约是,额,反正要快不少. 没什么好说的,直接枚 ...