`

模块简单设计——用脚本监控日志

 
阅读更多

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

分享到:
评论

相关推荐

    非常网管Windows脚本应用详解

    PowerShell支持对象级管道、模块化设计、高级脚本语言特性,如函数、类和异常处理。网络管理员可以通过PowerShell来管理Windows服务、注册表、网络设备等,实现更复杂的自动化任务。 3. **VBScript和JScript** ...

    Linux的Web程序设计——PHP网站开发.rar

    2. **Apache配置与管理**:掌握Apache的安装、配置文件结构、虚拟主机设置、模块管理、错误日志分析等。学会如何通过修改`.htaccess`文件实现URL重写,优化SEO。 3. **PHP安装与配置**:学习在Linux环境下安装PHP,...

    毕业设计——基于监督学习的web入侵检测系统(0day收集器).zip

    【标题】:“毕业设计——基于监督学习的web入侵检测系统(0day收集器).zip”揭示了这个项目的核心是构建一个能够识别和防御Web应用中的未知(0day)攻击的入侵检测系统。监督学习是一种机器学习方法,通过已有的...

    TCL脚本学习资料——入门必看

    2. 系统管理:通过TCL脚本进行服务器维护、监控、日志分析等任务。 3. GUI应用:TCL/Tk可用于快速构建跨平台的图形用户界面。 综上所述,这个TCL学习资料压缩包将涵盖TCL的基础语法、常用命令、文件操作、错误处理...

    ASP毕业设计——ASP基于web的信息处理系统(源代码+论文+开题报告+中期检查表).zip

    6. **错误处理和日志记录**:良好的错误处理机制能确保系统在遇到问题时提供有用的反馈,而日志记录则有助于调试和监控系统的运行状态。 7. **文档**:源代码、论文、开题报告和中期检查表,这些都是项目开发过程中...

    网络监控软件的设计与实现

    《网络监控软件的设计与实现——基于C语言的探讨》 在信息技术日新月异的今天,网络监控软件作为管理和维护网络安全的重要工具,其设计与实现的重要性不言而喻。本文将深入探讨一款基于C语言的网络监控软件的开发...

    课题设计——科研成果申报管理系统(JSP)

    8. **日志记录**:为了便于问题排查和性能监控,系统会集成日志框架(如Log4j或SLF4J),记录操作日志和异常信息。 9. **安全防护**:系统应考虑安全性,如使用HTTPS协议保证数据传输安全,防止SQL注入和跨站脚本...

    keepalived 配置文件 附带检测脚本示例

    4. **健康检查(health_check)**:通过检测脚本或内置检查模块来确保服务的可用性。 在`vrrp_instance`部分,我们通常会看到`state`(主/备用状态)、`interface`(绑定的网络接口)、`virtual_ipaddress`(VIP)...

    PHP论文格式化系统——前台的设计与实现(源代码+论文).zip

    - 部署与监控:部署到服务器后,利用Nginx或Apache进行负载均衡,使用日志分析工具监控系统状态。 7. 源代码与论文 源代码是系统实现的具体体现,包含了上述所有设计和实现的细节。论文则对整个项目进行了深入的...

    初学——简单的快递网站

    在构建“初学——简单的快递网站”项目时,开发者成功地实现了基础的核心功能,使得用户能够进行基础的快递查询和管理。尽管系统在用户体验和功能完善性方面还有待提升,但这一初步成果对于初学者来说是一项值得肯定...

    WinCC技术手册——WinCC/WebNavigator 使用入门(中文)

    《WinCC技术手册——WinCC/WebNavigator 使用入门》是一份专为中文用户设计的详细指南,旨在帮助读者理解和掌握Siemens的WinCC监控与控制系统以及WebNavigator模块的使用方法。WinCC是西门子推出的一款强大的人机...

    myLog3.rar_日志管理系统

    《日志管理系统设计与实现——基于J2EE的实践指南》 日志管理系统在软件开发中扮演着至关重要的角色,它能帮助开发者监控系统运行状态,定位错误,优化性能,以及进行安全审计。本项目“myLog3.rar”提供了一个基于...

    软件工程课程设计-学生选课系统.软件工程课程设计-学生选课系统

    《软件工程课程设计——学生选课系统》是一个典型的软件开发项目,它涵盖了软件工程的多个重要环节,包括需求分析、系统设计、编码实现、测试与维护。以下将详细阐述这个项目涉及的关键知识点。 1. 需求分析:在...

    我的运维平台——源码.7z

    【标题】"我的运维平台——源码.7z"揭示了这是一个包含运维平台源代码的压缩文件。在IT行业中,运维平台通常是用于自动化系统管理、监控、故障排查和性能优化的工具。源码是程序的基础,它允许开发人员理解和修改...

    利用宝塔实现夸克自动签到以获取永久存储空间

    3. **设置计划任务**:在宝塔面板中,进入“计划任务”模块,新建一个任务,选择执行周期(例如每天一次),指定执行脚本的路径,确保脚本具有执行权限。设置好后,宝塔会在指定的时间自动运行这个脚本,实现夸克的...

    毕设项目——基于SpringBoot的企业信息化管理系统(内含搭建流程)

    企业信息化管理系统,内置模块如:部门管理、角色用户、菜单及按钮授权、数据权限、系统参数、日志管理、通知公告等。在线定时任务配置;支持集群,支持多数据源。 适用范围:毕业设计、课程设计、学习等等。 文件...

    网络操作系统的课程设计 Linux课程设计

    【网络操作系统课程设计——Linux课程设计】主要涵盖了Linux环境下网络服务的搭建,特别是Apache服务器、MySQL数据库和PHP的源码安装配置,以及phpBB论坛软件的集成。以下是详细的知识点解析: **一、课程设计目标*...

    ASP.NET源码——昕友测试系统.zip

    - **错误处理和日志记录**:查看异常处理策略和日志记录,这对于调试和监控系统运行状况至关重要。 - **性能优化**:评估代码是否高效,是否存在内存泄漏、数据库查询优化、页面加载速度等问题。 - **测试框架**:...

    ASP.NET源码——[论坛社区]knetbbs.zip

    - 日志与监控:通过日志记录异常信息,利用工具如 ELK Stack 或 Application Insights 进行性能监控和故障排查。 通过对 "knetbbs" 源码的学习,开发者可以了解 ASP.NET 构建大型 Web 应用的基本架构和设计模式,...

    【软件工程毕业设计】网上鲜花店——系统管理维护.doc

    3. **系统管理**:这部分主要包括系统设置、权限管理、数据备份与恢复、系统日志监控、性能优化等。系统管理员可以调整系统参数,确保系统的稳定运行,同时对用户行为进行监控,防止恶意攻击或欺诈行为。 4. **会员...

Global site tag (gtag.js) - Google Analytics