Python服务器DevOps监控日志脚本如何使用
作为一名服务器开发人员,需要实时得到服务器日志的异常信息进行排查。我们不可能天天盯着日志去做这项工作,必须由相应的运维脚本来完成。我尝试用 Python 制作了一个监控日志并发送错误信息到开发人员的邮箱的工具。
项目地址在 https://github.com/chuenlungwang/monitorlog ,欢迎 star 和提出 pull request
用途
主要用于对项目产生的日志进行跟踪,并将日志发送给回调函数进行处理。本项目中是 errmailcb.py 处理,找到其中特定正则表达式的行搜集到一起并发送给运维同学。你可以按照你自己的处理逻辑来处理,只需要引入 tail.py 即可。
特点
tail.py 中有一个 Tail 类处理跟踪日志文件,每次尝试读取一行的数据,如果不足一行将不把数据传递给回调函数。Tail 保证传递给回调函数的都是完整的行。Tail 内部有指针记录当前读取到了哪个位置,因此,在运行过程中不会重复读取,并且日志产生很慢的情况下会自行休眠,等待下一次读取。目前默认的休眠时间是 60s。
tail.py 还有一个 tails 函数,会对以当前时间进行格式化文件名的文件进行处理。如果文件不存在则会休眠 120s 再继续尝试。而且因为是对当前时间进行格式化,当日志更换日期时能够持续跟踪。
本项目一次只能单线程跟踪一个日志文件。需要多个文件则需要启动多个进程。
以上文章记录在我的个人网站上:Mr.LONGx 的笔记 http://mrlongx.com/index.php/2017/09/14/monitor-log-project/ 定位很简单,主要以自己看过的书或文章的笔记为主。因为本人是一名游戏服务端的程序员,所以相关的方面会比较多。但不局限于此,我对任何与编程、通信、物理、数学有关的话题都感兴趣。
欢迎大家关注,交流!
Python服务器DevOps监控日志脚本如何使用
这个需求很常见,一个实用的Python监控脚本通常包含几个核心模块。
1. 日志文件监控(核心)
使用watchdog库实时监控日志文件变化是最佳实践。下面是一个基础实现:
import time
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
import re
class LogHandler(FileSystemEventHandler):
def __init__(self, pattern, callback):
self.pattern = re.compile(pattern) if pattern else None
self.callback = callback
def on_modified(self, event):
if not event.is_directory and event.src_path.endswith('.log'):
with open(event.src_path, 'r') as f:
new_lines = f.readlines()[-10:] # 读取最后10行
for line in new_lines:
if self.pattern and self.pattern.search(line):
self.callback(line.strip())
def alert_to_slack(message):
"""发送告警到Slack"""
print(f"[ALERT] {message}") # 实际替换为Slack webhook调用
# 启动监控
observer = Observer()
handler = LogHandler(r'ERROR|CRITICAL', alert_to_slack)
observer.schedule(handler, path='/var/log/', recursive=True)
observer.start()
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
observer.stop()
observer.join()
2. 系统指标收集
结合psutil获取服务器状态:
import psutil
import json
from datetime import datetime
def collect_metrics():
return {
'timestamp': datetime.now().isoformat(),
'cpu_percent': psutil.cpu_percent(interval=1),
'memory_percent': psutil.virtual_memory().percent,
'disk_usage': psutil.disk_usage('/').percent,
'load_avg': psutil.getloadavg()
}
# 定期收集并写入日志
metrics = collect_metrics()
with open('/var/log/system_metrics.log', 'a') as f:
f.write(json.dumps(metrics) + '\n')
3. 进程监控 确保关键服务在运行:
import subprocess
def check_process(process_name):
try:
result = subprocess.run(
['pgrep', '-f', process_name],
capture_output=True,
text=True
)
return bool(result.stdout.strip())
except:
return False
if not check_process('nginx'):
print(f"Process {process_name} is down!")
# 这里可以添加重启逻辑
部署建议
- 用
systemd或supervisor管理脚本作为后台服务 - 日志轮转用
logrotate处理 - 敏感信息(如API密钥)放在环境变量中
把这些模块组合起来,加上异常处理和配置解析,就能构建一个完整的监控系统。关键是根据实际需求调整告警阈值和监控频率。
感谢这个优化意见,我尝试用文件监听去优化下
这么多好用的工具,为啥还自己造轮子,轮子还不行
提几个关键词供参考:
1、用 inotify 机制监控文件是否发生变化。但只有 inotify 的话,并不是百分百可靠的,可以以低频率轮询做辅助。
2、用 grok 解析日志,比裸写正则更方便。不知道 python 是否存在模仿品。
3、如果日志量大,python 不太适合搞这种高并发的东西,可以考虑换用其他语言。
这个的确是改进的方向,我之前有看过 itchat 项目,目前为了快速见到效果就没有用到微信接口,以后会像这个方向改进
监控机制正在考虑中,我们的业务场景主要是游戏,产生的日志量可以说是很大,每天量可以达到几个 GB,而且是不停的产生。优化的方向是:占用内存、CPU 小,并且快速简洁,部署方便;
感谢大家提的意见,蛮多都是有益的
我之前用 rsyslog 来实时监控日志,如果对于集群,那就更方便了,效率也很高.
我们的业务场景主要是游戏,产生的日志量可以说是很大,每天量可以达到几个 GB,而且是不停的产生。
确实可以说是很大了。
可惜用的是 powershell 和.net ,不过还是支持一波
贵公司的业务是什么方面的?我一直觉得 rsyslog、Logstash、ElasticSearch、Kibana 主要用在大企业比较多。
等做再多完善完善,说不定以后你也用得上 :-)


