journalctl查不到日志的首要原因是服务未由systemd管理;其次可能是日志输出被重定向、daemon化、配置了StandardOutput=null、日志存储模式为volatile、磁盘配额满、文件权限或SELinux限制。
journalctl 查不到服务日志,先确认服务是否由 systemd 管理
很多用户执行 journalctl -u nginx 或 journalctl -u myapp 返回空结果,第一反应是日志丢了,其实更可能是服务压根没用 systemd 启动。比如直接运行 ./server、用 nohup 启动,或通过容器(Docker/Podman)运行——这些场景下 journalctl 默认看不到日志。
验证方法很简单:
- 运行
systemctl list-units --type=service | grep myapp,看服务名是否在列表中且状态为loaded - 检查
/etc/systemd/system/myapp.service或/usr/lib/systemd/system/myapp.service是否存在 - 若服务是手动启动的,
ps aux | grep myapp查看其父进程:如果 PPID 是 1 但不是 systemd(比如是 containerd 或 bash),那它就不受 journalctl 管控
systemd 服务启用了 StandardOutput=journal,但日志仍不出现
即使服务已注册为 systemd unit,日志也可能“不可见”,常见原因是日志输出未被正确捕获。默认情况下,systemd 只捕获写入 stdout/stderr 的内容,且要求进程不自行重定向、不 fork 成守护进程(daemonize)。
典型问题和修复方式:
- 服务脚本里写了
nohup ./app &或调用daemon(),导致子进程脱离 systemd 控制 → 改用Type=simple并禁用 daemon 模式,或改用Type=forking+ 正确设置PIDFile= - 应用内部把 stdout/stderr 重定向到文件(如
log4j2.xml配置了FileAppender)→ 日志根本没经过 systemd → 要么改配置输出到 console,要么保留文件日志并用journalctl --directory /var/log/journal配合外部轮转 -
StandardOutput=null或StandardError=none被显式设置 → 检查 service 文件,删掉或改为journal
journalctl 显示日志但时间范围不对或条目过少
默认 journalctl 只查当前 boot 的日志,而服务可能在上一次重启前就运行了,或者日志被自动清理了。