python脚本实时监控日志
日志每天都会割接重建,所以脚本需要每天都重启(通过crontab shell脚本实现),因为割接重建后tail -f拿不到添加的日志条目。
先来实现一个最简单的,主要用到popen。
#!/usr/bin/env python # ./log_watcher.py -f log import sys import os import getopt import subprocess import time def worker(line): backup = open("backup.txt","a") backup.write(line + "\n") backup.close() def main(): try: opts, args = getopt.getopt(sys.argv[1:], 'f:') except getopt.GetoptError, err: print str(err) sys.exit(1) filename = '' for k, v in opts: if k == '-f': filename = v if not (filename and os.path.exists(filename)): print 'invalid filename : %s' % filename sys.exit(1) cmd = ('tail', '-f', filename) print ' '.join(cmd) output = subprocess.Popen(cmd, stdout=subprocess.PIPE) while True: try: line = output.stdout.readline() except KeyboardInterrupt: print "Quit" sys.exit(1) if not line: time.sleep(0.01) continue line = line.strip().decode('utf8') #do your job here worker(line) time.sleep(0.01) return 0 if __name__ == '__main__': sys.exit(main())
将worker函数替换为所需要执行的任务(比如发起异步请求,多线程操作等)就可以了,为了演示方便,这里仅仅将内容写到别的文件
为了让程序后台运行,可以使用nohup ./log_watcher.py -f log &
为了防止日志产生过快new很多线程出来,可以引用线程池来处理日志队列,为了防止队列过大,需要再灵活控制队列数目,要注意cpu占用率,可以再适当的代码加sleep。
考虑到监控脚本可能异常down掉,需要记录当前解析到的位置(使用tail -n指定位置),不然tail -f取出的消息可能重复或者丢失。经过我的测试,当log文件很大的时候调用wc -l有延时,导致tail的位置不够准确,而且调用tail系统cpu占用过高。下面用简单的文件操作实现。
#!/usr/bin/env python # ./log_watcher.py -f log import Queue import threading import sys import os import getopt import time import urllib, urllib2 import random thread_count = 5 current_pos = 0 mutex = threading.Lock() class MyThread(threading.Thread): def __init__(self, workQueue, resultQueue,timeout=0, **kwargs): threading.Thread.__init__(self, kwargs=kwargs) self.timeout = 0 self.setDaemon(True) self.workQueue = workQueue self.resultQueue = resultQueue self.start() def run(self): while True: try: callable, args, kwargs = self.workQueue.get(timeout=self.timeout) while True: res = callable(args, self.getName()) if res == 1: break time.sleep(1) except Queue.Empty: time.sleep(1) continue except : print sys.exc_info() #raise class ThreadPool: def __init__( self, num_of_threads=10): self.workQueue = Queue.Queue() self.resultQueue = Queue.Queue() self.threads = [] self.__createThreadPool( num_of_threads ) def __createThreadPool( self, num_of_threads ): for i in range( num_of_threads ): thread = MyThread( self.workQueue, self.resultQueue ) self.threads.append(thread) def wait_for_complete(self): while len(self.threads): thread = self.threads.pop() if thread.isAlive(): thread.join() def add_job( self, callable, args, **kwargs ): while True: if self.workQueue.qsize() < 10000: self.workQueue.put( (callable,args,kwargs) ) break time.sleep(0.1) def worker(pline, threadid): splitPos = pline.index("###") pos = pline[0:splitPos] line = pline[splitPos+3:] #deal with each log time.sleep(0.001) back = open("/usr/local/nginx/logs/access.log.bak","a") if mutex.acquire(1): global current_pos current_pos = pos backup = open("log_watcher.pos","w") backup.write(current_pos) backup.close() backup = open("log_watcher.pos.bak","w") backup.write(current_pos) backup.close() back.write(line+"\n") mutex.release() back.close() return 1 def main(): try: opts, args = getopt.getopt(sys.argv[1:], 'f:c:h:') except getopt.GetoptError, err: print str(err) sys.exit(1) filename = '' global current_pos current_pos = 0 global mn_url for k, v in opts: if k == '-f': filename = v elif k == '-c': current_pos = int(v) elif k == '-h': local_ip = v if not (filename and os.path.exists(filename)): print 'invalid filename : %s' % filename sys.exit(1) input = open(filename); input.seek(current_pos) threadPool = ThreadPool(thread_count); while True: pos = input.tell() line = input.readline() line = line.strip() #trim the last "\n" if not line: time.sleep(0.3) continue threadPool.add_job(worker, "%d###%s"%(pos,line)) return 0 if __name__ == '__main__': sys.exit(main())
通过shell脚本运行(crontab中实现定时重启机制),shell脚本先kill掉过期的监控程序,启动新的监控脚本,从新的位置开始监控
#!/bin/bash LOGNAME="/usr/local/nginx/logs/access.log" killall python sleep 1 cd /usr/local/nginx/sbin/ #log currentpos if [ -e "log_watcher.pos" ] then currentPos=`cat log_watcher.pos` if [ -z $currentPos ] then currentPos=`cat log_watcher.pos.bak` if [ -z $currentPos ] then exit -1 fi fi else currentPos=0 fi #refresh pos if log has been dealt fileSize=`ls -l $LOGNAME | awk '{print $5}'` if [ -z $currentPos ] then currentPos=0 fi if [ $fileSize -lt $currentPos ] then rm /usr/local/nginx/logs/access.log.bak currentPos=0 fi localip=`/sbin/ifconfig -a|grep "inet addr:10."|awk '{print $2}'|awk -F: '{print $2}'|sed q` CMD="./log_watcher.py -f $LOGNAME -c $currentPos -h $localip" $CMD
一个简单的功能实现下来也是需要很多代码,主要考虑了各种异常情况,多线程处理需要考虑同步等
使用tail -f虽然可以做到实时统计日志,但是程序重启时依赖wc -l这样的外部命令,耗时导致不够准确
可以用文件操作来实现
上面其实是用轮询查看日志是否有更新,还可以结合inotify库实现真正的实时监控操作。
参照这篇博客:http://blog.csdn.net/fancyerii/article/details/6738564
相关推荐
PowerShell支持对象级管道、模块化设计、高级脚本语言特性,如函数、类和异常处理。网络管理员可以通过PowerShell来管理Windows服务、注册表、网络设备等,实现更复杂的自动化任务。 3. **VBScript和JScript** ...
2. **Apache配置与管理**:掌握Apache的安装、配置文件结构、虚拟主机设置、模块管理、错误日志分析等。学会如何通过修改`.htaccess`文件实现URL重写,优化SEO。 3. **PHP安装与配置**:学习在Linux环境下安装PHP,...
【标题】:“毕业设计——基于监督学习的web入侵检测系统(0day收集器).zip”揭示了这个项目的核心是构建一个能够识别和防御Web应用中的未知(0day)攻击的入侵检测系统。监督学习是一种机器学习方法,通过已有的...
2. 系统管理:通过TCL脚本进行服务器维护、监控、日志分析等任务。 3. GUI应用:TCL/Tk可用于快速构建跨平台的图形用户界面。 综上所述,这个TCL学习资料压缩包将涵盖TCL的基础语法、常用命令、文件操作、错误处理...
6. **错误处理和日志记录**:良好的错误处理机制能确保系统在遇到问题时提供有用的反馈,而日志记录则有助于调试和监控系统的运行状态。 7. **文档**:源代码、论文、开题报告和中期检查表,这些都是项目开发过程中...
《网络监控软件的设计与实现——基于C语言的探讨》 在信息技术日新月异的今天,网络监控软件作为管理和维护网络安全的重要工具,其设计与实现的重要性不言而喻。本文将深入探讨一款基于C语言的网络监控软件的开发...
8. **日志记录**:为了便于问题排查和性能监控,系统会集成日志框架(如Log4j或SLF4J),记录操作日志和异常信息。 9. **安全防护**:系统应考虑安全性,如使用HTTPS协议保证数据传输安全,防止SQL注入和跨站脚本...
4. **健康检查(health_check)**:通过检测脚本或内置检查模块来确保服务的可用性。 在`vrrp_instance`部分,我们通常会看到`state`(主/备用状态)、`interface`(绑定的网络接口)、`virtual_ipaddress`(VIP)...
- 部署与监控:部署到服务器后,利用Nginx或Apache进行负载均衡,使用日志分析工具监控系统状态。 7. 源代码与论文 源代码是系统实现的具体体现,包含了上述所有设计和实现的细节。论文则对整个项目进行了深入的...
在构建“初学——简单的快递网站”项目时,开发者成功地实现了基础的核心功能,使得用户能够进行基础的快递查询和管理。尽管系统在用户体验和功能完善性方面还有待提升,但这一初步成果对于初学者来说是一项值得肯定...
《WinCC技术手册——WinCC/WebNavigator 使用入门》是一份专为中文用户设计的详细指南,旨在帮助读者理解和掌握Siemens的WinCC监控与控制系统以及WebNavigator模块的使用方法。WinCC是西门子推出的一款强大的人机...
《日志管理系统设计与实现——基于J2EE的实践指南》 日志管理系统在软件开发中扮演着至关重要的角色,它能帮助开发者监控系统运行状态,定位错误,优化性能,以及进行安全审计。本项目“myLog3.rar”提供了一个基于...
《软件工程课程设计——学生选课系统》是一个典型的软件开发项目,它涵盖了软件工程的多个重要环节,包括需求分析、系统设计、编码实现、测试与维护。以下将详细阐述这个项目涉及的关键知识点。 1. 需求分析:在...
【标题】"我的运维平台——源码.7z"揭示了这是一个包含运维平台源代码的压缩文件。在IT行业中,运维平台通常是用于自动化系统管理、监控、故障排查和性能优化的工具。源码是程序的基础,它允许开发人员理解和修改...
3. **设置计划任务**:在宝塔面板中,进入“计划任务”模块,新建一个任务,选择执行周期(例如每天一次),指定执行脚本的路径,确保脚本具有执行权限。设置好后,宝塔会在指定的时间自动运行这个脚本,实现夸克的...
企业信息化管理系统,内置模块如:部门管理、角色用户、菜单及按钮授权、数据权限、系统参数、日志管理、通知公告等。在线定时任务配置;支持集群,支持多数据源。 适用范围:毕业设计、课程设计、学习等等。 文件...
【网络操作系统课程设计——Linux课程设计】主要涵盖了Linux环境下网络服务的搭建,特别是Apache服务器、MySQL数据库和PHP的源码安装配置,以及phpBB论坛软件的集成。以下是详细的知识点解析: **一、课程设计目标*...
- **错误处理和日志记录**:查看异常处理策略和日志记录,这对于调试和监控系统运行状况至关重要。 - **性能优化**:评估代码是否高效,是否存在内存泄漏、数据库查询优化、页面加载速度等问题。 - **测试框架**:...
- 日志与监控:通过日志记录异常信息,利用工具如 ELK Stack 或 Application Insights 进行性能监控和故障排查。 通过对 "knetbbs" 源码的学习,开发者可以了解 ASP.NET 构建大型 Web 应用的基本架构和设计模式,...
3. **系统管理**:这部分主要包括系统设置、权限管理、数据备份与恢复、系统日志监控、性能优化等。系统管理员可以调整系统参数,确保系统的稳定运行,同时对用户行为进行监控,防止恶意攻击或欺诈行为。 4. **会员...