​实时/准实时方案可以使用以下四种方式实现

  • flume+kafka+spark准实时写入ES
  • logging + CMRESHandler实时写入ES
  • 利用python中的Elasticsearch库实时写入ES
  • pyinotify后台监控文件变化写入ES

定时写入方案则有

  • 超时重试及定时批量写入ES

接下来我将比较这几个方案的区别,及实现定时写入ES方案。

flume+kafka+spark实时写入ES

此方案流程为:通过flume采集日志,上送到kafka,接着spark程序订阅Topic并消费日志,然后写入ES。因为消息存在一定的滞后,所以叫准实时。对于数据量超大的场景,或同时需要利用spark做日志分析场景,一般采用此方案,目前公司使用的就是这样一套系统,但存在很多问题。目前随着集群上应用越来越多,资源可能不够用,导致程序偶尔会挂掉,另外kafka数据消息偶尔延时以及丢失问题,最终决定弃用本方案(项目对日志有精确要求,日志语料需要导出标注)

logging + CMRESHandler实时写入ES

另一种实时写入方案是:利用logging配合es写入模块做实时写入操作

环境安装

pip install CMRESHandler

简易使用方式
CMRESHandler支持的参数很多,配合logging可以方便进行日志写入管理,若想配置更简单,可以安装loguru,基本用法如下:

使用kibana查看写入结果

注意:实际的索引默认以天为单位(可以修改),写入内容包括主机名,ip等信息。

利用python中的Elasticsearch库实时写入ES

除了以上方案外,还可以使用python中的ElasticSearch包,调用index接口写入(当然也可以自己构造request请求写入),首先要安装elasticsearch

pip install elasticsearch

写入用法如下

使用kibana查看写入结果

可以看出,写入内容简洁很多。

以上2种实时方案看起来不错,但也存在几个问题。

  • 数据丢失问题
    若ES集群某段时间出现异常,或某个客户端节点不可用,数据存在丢失的风险
    网络异常造成访问超时,同样存在数据丢失风险
  • 并发写入性能问题
    高并发写入ES库,对ES的性能要求造成很大挑战,同时会降低应用的并发能力(若使用异步线程问题倒不大)

pyinotify后台监控文件变化写入ES

为了应对高并发及网络异常情况,可以选择利用pyinotify后台监控,这样既能实时,又能在出错时将文件存在本地。

安装

pip install pyinotify

使用方式如下

向文件/tmp/1.log中写入内容:

echo “222” >> /tmp/1.log

程序打印:

222

可以看出,程序能实时检测到文件变化,若日志并发写入要求不是很高,则可以考虑此方案,但同时需要注意监控过程中程序中断问题,中断前需要存储pos位置,方便程序重启后读取,而不是从头开始再写入一次

自定义超时重试请求及定时批量写入ES

综合业务(对实时性要求不高,允许短暂延迟)需求,和当前集群情况(一个ES集群,2个数据节点,2个客户端节点),决定采用定时写入方案。实现步骤和特点如下:

  • 后台进程每隔3秒检测日志目录
  • 根据上次读取位置获取最新日志并写入
  • 获取上次重试失败日志并再次写入

后台进程每隔3秒检测日志目录

日志目录结构为:

- logs

+ visit
- visit_20191117
- position_info

+ warn

+ bury

其中visit为访问日志,warn为告警日志,bury为埋点日志。
position_info存放上次读取的日志文件和位置信息,内容如下:
{“last_day_file_name”: “visit_20191117”, “position”: 73709}

根据上次读取位置获取最新日志并写入

这里需要注意几个问题

  • 读取日志过程中另外进程写入,会造成最后一行数据不完整的问题。因此需要做完整性校验,比如判断是不是完整的json结构。
  • 写入网络异常问题。写入要重试2次,若失败,则保存下来,下次再继续写入。
  • 写入过程中断程序(数据已发送),接收写入结果失败,下次重写数据导致重复问题。因此要写入唯一性的日志id(日志写入本地时就需要确定)

自定义重试写入代码:

由于需要验证,因此在Header中加入Authorization字段,一般格式如:“Authorization: Basic jdhaHY0=”,其中Basic表示基础认证, jdhaHY0=是base64编码的"user:passwd"字符串。
同时要注意批量写入(_bulk)时,各数据行要以结尾

唯一性的日志id
一般使用python自带的uuid来生成,使用方式也很简单:

数据完整性校验
项目中日志格式为json,因此使用eval做校验,若这行出现问题,则记录上一行的位置。

最后总结一下:
本文介绍了4种实时/准实时写入ES方案和定时写入ES方案,并比较了各种方案的使用场景和优缺点。并根据项目特点,最终选择并实现了定时写入方案(又造了个轮子。。。),大家可以根据项目特点来实现,以上供大家参考。

