利用ELK构建一个小型的日志收集平台
利用ELK构建一个小型日志收集平台
伴随着应用以及集群的扩展,查看日志的方式总是不方便,我们希望可以有一个便于我们查询及提醒功能的平台;那么首先需要剖析有几步呢?
格式定义 --> 日志收集 --> 运输 --> 存入 --> 查询
根据上面这几步,我们简单来设计一个收集平台,如下图:
这里我们使用了Elastic Stack家族的Filebeat用作客户端收集,Kibana作为数据展示,Elasticsearch(后面简称ES)来存储日志,Logstash作为一个中转站帮助我们运输日志;同时我们还们还加入日志队列(这里使用Redis来担任)。
Filebeat以及Logstash自身带有队列功能,但是这里放置Redis可以做到解耦的功能,当然你也可以选择使用kafka这样的;至于Redis这边可以采用LB的模式来预防单点问题;
LogAlert是我们开发的专用于日志报警的工具,具体内容我们后面介绍。
整体软件环境说明:Filebeat、Kibana、Logstash、es均采用官方6.5.4的版本,请注意版本。
1、确定采集项目
我们简单梳理下采集项目如下:
- 系统日志 (Elastic Stack 有现成的模板)
- Message
- 审计日志
- 安全日志
- 开源组件 (绝大多数 Elastic Stack 有现成的模板)
- Nginx: 负载均衡,Web服务器;主要收集HTTP访问情况;
- Redis: 缓存组件;
- MySQL: 主要收集慢查询日志和常规日志;
- .... 等等
- Java应用 (比如自研发应用)
- 常规日志
- 业务日志
非常重要,一定要提前沟通规范日志格式,不然后期在进行改动推动非常的难,最后日志谁用就让谁定义格式;同时也要安利一波日志平台的好处,要不然怎么忽悠别人用呢,哈哈。
2、环境准备说明
这里呢,我将演示系统日志、Nginx日志、Redis日志、以及一个Java应用;采用系统为CentOS 7
系统,如果未说明版本则不会影响我们的使用。
这里相关组件如Nginx、Redis我们采用最简单的Yum安装,别的需求可以自己定义。
3、采集节点日志(System,Nginx,Redis)
采集日志我们通过filebeat来搞,Filebeat比Logstash的一大优点是轻量级别,节省资源尤其是在云上我们很多情况下都是2核4G或者4核8G这样的机器,所以Filebeat作为客户端日志采集好处,balabala..... 我就不啰嗦了。(安装包请自行官网下载)
安装:
rpm -ivh filebeat-6.5.4-x86_64.rpm
打开Module的支持:
Module是Filebeat预配置的日志收集,其原理也非常的简单,通过Input进行收集,然后通过es pipeline进行解析日志。
filebeat modules enable auditd nginx redis system
调整配置配置文件:
shell> cat /etc/filebeat/filebeat.yml
filebeat.inputs:
filebeat.config.modules:
path: ${path.config}/modules.d/*.yml
reload.enabled: false
setup.template.settings:
index.number_of_shards: 3
setup.kibana:
host: "localhost:5601"
output.redis:
hosts: ["localhost:6379"]
password: "123456"
key: "logs"
db: 0
timeout: 5
processors:
- add_host_metadata: ~
这里的配置说明是,配置redis的地址,以及KibanaAPI的地址;redis的配置我们需要简单调整下,调整如下:
shell> cat /etc/filebeat/modules.d/redis.yml
- module: redis
# Main logs
log:
enabled: true
# Set custom paths for the log files. If left empty,
# Filebeat will choose the paths depending on your OS.
var.paths: ["/var/log/redis/redis.log*"]
# Slow logs, retrieved via the Redis API (SLOWLOG)
slowlog:
enabled: false
# The Redis hosts to connect to.
#var.hosts: ["localhost:6379"]
# Optional, the password to use when connecting to Redis.
#var.password:
可以看到,我们调整了Redis日志的路径,同时关闭了slowlog日志功能,当前版本还是测试,有兴趣的小伙伴可以研究一下,我这里就暂不使用。
启动服务:
shell> systemctl enable filebeat
shell> systemctl start filebeat
我们检查下Redis是否有日志存在
127.0.0.1:6379> LLEN logs
(integer) 5559
Ok, 至此我们通过Filebeat的Module快速收集了日志,接下来我们搞一个存储和Kibana了。
4、ES+Kibana部署
常规安装走一波:
首先我们需要看装JDK1.8的版本
shell> rpm -ivh jdk-8u191-linux-x64.rpm
安装部署ES
shell> rpm -ivh elasticsearch-6.5.4.rpm
shell> systemctl daemon-reload
shell> systemctl enable elasticsearch.service
shell> systemctl start elasticsearch.service
安装插件ingest-user-agent, ingest-geoip
shell> /usr/share/elasticsearch/bin/elasticsearch-plugin install file:///usr/local/src/ingest-user-agent-6.5.4.zip
shell> /usr/share/elasticsearch/bin/elasticsearch-plugin install file:///usr/local/src/ingest-geoip-6.5.4.zip
shell> systemctl restart elasticsearch
安装Kibana
shell> rpm -ivh kibana-6.5.4-x86_64.rpm
shell> systemctl enable kibana
shell> systemctl start kibana
然后可以Web查看一下,如果是其他机器请调整监听端口即可。
导入Filebeat模板与pipeline:
系统模板中,定义了非常多的字段属性,同时pipeline中定义的解析日志的规则;
导出默认的系统模板
shell> filebeat export template > filebeat.template.json
shell> sed -i 's@filebeat-6.5.4@sys-log@g' filebeat.template.json # 修改匹配索引
shell> curl -H 'Content-Type: application/json' -XPUT 'http://localhost:9200/_template/sys-log' -d@filebeat.template.json
导入modules到ES的pipline(导入前我们需要调整下,不然会有时区问题)
Nginx模块:
我们修改配置模板文件:/usr/share/filebeat/module/nginx/error/ingest/pipeline.json
原内容
"date": {
"field": "nginx.error.time",
"target_field": "@timestamp",
"formats": ["YYYY/MM/dd H:m:s"]
}
修改后
"date": {
"field": "nginx.error.time",
"target_field": "@timestamp",
"formats": ["YYYY/MM/dd H:m:s"],
"timezone" : "Asia/Shanghai"
}
Redis模块:
我们修改配置模板文件:/usr/share/filebeat/module/redis/log/ingest/pipeline.json
原内容
"date": {
"field": "redis.log.timestamp",
"target_field": "@timestamp",
"formats": ["dd MMM H:m:s.SSS", "dd MMM H:m:s", "UNIX"],
"ignore_failure": true
}
修改后
"date": {
"field": "redis.log.timestamp",
"target_field": "@timestamp",
"formats": ["dd MMM H:m:s.SSS", "dd MMM H:m:s", "UNIX"],
"ignore_failure": true,
"timezone" : "Asia/Shanghai"
}
系统模块:
我们编辑配置文件:/usr/share/filebeat/module/system/syslog/manifest.yml 打开时区的支持(Auth文件同样:/usr/share/filebeat/module/system/auth/manifest.yml)
原内容
- name: convert_timezone
default: false
修改后
- name: convert_timezone
default: true
审计模块:
我们修改配置模板文件:/usr/share/filebeat/module/auditd/log/ingest/pipeline.json
原内容
"date": {
"field": "auditd.log.epoch",
"target_field": "@timestamp",
"formats": [
"UNIX"
],
"ignore_failure": true
}
修改后
"date": {
"field": "auditd.log.epoch",
"target_field": "@timestamp",
"formats": [
"UNIX"
],
"ignore_failure": true,
"timezone" : "Asia/Shanghai"
}
导入到ES系统之中:
shell> filebeat setup --modules nginx,redis,system,auditd --pipelines -e -E 'output.elasticsearch.hosts=["localhost:9200"]'
这里可以通过ES API进行查询是否写入
es api> GET /_ingest/pipeline/
这里会提示多个Out冲突,怎么办呢? 吧原先的Output注释掉即可,不用重启服务。
5、通过Logstash打通日志
安装
shell> rpm -ivh logstash-6.5.4.rpm
配置一个pip
shell> cat /etc/logstash/conf.d/sys-log.conf
input {
redis {
host => "127.0.0.1"
password => '123456'
port => "6379"
db => "0"
data_type => "list"
key => "logs"
}
}
filter {
}
output {
if [fileset][module] in ["system", "nginx", "redis", "mysql", "auditd"] {
if [fileset][module] == "nginx" and [fileset][name] == "access" {
elasticsearch {
hosts => localhost
index => "sys-log-%{+YYYY.MM.dd}"
pipeline => "filebeat-6.5.4-%{[fileset][module]}-%{[fileset][name]}-default"
}
} else {
elasticsearch {
hosts => localhost
index => "sys-log-%{+YYYY.MM.dd}"
pipeline => "filebeat-6.5.4-%{[fileset][module]}-%{[fileset][name]}-pipeline"
}
}
}
}
启动测试
shell> systemctl enable logstash
shell> systemctl start logstash
可以通过Redis队列状态 或者 ES当前日志信息进行查询。
6、自定义收集项
Grok表达式:
\[%{DATA:svc}\] %{TIMESTAMP_ISO8601:time} %{LOGLEVEL:log.level} %{POSINT:process.pid} --- \[ *%{DATA:process.thread}\] %{DATA:process.class} *: %{GREEDYDATA:msg}
配置系统日志索引模板:主要内容字段根据Grok表达式写入模板文件,模板文件根据系统模板修改而成。
将模板导入ES系统之中:
shell> curl -H 'Content-Type: application/json' -XPUT 'http://localhost:9200/_template/svc-log' -d@svc.template.json
配置Filebeat抓取服务日志:(增加Input内容如下)
- type: log
paths:
- /application/apps/*/server.log
multiline.pattern: '^\['
multiline.negate: true
multiline.match: after
fields:
svc_type: java
具体配置信息,请了解官方信息。
配置Logstash解析格式
input {
...
}
filter {
if [fields][svc_type] == "java" {
grok {
match => { "message" => "\[%{DATA:svc}\] %{TIMESTAMP_ISO8601:time} +%{LOGLEVEL:log.level} %{POSINT:process.pid} --- \[ *%{DATA:process.thread}\] %{DATA:process.class} *: %{GREEDYDATA:msg}" }
remove_field => "message"
}
date {
match => [ "time", "ISO8601", "yyyy-MM-dd HH:mm:ss.SSS" ]
remove_field => "time"
}
mutate {
add_field => { "read_timestamp" => "%{@timestamp}" }
}
}
}
output {
if [fields][svc_type] == "java" {
elasticsearch {
hosts => localhost
index => "svc-log-%{+YYYY.MM.dd}"
}
}
}
至此,我们简单的日志架构就已经完成了。
利用ELK构建一个小型的日志收集平台的更多相关文章
- ELK+Kafka 企业日志收集平台(一)
背景: 最近线上上了ELK,但是只用了一台Redis在中间作为消息队列,以减轻前端es集群的压力,Redis的集群解决方案暂时没有接触过,并且Redis作为消息队列并不是它的强项:所以最近将Redis ...
- FILEBEAT+ELK日志收集平台搭建流程
filebeat+elk日志收集平台搭建流程 1. 整体简介: 模式:单机 平台:Linux - centos - 7 ELK:elasticsearch.logstash.kiban ...
- ELK 6安装配置 nginx日志收集 kabana汉化
#ELK 6安装配置 nginx日志收集 kabana汉化 #环境 centos 7.4 ,ELK 6 ,单节点 #服务端 Logstash 收集,过滤 Elasticsearch 存储,索引日志 K ...
- 利用 vue-cli 构建一个 Vue 项目
一.项目初始构建 现在如果要构建一个 Vue 的项目,最方便的方式,莫过于使用官方的 vue-cli . 首先,咱们先来全局安装 vue-cli ,打开命令行工具,输入以下命令: $ npm inst ...
- 利用Dockerfile构建一个基于CentOS 7镜像
利用Dockerfile构建一个基于CentOS 7,包括java 8, tomcat 7,php ,mysql+mycat的镜像. Dockerfile内容如下: FROM centosMAINTA ...
- 【转】flume+kafka+zookeeper 日志收集平台的搭建
from:https://my.oschina.net/jastme/blog/600573 flume+kafka+zookeeper 日志收集平台的搭建 收藏 jastme 发表于 10个月前 阅 ...
- CoSky-Mirror 就像一个镜子放在 Nacos、CoSky 中间,构建一个统一的服务发现平台
CoSky 基于 Redis 的服务治理平台(服务注册/发现 & 配置中心) Consul + Sky = CoSky CoSky 是一个轻量级.低成本的服务注册.服务发现. 配置服务 SDK ...
- ELK构建MySQL慢日志收集平台详解
上篇文章<中小团队快速构建SQL自动审核系统>我们完成了SQL的自动审核与执行,不仅提高了效率还受到了同事的肯定,心里美滋滋.但关于慢查询的收集及处理也耗费了我们太多的时间和精力,如何在这 ...
- ELK 构建 MySQL 慢日志收集平台详解
ELK 介绍 ELK 最早是 Elasticsearch(以下简称ES).Logstash.Kibana 三款开源软件的简称,三款软件后来被同一公司收购,并加入了Xpark.Beats等组件,改名为E ...
随机推荐
- java中变量和标识符名命名规范
变量存放的是内存地址,当定义一个变量后,我们可以通过变量名找到该内存地址,可以修改该内存区间的值. 标识符的命名规范:首字母:字母,下划线,$符号:其余部分:数字,字母,下划线,$. 标识符应该避开j ...
- SparkSql自定义数据源之读取的实现
一.sparksql读取数据源的过程 1.spark目前支持读取jdbc,hive,text,orc等类型的数据,如果要想支持hbase或者其他数据源,就必须自定义 2.读取过程 (1)sparksq ...
- openstack octavia的实现与分析(一)openstack负载均衡的现状与发展以及lvs,Nginx,Haproxy三种负载均衡机制的基本架构和对比
[负载均衡] 大量用户发起请求的情况下,服务器负载过高,导致部分请求无法被响应或者及时响应. 负载均衡根据一定的算法将请求分发到不同的后端,保证所有的请求都可以被正常的下发并返回. [主流实现-LVS ...
- uber_go_guide解析(三)(规范)
前言 一主要讲的是容易忽略的错误,可能在build时都不会体现出来但是在使用时出现问题 二主要讲的是一些可以提高代码效率的用法 本篇则讲解一些规范,不是强制的但是根据规范会提高代码的可读性, 减少BU ...
- docker+mysql集群+读写分离+mycat管理+垂直分库+负载均衡
依然如此,只要大家跟着我的步骤一步步来,100%是可以测试成功的 centos6.8已不再维护,可能很多人的虚拟机中无法使用yum命令下载docker, 但是阿里源还是可以用的 因为他的centos- ...
- 【Java基础】面向对象中
面向对象中 这一章主要涉及面向对象的三大特征,包括封装.继承.多态.(抽象). 封装 程序设计追求"高内聚,低耦合": 高内聚 :类的内部数据操作细节自己完成,不允许外部干涉: 低 ...
- LeetCode344 反转字符串
编写一个函数,其作用是将输入的字符串反转过来. 示例 1: 输入: "hello" 输出: "olleh" 示例 2: 输入: "A man, a p ...
- 牺牲速度来节省内存,Redis是觉得自己太快了吗
前言 正常情况下我们选择使用 Redis 就是为了提升查询速度,然而让人意外的是,Redis 当中却有一种比较有意思的数据结构,这种数据结构通过牺牲部分读写速度来达到节省内存的目的,这就是 zipli ...
- CSAPP:Lab1 -DataLab 超详解
写在前面 之前考研的时候csapp的书有刷过5,6遍,所以对书本知识还算比较了解.恰逢最近在学c++的时候,顺带刷一下大名鼎鼎的csapp实验. 0. 环境准备 最好准备一个纯净的Linux系统这里建 ...
- Docker安装配置及华为云镜像加速
Docker华为云镜像加速 软件介绍 支持的操作系统 docker安装 docker镜像加速(华为云实现) 1.登录华为云网站,注册华为云账户 2.登录华为云账户,点击网页右上角的控制台 3.点击左上 ...