需求:对接第三方系统,获取对方产生的实时日志,解析有用信息然后储存。
第一步:在我们的服务器上搭建rsyslog服务,开放端口,收集对方产生的日志。
第二步:编写Java服务,批量接收日志信息或文件,解析并储存。
第三步:编写python脚本,监控日志变化,提交增量日志到后台。异常情况处理:服务器访问出错,后台服务处理失败。
方案:
1.启动子进程调用linux工具tail监控日志变化,增量日志临时保存到队列中;
def __init__(self, server_url, upload_file_action, upload_msg_action, file, encoding, sendinterval, retryinterval):
...
self.start_monitor_log()
def start_monitor_log(self):
popen = subprocess.Popen('tail -f ' + self.fileurl, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
pid = popen.pid
print "tail pid:", pid
while True:
line = popen.stdout.readline().strip()
if line:
self.msgqueue.put(line)
2.启动消息发送线程,定期从队列中提取保存的日志并发送,服务器不可达或处理失败则备份日志到文件;
def __init__(self, server_url, upload_file_action, upload_msg_action, file, encoding, sendinterval, retryinterval):
...
self.start_send_msg_task(self.sendinterval)
def start_send_msg_task(self, interval):
try:
logger.info("start msg sendding task, interval:" + bytes(interval))
thread.start_new_thread(self.send_msg_task, ("msg_sending_thread", interval, ))
except:
logger.exception("start msg sending task failed")
def send_msg_task(self, threadName, interval):
while True:
list = []
size = self.msgqueue.qsize()
for i in range(0, size):
list.append(base64.b64encode(self.msgqueue.get()))
if len(list) > 0:
msg = json.dumps(list)
self.sendmsg(msg, self.MODE_NEW_MSG)
time.sleep(interval)
3.服务器不可达和处理异常情况的备份保存在不同的文件夹waitback,backup;
服务不可达
def sendExCallback(self, datas, ex, mode):
logger.exception("perform http request error, save to file")
if mode == self.MODE_NEW_MSG:
list = json.loads(datas[0][1][1])
msgs = []
for s in list:
msgs.append(base64.b64decode(s))
self.savemsg(msgs, self.waitdir)
elif mode == self.MODE_NEW_FILE:
sourcefile = datas[0][1][1]
self.savefile(sourcefile, self.waitdir)
elif mode == self.MODE_EX_FILE:
pass
elif mode == self.MODE_ERR_FILE:
sourcefile = datas[0][1][1]
self.movefile(sourcefile, self.backup)
处理失败
def sendErrCallback(self, datas, httpcode, resp, mode):
logger.error(resp)
logger.error("upload error, try backup")
if mode == self.MODE_NEW_MSG:
self.savemsg(json.loads(datas[0][1][1]), self.backup)
elif mode == self.MODE_NEW_FILE:
sourcefile = datas[0][1][1]
self.savefile(sourcefile, self.backup)
elif mode == self.MODE_EX_FILE:
sourcefile = datas[0][1][1]
self.movefile(sourcefile, self.waitdir)
elif mode == self.MODE_ERR_FILE:
pass
4.启动线程监控waitback文件夹,定期检查,如果文件夹不为空,则尝试发送文件记录至后台服务
def __init__(self, server_url, upload_file_action, upload_msg_action, file, encoding, sendinterval, retryinterval):
...
self.start_monitor_server(self.retryinterval)
def start_monitor_server(self, interval):
try:
logger.info("start monitor server thread, interval:" + bytes(interval))
thread.start_new_thread(self.check_server_task, ("monitor_server_thread", interval, ))
except:
logger.exception("start monitor_server_thread failed")
def check_server_task(self, threadName, interval):
while True:
list = []
for item in os.listdir(self.waitdir):
item = os.path.join(self.waitdir, item)
if os.path.isfile(item):
list.append(item)
if len(list) > 0:
self.redo(list, self.MODE_EX_FILE)
time.sleep(interval)
5.脚本启动时尝试发送处理失败的日志记录,通过线程处理
def __init__(self, server_url, upload_file_action, upload_msg_action, file, encoding, sendinterval, retryinterval):
...
self.start_retry_error_task()
def start_retry_error_task(self):
try:
logger.info("start error retry task")
thread.start_new_thread(self.check_error, ("error_task_retry_thread", ))
except:
logger.exception("start error_task_retry_thread failed")
def check_error(self, threadName):
list = []
for item in os.listdir(self.backup):
item = os.path.join(self.backup, item)
if os.path.isfile(item):
list.append(item)
if len(list) > 0:
self.redo(list, self.MODE_ERR_FILE)
【注】日志原始编码为gb2312,但是其中部分日志又存在乱码,因此暂时先使用base64编码,然后json编码,失败的时候还需要重新解码,然后保存到文件,效率较低
分享到:
相关推荐
基于python实现的linux后台日志监控小项目
Linux centos6.10 python日志监控自动通过sendmail发送邮件或微信消息,不占用CPU
python监控日志文件
实时读取logstash日志,有异常错误keywork即触发报警。 # /usr/bin/env python3 # -*- coding: utf-8 -*- # __author__ = caozhi # create_time 2018-11-12,update_time 2018-11-15 # version = 1.0 # 录像高可用...
主要介绍了Python pyinotify日志监控系统处理日志的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
python脚本通过监控docker容器日志监控hyperledger fabric区块高度、共识时延信息 注意修改文件中数据库信息
主要给大家分享了一个实时分析日志的python小脚本,文中给出了详细的介绍和示例代码供大家参考学习,对大家学习或者使用python具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
基于Python+Flask-SocketIO的日志实时监控工具。 可以监控Mysql查询语句等。 支持:实时监控、查看最后N条 -------- 该资源内项目源码是个人的毕设,代码都测试ok,都是运行成功后才上传资源,答辩评审...
基于Python+Flask-SocketIO的日志实时监控工具
基于python实现的linux后台日志监控小项目
日志文件一般是按天产生,则通过在程序中判断文件的产生日期与当前时间,更换监控的日志文件程序只是简单的示例一下,监控test1.log 10秒,转向监控test2.log 程序监控使用是linux的命令tail -f来动态监控新追加的...
这时就要对日志进行实时分析了,发现时间长的语句就要报警出来,提醒开发人员要关注,当然这是其中一个应用场景,通过这种监控方式还可以应用到任何需要判断或分析文件的地方,所以今天我们就来看看如何用python实现...
基于python实现的linux后台日志监控小项目
主要介绍了Python脚本实现Zabbix多行日志监控过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
一到周末,公司总是会让我们人肉监控服务器状态(因为技术还没到互联网层公司的技术,没有自动化---例如工具Ansible之类的,ε=(´ο`*)))唉) 所以,我觉得这种东西如果可以实现一个远程自动化的监控工具是再好不过了...
利用highcharts生成实时监控数据图表 # 界面预览 -------- 该资源内项目源码是个人的毕设,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! <项目介绍> 1、该资源内项目代码都...