es获取最大时间的记录_Python日志写入ES之五种方案比较相关推荐

  1. es获取最大时间的记录_荣耀手表ES值得买吗?长方形大屏设计,健康运动功能比较全面...

    前言 9月16日荣耀智慧生活秋季新品发布会如期而至,发布了多款智能产品.尤其是在智能穿戴领域,一款主打户外运动的荣耀手表GS pro和一款主打潮流时尚的荣耀手表ES,两款产品也受到了很多媒体和大众用户 ...

  2. es获取最大时间的记录_颜值这么高?荣耀手表ES评测:大概是最漂亮的方形运动手表...

    在上半年因为疫情的缘故,荣耀在线上举行了"生活与你一起升级"的发布会,正式确立了"honor life",带来了荣耀Magicbook Pro 2020英特尔等 ...

  3. es获取最大时间的记录_大屏幕大智慧,腕上私教+生理周期,荣耀手表ES评测

    荣耀9月16日一口气发布了两款智能手表,荣耀手表GS Pro主打户外运动,而荣耀手表ES则主打时尚运动健康,莫名也是第一时间收到了荣耀手表ES,发布会结束后更是迫不及待跟大家分享我的使用感受. 荣耀手 ...

  4. es获取最大时间的记录_Java查询ES某个时间段或者范围的数据

    1.引入SpringData相关Esjar包 附上pom文件: xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://ma ...

  5. es获取最大时间的记录_ES查询一段时间内某一循环时间段的数据

    业务需求:查询几个月类每天8点到10点的数据 最开始基于date类型,用painless脚本实现,用profile跟了下效率感觉不是很好,就冗余了个字段做range过滤,也一般,lucence了解的不 ...

  6. ELK学习--将自定义nginx日志写入es中并通过kibana展示为例

    今天只是记录总体思路,具体细节不展开,毕竟东西太多 学习目的 业务发展越来越庞大,服务器越来越多 各种访问日志.应用日志.错误日志量越来越多,导致运维人员无法很好的去管理日志 开发人员排查问题,需要到 ...

  7. python获取当前时间的源代码_Python获取时间戳代码实例

    1.获取秒级时间戳与毫秒级时间戳.微秒级时间戳 import time import datetime t = time.time() print (t) #原始时间数据 print (int(t)) ...

  8. python获取当前时间的函数_Python日期与时间

    本节知识大纲: 一.时间日期基本介绍 时间日期类型在Python中主要有两个模块:time模块和datetime模块 time模块:是基于Unix Timestamp(时间戳)实现的,所能表述的范围被 ...

  9. python获取当前时间并格式化_python获取当前时间并格式化

    #!/usr/bin/python3 # -*- coding:UTF-8-*- import time if __name__ == "__main__": now = time ...

最新文章

  1. rpm怎样在win安装mysql_centos7.6安装mysql的正确步骤
  2. PostgreSQL — 数据库实例只读锁定
  3. Python之nyoka:nyoka库函数的简介、安装、使用方法之详细攻略
  4. 打造轻量级可视化数据爬取工具-菩提
  5. 拼字符串成为时间,和两个计算时间点的中间值
  6. jdbc如何插入clob_让我们回顾一下如何通过JDBC插入Clob或Blob
  7. 使用SoapUI调用不同的安全WCF SOAP服务-基本身份验证,第二部分
  8. Java中的正则表达式–软介绍
  9. C++之类与对象(2)
  10. win2008服务器维护费用,win2008 服务器安全检查步骤指引(日常维护说明)
  11. java 蓝桥杯算法提高 字符串匹配(题解)
  12. 工作好多年可能还未真正了解接口和抽象类
  13. python查看指令的方法python -h
  14. 安装成功后python报错_python安装mysql的依赖包mysql-python操作
  15. Oracle数据库岗位,Oracle数据库岗位职责
  16. 南京艺术学院计算机作曲,南京艺术学院932主科(上机操作计算机作曲应用)考研复习经验...
  17. 地方科技局重点科技项目在线申报管理系统
  18. java contions_十一届蓝桥模拟赛 元辅音字母 JAVA
  19. 任正非,你也太能装逼了吧?
  20. [python] 4.比心

热门文章

  1. 必须掌握的Java基础知识(一)
  2. Python高阶——argparse(命令行与参数解析)
  3. Git教程——回到从前 (reset)
  4. 【BZOJ4025】二分图(可撤销并查集+线段树分治)
  5. 8.BLE---错误码
  6. 会员注册审核状态更新计算
  7. (一)操作系统基本概念(任哲版嵌入ucos和linux笔记)
  8. CCF NOI1023 最大跨度
  9. CCF NOI1019 分段函数
  10. CCF201703-2 学生排队(100分)