Nginx默认不走journald,需通过stdout/stderr重定向:方式一改nginx.conf用/dev/stdout和/dev/stderr;方式二改systemd服务文件设StandardOutput=journal、StandardError=journal并加-g "daemon off;"前台运行。

Nginx 默认不走 systemd 日志系统(journald),而是将 access 和 error 日志直接写入文件(如 /var/log/nginx/access.log),所以用 journalctl -u nginx 看不到请求记录,只能看到启动、崩溃等少量 systemd 管理日志。
让 Nginx 日志进入 journalctl 的两种方式
要让 Nginx 的 access/error 日志也能被 journalctl 查看,需绕过文件写入,改用标准输出(stdout/stderr)——systemd 会自动捕获并转发给 journald。
-
方式一:修改 Nginx 配置,把日志输出到 stdout/stderr
在nginx.conf中替换日志指令:
access_log /dev/stdout main;
error_log /dev/stderr notice;
-
方式二:用 systemd 的 StandardOutput/StandardError 指令重定向(推荐)
不改 Nginx 配置,只改 systemd service 文件。编辑/etc/systemd/system/nginx.service.d/override.conf(若不存在则新建):
[Service]
StandardOutput=journal
StandardError=journal
SyslogIdentifier=nginx
⚠️ 注意:此方式要求 Nginx 启动时以 -g "daemon off;" 运行(即前台模式),否则主进程 fork 出 worker 后会退出,systemd 认为服务已终止。因此还需确保 service 文件中 ExecStart 包含该参数,例如:
ExecStart=/usr/sbin/nginx -g "daemon off;"
启用后如何用 journalctl 查看
重载配置并重启服务:
sudo systemctl daemon-reload
sudo systemctl restart nginx
之后即可使用:
-
journalctl -u nginx— 查看全部日志(含 access 和 error) -
journalctl -u nginx -f— 实时跟踪 -
journalctl -u nginx --since "1 hour ago"— 按时间过滤 -
journalctl -u nginx | grep "404"— 结合 grep 过滤状态码
如果设置了 SyslogIdentifier=nginx,还能用 journalctl SYSLOG_IDENTIFIER=nginx 更精准匹配。
注意事项与常见问题
- Nginx 原生日志格式(如 $remote_addr、$request)不会自动变成 journald 字段;
journalctl只能按整行文本搜索,无法按结构化字段(如 HTTP 状态码)直接过滤 - 日志级别映射:Nginx 的
error_log ... notice对应 journald 的 NOTICE 级别,但 journalctl 默认不显示 NOTICE 以下级别(如 INFO),需加-o verbose或用--priority调整 - 如果仍看不到 access 日志,请确认 Nginx 是否真正在前台运行:
ps aux | grep nginx应无master process后台进程,只有 worker 进程且父 PID 是 systemd(1) - 旧日志文件(如 /var/log/nginx/*.log)不会自动清空,建议停用后手动清理或用 logrotate 排除它们
要不要完全切换到 journalctl?
纯用 journalctl 查日志适合调试和短期排查,但生产环境慎用:
- journald 默认只保留近期日志(通常 1–4 周),且不支持按小时切分、gzip 压缩、远程转发等高级功能
- access 日志量大时,全走 journald 可能增加 systemd 负担,影响 journal 性能和磁盘占用
- 更稳妥的做法是:error 日志走 journalctl(便于关联系统事件),access 日志仍写文件 + 配合 filebeat 或 fluentd 上报
不复杂但容易忽略:关键是让 Nginx 前台运行,并确保 stdout/stderr 真正被 systemd 接管。










