journalctl 本身不提供告警功能,需结合脚本实现“检测→判断→通知”闭环:通过 -f 实时监听、--output=json 结构化输出、shell/python 做模式匹配与阈值判断,并对接邮件/webhook 等通知渠道,再以 systemd 服务托管保障长期运行。

用 journalctl 做自动化告警,关键不是单纯查日志,而是把日志输出变成可触发动作的信号源。它本身不带告警功能,必须配合外部工具或脚本完成“检测→判断→通知”闭环。
从 journalctl 提取实时、结构化日志流
直接用 journalctl -f 持续监听是最常用起点,但要注意加过滤条件避免噪音。比如只关注特定服务失败:
-
journalctl -u nginx.service -n 0 -f | grep --line-buffered "failed\|error"—— 实时抓 nginx 启动失败或运行错误 -
journalctl _SYSTEMD_UNIT=sshd.service PRIORITY=3 -f—— 只取 sshd 的警告及以上级别(PRIORITY=3 是 warning) - 用
--output=json输出结构化 JSON,方便后续用 jq 解析字段(如_HOSTNAME、SYSLOG_IDENTIFIER、MESSAGE)
用轻量脚本做简单阈值/模式匹配判断
不需要上重型监控系统时,Shell 或 Python 脚本就能快速落地。核心是把日志流当作输入流处理:
- Shell 中用
while read逐行处理,配合计数器或时间窗口(如 5 分钟内出现 3 次 “Connection refused” 就触发) - Python 可用
subprocess.Popen启动journalctl -f,用line.decode().strip()接收每行,再用正则匹配关键错误模式 - 避免脚本卡住:务必设置
--lines=0防止回溯历史日志干扰实时性;用--quiet减少非必要输出
对接通用通知渠道完成告警闭环
判断出异常后,调用标准接口发通知最稳妥:
- 发邮件:用
mail命令或调用curl推送至 SMTP 网关(如 Mailgun、SendGrid API) - 推送到企业微信/钉钉:构造 JSON payload,用
curl -X POST发到 Webhook 地址,附上服务名、主机名、错误摘要 - 写入本地文件或 FIFO 管道,再由另一个进程(如 logrotate 或 systemd timer)统一处理,适合需要审计留痕的场景
用 systemd 服务托管告警逻辑,保障长期运行
手动跑脚本容易断,推荐封装成 systemd service + timer:
- 写一个
alert-nginx-errors.service,Type=simple,ExecStart 指向你的告警脚本 - 配
Restart=always和RestartSec=10,自动恢复中断 - 用
journalctl -u alert-nginx-errors --since "1 hour ago"直接查告警服务自身日志,方便排障











