linux-实现日志分析--python

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'的行时,计算连续两条此类日志之间的时间间隔,并打印出相应的区块高度和时间间隔。这对于分析区块链的性能和稳定性可能非常有用。
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Linux-rga是一个开源软件项目,它提供了一种快速的文本搜索和定位技术。在Linux系统上,原始的grep、sed和awk等工具无法满足实际需求。Linux-rga使用了一种模式匹配和搜索算法,允许用户快速搜索任何类型的文件,并返回能够匹配输入模式的行。这个项目还可以通过使用命令行工具、API或 Graphical User Interface(GUI)来进行操作,以便于用户执行其他文件操作、查看搜索结果和更改设置。 Linux-rga开发需要具备良好的编程技能、熟练掌握Linux操作系统、了解文本处理和搜索中的算法和数据结构等。而且该项目不断更新和完善,因此还需要具备学习能力和分析能力,及时跟进新的技术和转变。 此外,Linux-rga是一个开放的社区项目,开发者可以在Github上提交问题和反馈,提出新想法和功能需求,并与他人协作完成代码更新和维护。因此,开发者还需要具备团队合作精神和良好的沟通能力。 总而言之,Linux-rga的开发具有一定的挑战性,需要开发者具备多方面的技能和经验。但它也提供了一个非常好的机会,在开源社区中参与和贡献,自我提高和成长。 ### 回答2: Linux-rga是一款用于搜索文本的开源工具。它可以帮助用户在数十亿条记录中高效地查找特定的文本内容。 该工具基于RocksDB数据库和Google的RE2正则表达式库,它使用倒排索引和布隆过滤器等高效的算法对数据进行快速检索。同时,Linux-rga还提供了多种检索模式,包括文本、正则表达式、全文搜索和模糊匹配等。 该工具的开发主要由一个团队进行,其官方GitHub仓库包含了源代码、文档和使用示例等。Linux-rga在Linux、Mac OS和Windows上都可以运行,支持多种编程语言的接口,如C、C++、Python等。 在实际应用中,Linux-rga被广泛用于各种搜索场景,如日志分析、文档检索、代码搜索等。它的高效性和灵活性受到了用户的好评,成为了搜索领域中受欢迎的工具之一。 总之,Linux-rga是一款高效、灵活、易用的文本搜索工具,在文本检索方面具有广泛的应用前景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值