首页 > 系统相关 >linux-实现日志分析--python

linux-实现日志分析--python

时间:2024-03-19 18:22:07浏览次数:19  
标签:python interval module height -- time linux 日志 line

linux-实现日志分析--python

涉及到的主要python包和系统命令:

1. datetime #用于处理时间
2. subprocess #用于调用命令行工具
3. tail -f logFile #获取logFile新增内容

废话不多说,下面说一下场景需求和具体解决方案。

1. [场景需求]

一个区块链项目,在项目测试过程中,通过日志发现出块不稳定,为了定位问题,需要精确的统计出块时间。截取一段日志如下:

I[2019-07-11|16:57:24.139][45712] reapMaxBytesMaxGas                           module=mempool mempoolTxNum=0 reapTxNum=0 maxNumPerBlock=2000
I[2019-07-11|16:57:24.220][45712] [60]---------- BeginBlock[4367] ----------   module=main
I[2019-07-11|16:57:24.224][45712] Executed block                               module=state height=4367 validTxs=0 invalidTxs=0
D[2019-07-11|16:57:24.307][45712] Commit synced                                module=main commit=436F6D6D697449447B5B333520342031383720363120343120313336203137312031203137302032343120323220313230203836203233382031333120313634203231302031323420313530203233322036203434203130342033322036302031303220343120323530203131352031323720313138203134355D3A313130467D
I[2019-07-11|16:57:24.307][45712] BlockHeight<4367>, BeginBlock<0ms>, DeliverTx<0ms>, EndBlock<0ms>, Commit<82ms>, Tx<0> module=main
I[2019-07-11|16:57:24.307][45712] BlockHeight<4367>, Abci<82ms>, Tx<0>, fullfilled<0>, pending<0>, canceled<0>, expired<0>, partialfilled<0> module=main
I[2019-07-11|16:57:24.307][45712] Committed state                              module=state height=4367 txs=0 appHash=2304BB3D2988AB01AAF1167856EE83A4D27C96E8062C68203C6629FA737F7691
I[2019-07-11|16:57:25.208][45712] reapMaxBytesMaxGas                           module=mempool mempoolTxNum=0 reapTxNum=0 maxNumPerBlock=2000
I[2019-07-11|16:57:25.284][45712] [60]---------- BeginBlock[4368] ----------   module=main

2. [日志分析]

日志中Committed state代表状态持久化,也就是区块生命周期的末尾。 因此我们使用Committed state来对日志进行过滤,并用最新一条日志的时间戳减去上条日志时间戳作为本区块出块时间。

3. [代码]

#!/usr/bin/python
#encoding=utf-8
#Filename: block_time.py

import subprocess
from datetime import datetime
import time

logFile = "./blockchain.log"
lastDateTime = datetime.now()

#主程序
def monitorLog(logFile):
   print("monitor logFile: %s" % logFile)
   stopTime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time()+100)) #脚本100秒后退出
   popen = subprocess.Popen(["tail", "-f", logFile], stdout=subprocess.PIPE, stderr=subprocess.PIPE) #启动子进程执行tail命令
   while True:
      line = popen.stdout.readline().strip() #按行获取日志
      if line:
         if 'Committed state' in line:
            getBlockInterval(line)  #分析日志
      now = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time())) #当前时间
      if now >= stopTime: #如果当前时间超过stopTime,表示不再分析日志,退出程序
           popen.kill()
           print("kill subprocess")
           break

#计算连续两条日志的时间差
def getBlockInterval(line): 
   t = getDateTime(line)
   global lastDateTime
   blockInterval = (t-lastDateTime).total_seconds() #将datetime时间差用seconds计算
   blockHeight = getBlockHeight(line)

   lastDateTime = t
   print('%s, interval=%s' % (blockHeight, blockInterval)) #打印结果

#获取区块高度
def getBlockHeight(line): 
   return line.split('module')[1].split(' ')[1]

#获取每行日志的时间戳
def getDateTime(line): 
   line = line.split('[')[1][:-1].split('.')[0].replace('|', ' ')
   t = datetime.strptime(line, "%Y-%m-%d %H:%M:%S")
   return t

if __name__ == '__main__':
   monitorLog(logFile)

4. [日志分析结果]

height=4343, interval=1.0
height=4344, interval=1.0
height=4345, interval=1.0
height=4346, interval=1.0
height=4347, interval=1.0
height=4348, interval=1.0
height=4349, interval=2.0
height=4350, interval=1.0
height=4351, interval=1.0

5.[总结-脚本详细注解]

这个Python脚本,其主要目的是监视一个名为blockchain.log的日志文件,并分析其中包含特定字符串('Committed state')的行。该脚本的主要功能和步骤如下:

初始化:

导入所需的模块。
设置日志文件的路径为./blockchain.log。
获取当前时间,并设置为lastDateTime。
主程序(monitorLog函数):

定义一个停止时间(当前时间加上100秒)。
使用subprocess.Popen启动一个子进程来执行tail -f命令,该命令会实时显示日志文件的最新内容。
进入一个无限循环,从子进程的输出中按行读取日志。
如果读取到的行包含'Committed state'字符串,则调用getBlockInterval函数来分析该日志行。
检查当前时间是否超过定义的停止时间。如果超过,则杀死子进程并退出循环。
分析日志(getBlockInterval函数):

