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监控日志脚本如何使用

15 回复

while 循环 sleep。。正常不应该用系统监听文件改变然后触发回调开始读取么


这个需求很常见,一个实用的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!")
    # 这里可以添加重启逻辑

部署建议

  • systemdsupervisor管理脚本作为后台服务
  • 日志轮转用logrotate处理
  • 敏感信息(如API密钥)放在环境变量中

把这些模块组合起来,加上异常处理和配置解析,就能构建一个完整的监控系统。关键是根据实际需求调整告警阈值和监控频率。

感谢这个优化意见,我尝试用文件监听去优化下

更好的姿势,难道不是潜入微信 API ,直接把异常信息发送到微信 😄

这么多好用的工具,为啥还自己造轮子,轮子还不行

提几个关键词供参考:
1、用 inotify 机制监控文件是否发生变化。但只有 inotify 的话,并不是百分百可靠的,可以以低频率轮询做辅助。
2、用 grok 解析日志,比裸写正则更方便。不知道 python 是否存在模仿品。
3、如果日志量大,python 不太适合搞这种高并发的东西,可以考虑换用其他语言。

可否推荐一些工具?我之所以自己写一个的原因在于:不想为了这个功能装一大堆软件。我之前考察过很多软件,都是部署起来过于繁琐。

这个的确是改进的方向,我之前有看过 itchat 项目,目前为了快速见到效果就没有用到微信接口,以后会像这个方向改进

监控机制正在考虑中,我们的业务场景主要是游戏,产生的日志量可以说是很大,每天量可以达到几个 GB,而且是不停的产生。优化的方向是:占用内存、CPU 小,并且快速简洁,部署方便;

感谢大家提的意见,蛮多都是有益的

我之前用 rsyslog 来实时监控日志,如果对于集群,那就更方便了,效率也很高.

我们的业务场景主要是游戏,产生的日志量可以说是很大,每天量可以达到几个 GB,而且是不停的产生。

确实可以说是很大了。

可惜用的是 powershell 和.net ,不过还是支持一波

贵公司的业务是什么方面的?我一直觉得 rsyslog、Logstash、ElasticSearch、Kibana 主要用在大企业比较多。

等做再多完善完善,说不定以后你也用得上 :-)

回到顶部