前言:写在前
如果只检查一两个库,那就没有必要使用该方法了,该方法适合得到大量巡检日志(例如用脚本从服务器上采集了较多的服务器巡检日志信息),一般我们写报告要一份份来,需要把巡检日志的内容填写到word中再进行分析,实在比较累。
一、说在前面:还有必要人工巡检吗
说道巡检,很多人嗤之以鼻:现在监控产品铺天飞,Zabbix、Prometheus、Graphite等等,还用得着巡检吗?
答案是肯定的,且不说每种监控产品有运维盲区,单单从知识库的使用来说,现在监控产品仍然无法替代人工巡检的一些经验(当然,未来可能很快会代替,但不知何时)。当无规律的异常零星字符从一个运维人员眼前划过时,他敏锐的鬓角一绷,眉毛上扬,大脑快速检索自有知识库,用可能只有1%相似度的比对成功率,第一时间判断出异常的基本原因,这在IT圈内已经是最常见的场景了。因此,必须强调:人工巡检仍然是保障系统稳定的最关键的手段之一,在常规监控基础上,保持一定频率的人工巡检,是保障稳定运行的制胜法宝。
二、以前的巡检报告怎么写的
一般流程是这样的:
第一步:到用户系统采集信息。一般是用脚本完成的,自动化采集,少量依靠人工采集。采集脚本(或程序)是每个公司的秘密武器,巡检同一个对象,90%的公司采集的信息是相同的,其余10%就是他们的“内部资料”,毕竟在一个专业上深耕多年,掌握一些“核心技术”也是理所当然的。
第二步:按照用户系统分类或者机器分类,每个系统按照一定格式,出一份巡检报告。
出报告是最让运维人员头疼的,例如,用户的数据库系统,动辄上百套,每一套都要出一套报告,从采集的日志文件中,Ctrl+C,Ctrl+V,将原始日志采集到巡检报告中,复制的好不快乐,也好生手疼。另外,采集日志时密密麻麻,时间长了眼睛也不舒服。
三、Python来帮忙写报告
总体思路:
按照指定格式到客户服务器上采集日志(分隔符可以自定义),日志下载到本地,放到指定目录下,运行python程序,即可自动创建word巡检报告。
有如下特点:
1、批量读取巡检日志文件,每个日志文件生成一个word文件,word文件命名从log文件名中截取。
2、可以初步填入巡检意见
3、仍然需要打开文档,人工填入其它意见(毕竟,这些意见才是我们的财富,当然,如果知识库函数运用的好,也就省略了)。
安装python,安装pip,然后安装pip install python-docx,略。
第一步:导入包:
import re # 正则表达式用
from docx import Document #word文档用
import os #遍历目录用
from docx.oxml.ns import nsdecls #word样式
from docx.oxml import parse_xml # word样式
第二步:定义四个函数
第一个函数:数字大小写转换函数:num_to_char
这个函数主要用于阿拉伯数字转中文大写,例如,如果是一级标题,采用“一、巡检内容”,比起“1、巡检内容”才是标准写法。
代码如下:
第二个函数:get_title函数
这个函数是巡检项“标题函数”,例如,“Check file system”就是“主机文件系统巡检”,毕竟我们不是歪果仁,标题还是要用中文。
第三个函数:get_knowledge知识库函数
这个函数是知识库函数,即在确定采集结果中存在某种问题的时候,利用知识库,输出初步分析结果。实际上进行动态比对及各种相似度分析,python非常在行,这里只是一个功能展示。
第四个函数:list_dir
该函数用于获取指定目录下所有特定文件,例如,此处指定check*.log格式的文件是需要处理的文件。
因为python代码有严格的缩进限制,所有截图给大家。部分代码来源网络。
源码:因编辑器原因,下面的可复制代码没有出现缩进,请参考图片:
第一个函数源码(参考):
def num_to_char(num):
“”“数字转中文”""
num = str(num)
new_str = “”
num_dict = {“0”: u"零", “1”: u"一", “2”: u"二", “3”: u"三", “4”: u"四", “5”: u"五", “6”: u"六", “7”: u"七", “8”: u"八",
“9”: u"九"}
listnum = list(num)
# print(listnum)
shu = []
for i in listnum:
# print(num_dict[i])
shu.append(num_dict[i])
new_str = “”.join(shu)
# print(new_str)
return new_str
第二个函数源码(参考):
def get_title(flag_fg):# flag_fg是传入的分隔段,其实也是英文标题
if ‘Check file system’ in flag_fg:
xj_title_hs = ‘主机文件系统巡检’
elif ‘Check CPU &MEM’ in flag_fg:
xj_title_hs = ‘CPU、内存检查’
elif ‘Check ETH’ in flag_fg:
xj_title_hs = ‘网卡状态检查’
elif ‘Check /var/log/message’ in flag_fg:
xj_title_hs = ‘主机日志检查’
elif ‘Check transparent_hugepage’ in flag_fg:
xj_title_hs = ‘LINUX系统透明大页检查’
elif ‘Check nr_hugepages’ in flag_fg:
xj_title_hs = ‘LINUX系统大页开启情况检查’
elif ‘Check meminfo’ in flag_fg:
xj_title_hs = ‘PLNOCHECK’
###…
else:
xj_title_hs = flag_fg #很关键,防止穷尽不了英文标题
return xj_title_hs
第三个函数源码(参考):
def get_knowledge(str_input):
str_output = [] # 没发现什么,就先输出巡检正常。
str_output_text=‘巡检正常’
if ‘[always] madvise never’ in str_input:
str_output = [‘Linux未关闭透明大页,根据ORACLE安装要求,应关闭透明大页,提升ORACLE 内存及IO读写性能’,‘1111111’]
elif ‘always madvise [never]’ in str_input:
str_output = [‘巡检正常:Linux已关闭透明大页’,‘000000’]
else:
str_output = [‘巡检正常’,‘000000’]
return str_output
#这个例子是静态比对,实际上进行动态比对及各种相似度分析,python非常在行
#知识库分析,应该能区分正常巡检结果与异常巡检结果,本例用’000000’表示正常,'1111111’表示存在异常
第四个函数源码(参考):
def list_dir(file_dir):
dir_list = os.listdir(file_dir)
file_r = []
for cur_file in dir_list:
# 准确获取一个txt的位置,利用字符串的拼接
path = os.path.join(file_dir, cur_file)
if cur_file.startswith(“check”) & path.endswith(".log"):
file_r.append(path)
return file_r
后续:将介绍main函数,main函数实现了文件的读取、文件分割、word表格操作等内容,是实现巡检日志自动生成word文件的主要部门。