Nginx 日志格式怎么自定义才能记录请求头里的 User-Agent?

一胜楠 阅读 4

我在用 Nginx 做前端项目的反向代理,想在 access_log 里加上请求的 User-Agent,但改了配置后日志没变化,是不是哪里写错了?

我试过在 http 块里加了个 log_format,然后在 server 里用了 access_log 指向这个格式,但重启 Nginx 后日志还是默认的,没看到 User-Agent 字段。

log_format custom '$remote_addr - $remote_user [$time_local] '
                 '"$request" $status $body_bytes_sent '
                 '"$http_referer" "$http_user_agent"';

server {
    listen 80;
    server_name example.com;
    access_log /var/log/nginx/access.log custom;
    ...
}
我来解答 赞 1 收藏
二维码
手机扫码查看
1 条解答
司空爱红
这个问题很典型,根本原因是 log_format 放错地方了。

log_format 只能在 http 块里定义,不能放在 server 块里。你的配置里 log_format 写在 server 外部但没有明确在 http 块中,这样 Nginx 根本不认识这个格式定义。

正确的写法应该是这样:

http {
# log_format 必须在这里定义
log_format custom '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';

server {
listen 80;
server_name example.com;

# 在 server 块里引用这个格式
access_log /var/log/nginx/access.log custom;

location / {
# ... 其他配置
}
}
}


还有一个可能的原因:即使配置写对了,你得用 nginx -s reload 重载配置,不能用 restart 就完事了。reload 会让 Nginx 重新读取配置并应用新的日志格式。

另外提醒一下,$http_user_agent 这个变量记录的是请求头里的 User-Agent,Nginx 会自动从 HTTP 请求头里取这个值,不需要额外配置。

你检查一下你的 log_format 是不是真的放在 http 块里面了?有时候配置文件结构不对,Nginx 不会报错,但那个格式根本不会生效。
点赞
2026-03-12 17:16