从日志行中提取时间戳,并转换为datetime对象。
计算当前时间与上次记录的时间之间的差值(以秒为单位)。
从日志行中提取区块高度。
更新lastDateTime为当前时间戳。
打印区块高度和时间间隔。
辅助函数:

getBlockHeight: 从日志行中提取区块高度。
getDateTime: 从日志行中提取时间戳,并转换为datetime对象。
执行主程序:

如果该脚本作为主程序运行(而不是被其他脚本导入),则调用monitorLog函数开始监视日志文件。
总的来说,这个脚本的主要目的是监视区块链日志,并在找到包含'Committed state'的行时,计算连续两条此类日志之间的时间间隔,并打印出相应的区块高度和时间间隔。这对于分析区块链的性能和稳定性可能非常有用。

标签:python,interval,module,height,--,time,linux,日志,line
From: https://www.cnblogs.com/nwq1101/p/18083661

相关文章

  • 2024-3-19
    多任务级联通过级联(即顺序连接)不同的任务来改善整体模型性能。这种方法通常涉及将几个相关的任务组织成一个流水线,其中每个任务的输出都作为下一个任务的输入。多任务级联的核心思想是利用不同任务之间的内在联系和互补信息,以此来增强模型的泛化能力和提高特定任务的精度。......
  • 立体呈现航空风采,3D漫游可视化探索企业文化新境界
    在科技的浪潮中,3D技术日益成熟,为人们带来了前所未有的视觉体验。而今天,我们将借助这一神奇的技术,开启一场别开生面的航空企业文化漫游之旅,全方位地感受航空企业的魅力与风采。 置身3D模型中,眼前的景象变得栩栩如生,仿佛触手可及。我们可以自由地穿梭于各个展区,欣赏到不同区域的......
  • 解决glibc的问题
    转自:https://wenku.csdn.net/answer/1bc7a1849f6607425da7992aa93c5972linux安装glibc回答1:要在Linux上安装glibc,您可以按照以下步骤操作:打开终端并使用root权限登录。使用以下命令安装glibc:yuminstallglibc或者apt-getinstallglibc等待安装完成后,您可以使用以......
  • 内核current指针
    内核current指针在Linux内核中,current是一个特殊的宏,它用于指向当前正在执行的进程描述符。这个宏通常用于内核代码中,以便访问当前进程的各种属性和状态。进程描述符在Linux内核中是一个关键的数据结构,用于表示一个进程或线程。它包含了进程的许多重要信息,如PID(进程ID)、进程状......
  • 那些放弃Jira的企业都找了哪些替代工具?盘点15款
    15个类似Jira的免费软件:1.PingCode:项目管理系统国产化方面的Jira替代方案;2.Worktile:非研发项目管理的Jira替代方案;3.Redmine:项目管理与问题跟踪的Jira替代方案;4.禅道:敏捷开发和项目管理的Jira替代方案;5.Trello:任务管理和协作的Jira替代方案;6.Visure:需求管理方面的Jira替......
  • lesson7单引号+双括号布尔盲注或一句话木马+蚁剑
    lesson7单引号+双括号布尔盲注或一句话木马+蚁剑1.验证注入点从下面的注入测试来看,只有两种输出结果如果sql执行了,就会输出“Youarein…Useoutfile…”,反之输入“YouhaveanerrorinyourSQLsyntax”?id=1--+--Youarein....Useoutfile......?id=1'--+--......
  • kubeshark查看k8s中pod的流量
    kubeshark的介绍在底层实现当中,Kubeshark主要使用到了Linux内核中的各种内置方法和API,隐藏了对流量数据的加解密实现,可以直接收集到K8s集群中的加密和未加密流量。对网络数据的收集主要使用了直接抓包法和基于拓展伯克利包过滤(eBPF)的数据包获取。直接抓包法涉及libpcap、AF_PACKE......
  • dependencies和devDependencies之间的区别?
    dependencies-项目依赖在编码阶段和呈现页面阶段都需要的项目依赖即在开发环境中,又在生产环境中eg:js框架Vue、页面路由vue-router、各种UI框架antd、element-ui、vantdent-save-dev下载的插件放在devDependecies中-save下载的插件放在dependencies对象中devDependenc......
  • mybatis工作原理简介
    一、前言本例没有引入spring框架。简单介绍了mybatis查询数据库数据的流程。 二、准备工作1,安装数据库此处安装mysql,官网下载“社区版”,过程百度。 2,安装可视化工具此处安装sqlyog,官网下载“社区版”,过程百度。3,创建maven项目,引入mybatisa,idea上,New->Project->......
  • 02-【K210】FPIO的API介绍和简单应用
    目录01概述02特性03接口04api接口验证01概述Fpioa(FieldProgrammableI/OArray)AllowsTheUserToMap256InternalFunctionsTo48FreeI/OsOnTheChip02特性•SupportForI/O’SProgrammableFunctionSelection•8DrivingCapabilityOptionsForI/OOutp......