Filebeat在ELK中的实战应用

6 篇文章 1 订阅
5 篇文章 0 订阅

写在前面

由于使用分布式部署线上服务的原因,我们在查看日志的时候往往优化恩达的困难,尤其是在定位错误的时候无法找到对应错误所在的服务器,这时我们需要将所有的错误日志统一的收集起来进行集中查询.

技术栈

  • elasticsearch:用来存储日志,进行日志查询
  • logstash:用来处理日志,将日志格式调整存入es
  • filebeat:将对应服务器上的日志收集起来发送到logstash
  • kibana:用来进行日志查询
  • kafka:用来缓存日志消息,减少logsatsh的压力
  • python:服务器定时任务,设定日志自动清除计划

接入指南

为了方便日志的解析,我们首先需要同一所有服务的日志格式,本地技术栈使用的是log4j2日志收集器,所以只需要更改日志的打印格式即可

替换日志内容

java项目替换到conf目录下的日志格式文件中的内容
将下面的内容替换

<Property name="LOG_PATTERN">%d{yyyy-MM-dd HH:mm:ss} ${LOG_LEVEL_PATTERN} [%t] %C.%M(%L) --> %m%n${sys:LOG_EXCEPTION_CONVERSION_WORD}</Property>

安装filebeat

对应服务器部署filebeat(消耗性能极小),使用rpm包安装即可

wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.3.2-x86_64.rpm
rpm -vi filebeat-6.3.2-x86_64.rpm

下图是filebeat通过rpm安装的目录格式
格式

启动filebeat

再启动fielbeat之前我们需要做一些准备工作

准备filebeat.yml配置文件

filebeat.yml主要配置了日志在服务器上的位置,日志采集方式,和一些自定义的变量.

filebeat.prospectors:
#base-search
- type: log
#开关
  enabled: true
#扫描包路径
  paths:
    - /app/logs/ic-course-server/ic-course-server_inf.log      # 日志地址
#日志多行处理
  multiline:
    pattern: ([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8])))
    negate: true
    match: after
#自定义变量
  fields:
    service_name: ic-course-server  # 服务名
    log_type: info
    data_type: log
    host: 192.168.100.53        # 直接指定服务器ip
#输出
output.logstash:
  hosts: ["192.168.100.110:9600"]

这里制定了服务器的ip用来当做自定义变量,在我们之后查询日志时方便定位服务器.

执行命令

将更改好的配置文件直接上传到服务器中filebeat的配置文件夹,然后执行命令

sudo service filebeat start

结果

确认运行

通过查看日志确认文件已经发送到logstash

tail -100f /var/log/filebeat/filebeat

查询结果

查看日志方法

经过以上的操作我们已经把所有的服务器日志上传到了es中进行保存,现在需要做的事使用kibana进行简单的查询
kibana查询

设置指定字段

在存储日志的时候为了方便展示,在后台我使用logstash将日志内容进行解析拆分成了多个字段,在查询的时候可以指定需要的内容进行展示.
需求的字段

日志清除策略

由于防止日志在服务器中大量堆积目前的服务器只保存7天日志,超过七天的日志自动清除.
清除的方法通过python编写es的HttpAPI调用Delete方法删除索引,然后在服务器上设置定时任务执行python脚本

import requests
import datetime

saveTime = 7
newDay = datetime.datetime.now().strftime('%d')  # define new day
newTime = datetime.datetime.now().strftime('%Y.%m.')
maxDay = str(int(newDay) - saveTime)
request = "http://192.168.100.110:9400/"


def deleteOne(day):
    return requests.delete(url=request + '*' + day + '*')


if __name__ == "__main__":
    if len(maxDay) < 2:
        maxDay = '0' + maxDay
delete = deleteOne(day=newTime + maxDay)
print(delete.text)

这里直接附上python源码仅供参考件.

  • 根据时间维度进行查询
  • 根据特定条件进行查询
  • 搜索相关接口
  • 根据日志输出进行查询
    …功能持续开发中

下期内容:

consul+consul-template+Nginx实现服务自动注册

技术栈

  • elasticsearch
  • skywarking
  • java-agent
  • springcloud-gateway
  • consul
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值