日志分析在web系统中故障排查、性能分析方面有着非常重要的作用。目前,开源的ELK系统是成熟且功能强大的选择。但是部署及学习成本亦然不低,这里我实现了一个方法上相对简单(但准确度和效率是有保证的)的实现。另外该脚本的侧重点不是通常的PV,UV等展示,而是短期内(如三天历史or一周历史)提供细粒度的异常和性能分析。

先说一下我想实现这个功能的驱动力(痛点)吧: 我们有不少站点,前边有CDN,原站前面是F5,走到源站的访问总量日均PV约5000w。下面是我们经常面临一些问题:

CDN回源异常,可能导致我们源站带宽和负载都面临较大的压力。这时需要能快速的定位到是多了哪些回源IP(即CDN节点)或是某个IP的回源量异常,又或是哪些url的回源量异常

在排除了CDN回源问题之后,根据zabbix监控对一些异常的流量或者负载波动按异常时段对比正常时段进行分析,定位到具体的某(几)类url。反馈给开发进行review以及优化

有时zabbix会监控到应用服务器和DB或者缓存服务器之间的流量异常,这种问题一般定位起来是比较麻烦的,甚至波动仅仅是在一两分钟内,这就需要对日志有一个非常精细的分析粒度

我们希望能所有的应用服务器能过在本机分析日志(分布式的思想),然后将分析结果汇总到一起(MySQL)以便查看;并且还希望能尽可能的实时(将定时任务间隔设置低一些),以便发现问题后能尽快的通过此平台进行分析

通用和性能:对于不同的日志格式只需对脚本稍加改动即可分析;因为将日志分析放在应用服务器本机,所以脚本的性能和效率也要有保证,不能影响业务

再说下原理:比较简单,就是利用python的re模块通过正则表达式对日志进行分析处理,取得uri、args、时间当前、状态码、响应大小、响应时间、用户IP、CDN ip、server name 等信息存储进数据库。

当然前提规范也是必须的:

各台server的日志文件按统一路径存放

日志格式保持一致

每天的0点日志切割

我的nginx日志格式如下:

日志分析原理: 通过Python的re模块,按照应用服务器的日志格式编写正则,例如按照我的日志格式,写出的正则如下(编写正则时,先不要换行,确保空格或引号等与日志格式一致,最后考虑美观可以折行)

用以上正则来整体匹配一行日志记录,然后各个部分可以通过log_pattern_obj.search(log).group('remote_addr')、log_pattern_obj.search(log).group('body_bytes_sent')

等形式来访问

对于其他格式的nginx日志或者Apache日志,按照如上原则,并对数据库结构做相应调整,都可以轻松的使用该脚本分析处理。

原理虽简单但实现起来却发现有好多坑,主要是按照上述的日志格式(靠空格或双引号来分割各段)主要问题是面对各种不规范的记录时(原因不一而足,而且也是样式繁多),如何正确的分割及处理日志的各字段,这也是我用re模块而不是简单的split()函数的原因。代码里对一些“可以容忍”的异常记录通过一些判断逻辑予以处理;对于“无法容忍”的异常记录则返回空字符串并将日志记录于文件。

其实对于上述的这些不规范的请求,最好的办法是在nginx中定义日志格式时,用一个特殊字符作为分隔符,例如“|”。这样都不用Python的re模块,直接字符串分割就能正确的获取到各段。

接下来看看使用效果: 先看一行数据库里的记录

其中uri_abs和args_abs是对uri和args进行抽象化(抽象出一个模式出来)处理之后的结果。对uri中个段和args中的value部分除了完全由[a-zA-Z-_]+组成的部分之外的部分都用“?”做替换。uri_abs_crc32和args_abs_crc32两列是对抽象化结果进行crc32计算,这两列单纯只是为了在MySQL中对uri或args进行分类统计汇总时得到更好的性能。

现在还没有完成统一分析的入口脚本,所以还是以sql语句的形式来查询(对用户的sql功底有要求,不友好待改善)

查询某站点日/小时pv(其实这一套东西的关注点并不在类似的基础的统计上)

select count(*) from www where time_local>='2016-12-09 00:00:00' and time_local<='2016-12-09 23:59:59'

查询某类型url总量(or指定时间段内该url总量) 依据表中的url_abs_crc32字段

mysql> select count(*) from www where uri_abs_crc32=2043925204 and time_local > '2016-11-23 10:00:00' and time_local

平均响应时间排行(可基于总量分析;亦可根据时段对比分析)

平均响应大小排行

以上只列举了几个例子,基本上除了UA部分(代码中已有捕捉,但是笔者用不到),其他的信息都以包含到表中。因此几乎可以对网站流量,负载,响应时间等方面的任何疑问给出数据上的支持。

Python外部包依赖:pymysql MySQL(笔者5.6版本)将innodb_file_format设置为Barracuda(这个设置并不对其他库表产生影响,即使生产数据库设置也无妨),以便在建表语句中可以通过ROW_FORMAT=COMPRESSED将innodb表这只为压缩模式,笔者实验开启压缩模式后,数据文件大小将近减小50%。

接下来请看代码:

