journalctl -u 服务名不显示日志主因是服务未将日志交由systemd-journald管理,常见于journald配置为volatile、service文件重定向stdout/stderr、服务非systemd启动、或日志缓冲延迟。

journalctl -u 服务名不显示最近日志,通常不是命令写错了,而是服务本身没把日志“交”给 systemd-journald。下面几种配置错误最常导致“-- No entries --”或日志明显缺失。
服务未启用持久化日志存储
systemd-journald 默认可能只将日志暂存在内存(volatile 模式),重启后清空,且部分低级别日志(如 info、debug)可能被直接丢弃。
- 检查 /etc/systemd/journald.conf 中是否设置了 Storage=volatile 或未设置 Storage=persistent
- 确认日志级别限制:若 MaxLevelStore=err,则 info、notice、debug 级别日志根本不会存盘
- 修复方法:改为 Storage=persistent、MaxLevelStore=debug,再运行 sudo systemctl restart systemd-journald
服务单元文件中重定向了标准输出/错误
即使服务跑起来了,如果它的 systemd service 文件 把 stdout/stderr 显式重定向到 /dev/null 或某个文件,journalctl 就收不到任何内容。
- 用 systemctl cat 服务名.service 查看实际配置
- 重点检查是否有 StandardOutput=null、StandardError=null 或 StandardOutput=file:/var/log/myapp.log 这类行
- 正确做法是保持默认(StandardOutput=journal、StandardError=journal),或至少设为 journal+console
服务根本没走 systemd 启动流程
journalctl 只能记录由 systemd 启动并托管的进程。如果服务是手动执行(如 gunicorn app:flask)、用 supervisor 管理、或通过 docker run 启动,systemd 完全不知道它存在。
- 运行 systemctl list-units --type=service | grep 服务名 确认该服务是否注册为 systemd 单元
- 检查 systemctl status 服务名 —— 若提示 “not found”,说明它压根不是 systemd 服务
- 若需 journalctl 记录,必须改用 .service 文件 + systemctl start 方式启动
日志缓冲延迟或服务启动即退出
有些服务启动后立刻崩溃退出,来不及刷出日志;或者 journald 缓冲未及时刷新,导致 journalctl -u 看不到最新条目。










