一周的时间,走了一半,看着机房上的告警日志多了起来,心里起了疙瘩,再看看涉及到的规则数量,马上要突破300了,疙瘩变成了结石。怎么办呢?那就提前做日志分析,然后把分析的结果,转移到最后的分析报告上。
需求分析
日志分析提前做,意味着与最终结果相比:
- 可能规则触发数量有差别
- 告警信息触发的规则条数有差别
而这两点,都是可以忽略的,反正报告已经可以使用python实现——40W告警日志分析(上)中的脚本自动化完成了,我现在只需要把提前分析的结果转移到最终的分析报告中即可。这个事情,是可以使用python做的。
说人话就是,手头有两个分析报告,如果第一份报告中的名单出现在第二份报告中,就把第一份报告中名单对应的某条信息直接写到第二份报告对应的位置上。
一些优化:如果第二份报告对应位置有数据,数据会被第一份报告的内容覆盖,此行会设置为橙底高亮。
如果第二份报告对应位置没有数据,数据还是会被第一份报告的内容覆盖,此行会设置为黄底高亮。
代码
需要在第6行指定第一份报告的文件位置
需要在第7行指定第二份报告的文件位置
需要在第49行指定输出报告的文件位置
import openpyxl
from openpyxl.utils import get_column_letter
import openpyxl.styles
from openpyxl.styles import PatternFill
excel_old = r'C:\Users\asuka\Desktop\1.xlsx'
excel_new = r'C:\Users\asuka\Desktop\2.xlsx'
tid_column = 2 # tid所在的列
evidence_column = 7 # "判断依据所在的列"
info = {} # 用来存储旧excel表tid和判断依据
# 把旧的Excel表的“规则编号”和“判断依据”存入到字典中
workbook = openpyxl.load_workbook(excel_old) # 返回一个workbook数据类型的值
sheet = workbook.active # 获取活动表
rows = sheet.max_row # 获取行数,值是int型
for i in range(1, rows + 1):
if sheet.cell(i, tid_column).value is None:
continue
info[sheet.cell(i, tid_column).value] = sheet.cell(i, evidence_column).value
workbook.close() # 关闭Excel表格
# 把旧Excel表中的判断依据,覆盖掉新Excel表的判断依据
workbook = openpyxl.load_workbook(excel_new) # 返回一个workbook数据类型的值
sheet = workbook.active # 获取活动表
rows = sheet.max_row # 获取行数,值是int型
for i in range(1, rows + 1):
if sheet.cell(i, tid_column).value in info.keys(): # 如果单元格中的tid值在info字典中找到了
if sheet.cell(i, evidence_column).value is None: # 如果单元格是空白的,就把这一行填充为黄底高亮
sheet.cell(i, evidence_column, info[sheet.cell(i, tid_column).value])
if info[sheet.cell(i, tid_column).value] is None:
print('单元格:' + get_column_letter(tid_column) + str(i) + '\t' + '数据不存在')
else:
print('单元格:' + get_column_letter(tid_column) + str(i) + '\t' + '写入数据' + '\t' + info[
sheet.cell(i, tid_column).value])
choice_cell = sheet[i] # 选中当前行
for j in choice_cell: # 为此行中的每一个单元格填充颜色
pattern_fill = PatternFill(fill_type="solid", fgColor="FFFF00") # 填充黄底高亮
j.fill = pattern_fill
else:
sheet.cell(i, evidence_column, info[sheet.cell(i, tid_column).value])
print('单元格:' + str(get_column_letter(tid_column)) + str(i) + '\t' + '写入数据' + '\t' + info[
sheet.cell(i, tid_column).value])
choice_cell = sheet[i] # 选中当前行
for j in choice_cell: # 为此行中的每一个单元格填充颜色
pattern_fill = PatternFill(fill_type="solid", fgColor="FFA500") # 填充橙底高亮
j.fill = pattern_fill
workbook.save(r'C:\Users\asuka\Desktop\3.xlsx') # 保存excel表
workbook.close() # 关闭Excel表格
print('写入结束')
截图举例
第一份报告:
第二份报告:
运行脚本:
输出的报告: