Linux 服务器日志被删除,如何通过
写在前面
很多新手运维碰到 Linux 服务器日志被删除时,第一反应是“完了,查不了原因了”。
其实只要服务器使用了 systemd 作为 init 系统(绝大多数 CentOS 7+、Ubuntu 14.04+、Debian 8+ 都是),journalctl 就能从 systemd-journald 的二进制日志文件中捞出历史记录,哪怕 /var/log/messages 或 /var/log/syslog 已经被清空。
本文基于一个真实场景:登录 SSH 后发现 /var/log/secure 文件被人删了,但之前还在运行的排查思路。
下面直接进步骤。
准备工作
- 确保你有 sudo 或 root 权限。journalctl 读取日志需要权限。
- 确保 systemd-journald 服务正在运行:
systemctl status systemd-journald
如果显示 active (running),直接开始。
如果未运行,先启动:
systemctl start systemd-journald
- 注意:如果日志被删除后服务器重启过,且 systemd-journald 的持久化配置未打开,旧日志可能已丢失。默认情况下,日志存储在
/run/log/journal/(重启后消失)。如果希望日志持久化,需手动开启:
sudo mkdir -p /var/log/journal
sudo systemd-tmpfiles --create --prefix /var/log/journal
sudo systemctl restart systemd-journald
这一步不是本文重点,但建议生产环境提前开启。
使用 journalctl 恢复被删除的日志
1. 查看所有可用日志
直接执行:
journalctl
默认会显示从当前启动以来的全部日志(如果磁盘空间允许,还会包含以往启动的记录)。
如果日志文件被删但系统未重启,这些记录仍然存在。
2. 按时间范围筛选
比如你要恢复昨天下午 3点到5点的 SSH 登录日志:
journalctl --since "2025-04-07 15:00" --until "2025-04-07 17:00" -u sshd
解释:-u 后面跟服务名(如 sshd、nginx、mysqld),只输出该服务的日志。
不加 -u 则输出所有。
常用单位:
--since yesterday昨天到现在--since "-1h"过去1小时--until "now"到现在
3. 导出日志到文件
如果想保存下来慢慢分析,可以用重定向:
journalctl --since "2025-04-01" --until "2025-04-07" > /tmp/history.log
这样就把指定时间窗口的完整日志保存到 /tmp/history.log 中了,以后就算服务重启也还在。
4. 查找特定关键词
例如想找出所有包含 “Failed password” 的记录:
journalctl -u sshd | grep "Failed password"
或者配合 -o cat 让输出更干净:
journalctl -u sshd -o cat --since today | grep "Failed password"
避坑指南
- 不要误以为 journalctl 只显示当前启动的日志。只要日志未过期(默认日志上限为 10% 磁盘空间),之前的启动记录也能看到。可用
journalctl --list-boots列出所有启动序号和起始时间,然后用journalctl -b -1查看上一次启动的日志。 - 如果日志被删除后立刻重启,且 persistent logging 未开启,那么重启前的日志会彻底丢失。所以发现日志被删后,不要急着重启,先执行 journalctl 导出。
- 日志文件被删除不等于 journalctl 失效。systemd-journald 在内存或持久文件中维护了独立的二进制日志,与
/var/log/下的文本日志是两个体系。删了后者不影响前者。 - 使用
journalctl --flush可以把当前内存中的日志刷到磁盘。如果你正在排查问题,建议先执行这个命令再导出。
验证恢复结果
导出后,用文本编辑器或 less 打开导出文件,检查是否存在你需要的记录。
例如:
less /tmp/history.log
搜索特定 IP 或失败事件:
grep "192.168.1.100" /tmp/history.log
如果命令返回了匹配行,说明恢复成功。
同时可以对比系统目前的 /var/log/secure 文件(如果已经被删则不存在),验证 journalctl 确实提供了备用数据源。
如果你正在处理 Linux 服务器日志被删除 的情况,建议先按本文步骤完整执行,再根据自己的环境做微调;
遇到异常时优先回看避坑和高频问题部分。
高频问题解答
- Q: 日志保留多久?
A: 取决于 SystemMaxUse 和 MaxRetentionSec 配置。
默认 SystemMaxUse=10%(可用磁盘的 10%),日志文件达到上限后会删除最旧的。
可用 journalctl --vacuum-size=200M 手动控制保留大小。
- Q: journalctl 返回“No journal files were found”
A: 表示系统从未启用过 journald 持久化,且当前启动后没有产生日志。
检查 /run/log/journal 是否存在,若不存在则说明 journald 未运行或配置异常。
- Q: 如何让日志永久保存,避免下次再丢?
A: 参考上面“准备工作”中的持久化配置。
编辑 /etc/systemd/journald.conf,设置 Storage=persistent,然后重启 journald 即可。