最后按照我们期望的间隔设置计划任务即可:*/30 * * * * export LANG=zh_CN.UTF-8;python3 /root/log_analyse_parall.py &> /tmp/log_analyse.py3

关于这样一个对不确定格式的大量文本进行分析的脚本来说,通用性和执行效率两个因素非常重要。通用性上文中已大致说明了原理;性能方面,经笔者在一台4核虚拟机上进行测试结果如下:

作者:kaifly

链接:http://blog.csdn.net/kai404/article/details/53443693

mysql+web日志分析工具_用Python+MySQL实现2017年web日志分析报告相关推荐

  1. python 内存分析工具_[转] python运行时内存分析工具meliae

    meliae是一个python进程内存占用监控.分析工具,它的安装需要依赖pyrex包. 一.安装: 安装python内存分析工具 sudo pip install cython sudo pip i ...

  2. 关键词热度分析工具_亚马逊卖家: 产品关键词挖掘分析必备工具!

    做亚马逊的应该都知道,亚马逊的大部分流量都是来自于产品关键词的搜索,一个好的关键词可以大大的提高你的产品曝光,促进成交,还可以节省时间和成本,是增加流量最好的一个方法. 无论你是发布产品,还是优化Li ...

  3. 用python分析小说_用Python对哈利波特系列小说进行情感分析

    原标题:用Python对哈利波特系列小说进行情感分析 准备数据 现有的数据是一部小说放在一个txt里,我们想按照章节(列表中第一个就是章节1的内容,列表中第二个是章节2的内容)进行分析,这就需要用到正 ...

  4. web界面设计工具_您应该了解的14个Web设计工具

    web界面设计工具 Our time is very limited and we don't try most awesome tools available on the market becau ...

  5. Excel股票分析工具_每日连板清单

    Excel获取每日连板数据 对所有股票数据进行监控,选出涨停板股票清单: 可以查看昨日数据今日的涨跌情况    后端采用VBA通过API获取数据并创建前台分析链接 可以查看昨日数据在今日的涨跌情况, ...

  6. Excel股票分析工具_量化策略模拟

    在Excel中对量化策略进行模拟 根据优选算法,每日对所有股票数据进行监控和选择: 可以根据"买入日期"列判断是否当日选出股票: 后端采用VBA通过API获取数据并创建前台分析链接 ...

  7. python日志分析工具_基于Python3的Web日志分析小工具

    PyWebLog 网站日志分析小工具 环境 Python3.5 Mysql 预览 安装 pip install pymysql pip install flask 导入日志 python Log.py ...

  8. java tomcat 日志分析工具_设计一个Tomcat访问日志分析工具

    常使用web服务器的朋友大都了解,一般的web server有两部分日志: 一是运行中的日志,它主要记录运行的一些信息,尤其是一些异常错误日志信息 二是访问日志信息,它记录的访问的时间,IP,访问的资 ...

  9. 蜘蛛日志分析工具_如何分析蜘蛛日志?

    什么是蜘蛛日志? 所谓的蜘蛛日志就是当搜索引擎向服务器发送请求时产生的访问记录文件. 每个网站都会有日志文件,但是很多时候,日志文件只有在网站出现问题的时候才会被查阅.在seo方面,日志文件是更容易被 ...

最新文章

  1. (开发)ESLint - 代码规范
  2. 【MM模块】 Blanket Purchase Orders 框架订单
  3. css多行多列的新闻模式
  4. apollo local 模式_「架构」 - 配置中心 Apollo基本使用
  5. 剑指offer 面试题62. 圆圈中最后剩下的数字
  6. PLSQL 连接Oracle11g (64位)
  7. 一站式快速实现应用现代化,IBM Cloud Pak做对了什么? | 技术公开课
  8. java listener 原理_Java三大器之监听器(Listener)的工作原理和代码演示
  9. 反超苹果,微软重回全球市值第一!
  10. 2017-2018-2 20179209《网络攻防》第八周作业
  11. Sphinx使用说明
  12. 台式机关闭计算机时没有待机,台式机设置休眠的方法
  13. java 解析GZIP 和 Deflate 网页源文件
  14. 计算机基础学习-什么是并行传输、串行传输、异步传输?
  15. Pytest fixture实现测试用例前置后置操作
  16. TypeScript 基础数据类型与接口
  17. js单行代码------数组
  18. Ubuntu22.04TLS插入3.5mm耳机没有声音
  19. 一维信号峰值检测Matlab实现
  20. 计算机耗材的替换费用计入哪里,电脑耗材可以计入办公费用吗

热门文章

  1. Win10蓝牙鼠标老是断连卡顿的解决方法
  2. chrome浏览器 提示Adobe Flash Player未安装的解决方法
  3. Java基础-异常-throws Exception-抛声明
  4. 解决自己电脑VMware打开虚拟机黑屏问题
  5. 电脑系统怎么重装win10的方法教程
  6. win11很卡怎么办 windows11很卡的解决方法
  7. 华硕主板怎么开启tpm2.0
  8. (Activiti6.0.0)SpringProcessEngineConfiguration配置bean时属性注入不了,问题已经找到
  9. win10卸载db2_如何在Linux下干净卸载db2数据库
  10. python简单的聚类分析代码_python kmeans聚类简单介绍和实现代码