在机械里面爬不出来的研发。。。。第一次写完整的代码,第一次写帖子。
背景:最近公司在做物联网项目,就是用物理网模块与现有的电控通讯,采集数据然后通过中继器上传到云平台。由于成本控制,模块也比较极限(合作方说的),容易出现重启,丢包等情况。所以我们这边整机测试的时候,需要长时间运行监控模块的异常情况。
ps:第一次看见日志满屏幕跑的数字,感觉挺新奇。。。有一种错觉,我是不是不用干机械了,哈哈
需求:写个简单的程序,实时监控日志的关键字,出现“初始化”、“发送失败”等异常的字眼,就把这个日志记录下来,并统计整个时间段发生的次数。
日志用的是secureCTR工具,能够自动加时间戳,并保存log格式文件。
总结:
1、整体都是面向百度和CSDN编程,感觉每种需求都有好多中方式实现,都是选择我能理解比较简单好实现的方式;
2、如果关键字有10个,那def key()函数会特别长,求大佬推荐个更好用的方式;
3、如果我想同时监控处理多个log只能进行多开程序,目前想到就是这个代码再复制贴一遍,还没想好怎么实现;
3、一个比较严重的BUG,就是最后一个while Ture循环,封装到应用程序之后,不能通过按键或者指令中途暂停,想要停止运行,只能关闭程序。找了一下,没学会。求大佬推荐点通俗的链接,能解决这个问题;
4、设备24小时一直运行,人也不怎么看着。本来想如果出现异常,主动通过微信发一个消息提醒一下。但是现在好像网页版微信一直登陆不上去。有没有其他什么方式。或者大佬们都怎么实现的,消息提醒的。
如下是代码实现:
1、定义初始值
import datetime
import time
import re
a = 0 # 失败次数
b = 0 # 重启次数
count1 = 0 # 当前行数初始值`
2、打开日志log文件,读取日志内容
def file_open(file_paths): # 函数打开文档,读取行数
global log # 全局变量 行数
global count # 全局变量 当前行数
with open(file_paths, mode='r',encoding='utf-8') as f: # 打开指定位置的文档
log = f.readlines() # 按行读取
count = len(log) # 读取总行数
print(count)
3、逐行匹配关键字,如果匹配上则保存当前行日志到“error-file”中
def key(): # 按行匹配,匹配到“发送失败”,就匹配该行的文字
global count1, a, b
global key1,key2
for lens in range(count1,count): # 上一次结束的行数开始,到总行数
lines1=log[count1]
Key1 = re.findall(key1, lines1, re.M)
Key2 = re.findall(key2, lines1, re.M)
if Key1: # 先匹配Key1 关键字
a=a+1
print("第",a,key1) # 按行匹配,匹配到“Key1”,记录第几次
with open(error_file_path, mode='a', encoding='utf-8') as error_file:
error_file.write(log[count1]) # 记录到错误日志文件中
elif Key2: # 再匹配Key2 关键字
b=b+1
print("第",b,key2) # 按行匹配,匹配到“Key2”
with open(error_file_path, mode='a', encoding='utf-8') as error_file:
error_file.write(log[count1]) # 记录到错误日志文件中
# elif Key3: # 可以根据需要添加更多的关键字匹配
else :
pass
count1 = count1+1 # 下次开始的行数
4、运行之前,配置log格式日志的文件路径,并定义error_file的保存路径。(如果就自己用,可以直接写死,不用每次配置。这里想给其他人电脑用,所以加了这个)
# 输入文件路径和文件名
file_path = input(print("输入文件路径(包含文件名):"))
file_name = input(print("请输入日志文件名:"))
file_paths = file_path + '\\'+ file_name # 日志路径生成
error_file_name = "error_file.log" # 错误日志文件名
error_file_path = file_path + '\\'+ error_file_name # 错误日志路径
5、主程序,先配置需要监控的关键字,这里只定义了两个。
# 输入需要监控关键字
key1 = input(print("输入监控关键字1:"))
key2 = input(print("输入监控关键字2:"))
while True: # 让他一直循环
file_open(file_paths) # 打开文档,日志保存路径
key()
print("总计",key1,a,"次;"," 总计",key2,b,"次;")
time.sleep(10) # 间隔10秒刷新检测一次