journalctl 显示 No entries 通常是因为 systemd-journald 服务未运行或日志存储模式为易失性。优先检查服务状态并配置持久化存储目录,避免重启后日志丢失。
先说结论:多数情况是 journald 服务异常或未开启持久化存储,需先确认服务状态再创建存储目录。
- 先确认:systemd-journald 服务是否 active
- 先处理:创建 /var/log/journal 目录并重启服务
- 再验证:执行 journalctl -n 5 查看是否有新日志
命令速用版
systemctl status systemd-journald
mkdir -p /var/log/journal
systemd-tmpfiles `--create` `--prefix` /var/log/journal
systemctl restart systemd-journald
journalctl -n 5为什么会这样
根本原因是 systemd-journald 默认可能仅使用易失性存储,重启后日志清空或目录权限不正确导致无法写入。systemd 文档说明 journald 默认存储在 /run/log/journal,该目录位于 tmpfs 上,重启即消失。
若未创建 /var/log/journal 目录,journald 不会持久化日志。此外,服务停止、时间过滤器错误或使用容器环境也会导致查询不到条目。
分步处理
步骤 1:检查服务状态
执行 systemctl status systemd-journald 确认服务处于 active (running) 状态。若显示 inactive 或 failed,执行 systemctl start systemd-journald 启动服务。
步骤 2:检查存储目录
查看 /var/log/journal 是否存在。若不存在,执行 mkdir -p /var/log/journal 创建目录。该目录存在是开启持久化存储的关键标志。
步骤 3:修正权限
执行 systemd-tmpfiles `--create` `--prefix` /var/log/journal 确保目录权限和属组符合 systemd 要求。通常属组应为 systemd-journal,权限为 2755。
步骤 4:重启服务
执行 systemctl restart systemd-journald 使配置生效。若身处容器环境,此步骤可能无效,需确认容器是否共享宿主 journald。
怎么验证是否生效
执行 journalctl -n 5 查看最近 5 条日志。若输出具体内容而非 No entries,说明修复成功。重启服务器后再次执行该命令,若仍有日志记录,说明持久化存储已生效。
常见坑
时间过滤器误导:使用 `--since` 或 `--until` 参数时,若时间范围无日志会报 No entries。排查时先不加时间参数。
权限不足:普通用户可能无权查看系统日志。尝试加 sudo 或将用户加入 systemd-journal 组。
容器环境:Docker 或 Kubernetes 容器内通常不使用宿主 systemd-journald。容器内查询无日志属正常现象,应查容器标准输出。
日志轮转:若磁盘空间不足,journald 可能自动删除旧日志。检查 SystemMaxUse 配置项。
常见问题
为什么加了 sudo 还是 No entries
可能是服务未运行或存储目录未创建。sudo 仅解决权限问题,不解决服务状态和存储配置问题。
重启后日志一定会丢失吗
若未创建 /var/log/journal 目录,重启后日志会丢失。创建该目录并设置正确权限后可持久化保存。
如何查看特定服务的日志
使用 journalctl -u 服务名 命令。若仍无 entries,确认该服务是否正在运行且配置了日志输出。
参考来源
- freedesktop.org, systemd-journald.service 手册页, https://www.freedesktop.org/software/systemd/man/systemd-journald.service.html
- freedesktop.org, journalctl 手册页, https://www.freedesktop.org/software/systemd/man/journalctl.html