在运维中,经常需要实时监控日志内容,根据某种策略来判断是否发出邮件告警,通知相关人员及时处理。读取日志的时间间隔可以根据实际情况来设定,可以1分钟、或者5分钟。
告警策略:
实时读取日志的三种方法:
Python和shell命令结合 Python语言简单,功能强大,适合数据统计。有些shell命令过滤文本的效率很高,使用也很简单,比如grep。可以把Python的统计能力和shell命令高效过滤结合在一下提高统计大日志的效率
采用多进程 如果有很多日志文件要统计,可以采用多进程和shell结合,每个进程统计一个日志,最后再把各进程统计出来的结果汇总起来。这里是不是有一点MapReduce的味道。
下面给出一个Demo的代码框架:
# -*- coding: utf-8 -*-
import os
from glob import glob
from functools import reduce
from multiprocessing import Pool
LOG_PATH = '/applogs/face*/log.*'
def get_all_logs():
return glob(LOG_PATH)
def processing_fun(log_path):
result = {}
cmd = 'grep userid {file}'.format(file=log_path)
r = os.popen(cmd) # Python 调用grep命令过滤日志
text = r.read() # 获取过滤后的日志内容
# do something # 统计日志
return result
def reduce_fun(x, y):
# 合并统计结果
ret = {}
# do something
return ret
def main():
all_logs = get_all_logs()
pool = Pool(processes=4)
map_result = pool.map_async(func=processing_fun, iterable=all_logs)
pool.close()
pool.join()
data = map_result.get()
result = reduce(reduce_fun, data) # 最终的统计结果
print(result)
if __name__ == '__main__':
main()