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: 取决于 SystemMaxUseMaxRetentionSec 配置。
默认 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 即可。

分享到:
上一篇
用大模型做运维监控,如何减少误报率?
下一篇
服务器数据备份失败,教你使用宝塔定时任务排查
1
系统公告

泽御云五一特惠活动🔥

泽御云持证合规运营,资质齐全可查,长久稳定! 五一限时多重福利同步开启: ✅ 香港 2 核 2G 云服务器超值拼团,低价入手团长免费 ✅ 4 核 4G 多机房年付拼团,性价比拉满 ✅ 内蒙古新区限时 7 折(zeyuyunnmg)特惠,专属优惠码锁价续费 ✅ 全站通用 75 折优惠,老用户充值享专属赠金 官方站点:zeyuyun.com 合规资质齐全|售后有保障|活动限时错过不再有
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意