Python 实时日志监控

需求:对接第三方系统,获取对方产生的实时日志,解析有用信息然后储存。

第一步:在我们的服务器上搭建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编码,失败的时候还需要重新解码,然后保存到文件,效率较低
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python实时监控可以用于对应用程序的日志进行实时分析,并在满足某个条件时立即报警。比如,监控nginx的请求时间和响应时间,可以分析出最耗时的请求,并提醒开发人员关注。这种监控方式可以应用到任何需要判断或分析文件的地方。 另外,如果你对Python编程感兴趣,可以加入Python学习扣群:881982657。这个群里有资源共享和技术解答,你可以与其他成员一起交流Python编程经验。此外,还有一份Python学习教程可以帮助你更好地学习Python。 总结来说,Python实时监控可以用于对日志进行实时分析并报警,同时在学习Python方面,加入相关学习群体可以获得资源共享和技术解答的帮助。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [这三种方法,可以用 Python实时监控文件](https://blog.csdn.net/ajian6/article/details/90732339)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [Python搭建一个系统信息实时监控数据可视化大屏](https://blog.csdn.net/weixin_43373042/article/details/119284252)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值