nginx日志配置需在http块中用log_format定义格式(如json_log),再通过access_log指令在http/server/location块中指定路径与格式;注意权限、路径有效性及用nginx -t校验后reload生效。

要在 Nginx 中配置日志的输出格式和存放位置,核心是配合使用 log_format 和 access_log 两条指令,且必须放在正确的配置作用域内。
定义日志格式:log_format 指令
该指令只能出现在 http 块中,用于声明一种命名的日志格式。它不直接写日志,只定义“长什么样”。
- 格式名称(如
main、json_log、proxy_log)需唯一,后续通过名字引用 - 格式字符串中可插入大量内置变量,比如:
$remote_addr(客户端IP)、$time_iso8601(ISO时间)、$request_time(请求耗时)、$upstream_response_time(后端响应耗时)、$http_x_forwarded_for(真实客户端IP,适用于代理场景) - 示例(定义 JSON 格式):
log_format json_log escape=json '{ "time":"$time_iso8601", "ip":"$remote_addr", "status":$status, "uri":"$request_uri", "rt":$request_time }';
指定日志路径与启用格式:access_log 指令
该指令可出现在 http、server 或 location 块中,决定“往哪写”以及“用哪个格式写”。越靠近请求处理末端(如 location),优先级越高。
- 基本写法:
access_log /var/log/nginx/myapp-access.log main;
表示将日志写入指定文件,使用名为main的格式 - 支持缓存与压缩优化:
access_log /var/log/nginx/app.log json_log buffer=16k gzip flush=5s;
启用 16KB 内存缓冲、gzip 压缩、每 5 秒强制刷盘 - 可关闭某段的日志记录:
location = /health { access_log off; }
常用于屏蔽探针、静态资源等低价值请求日志
路径与权限注意事项
日志路径不能只是“看起来对”,还要确保 Nginx 工作进程有实际写入能力:
- 目录需存在,且 Nginx 运行用户(如
nginx或www-data)对该目录有 w+ x 权限 - 若路径含变量(如
/var/log/nginx/$host-access.log),则必须配合open_log_file_cache提升性能,否则每次写日志都会反复 open/close 文件 - 推荐统一使用绝对路径,避免因工作目录不同导致日志写入失败
验证与生效流程
改完配置后不能直接重启,要走标准验证流程:
- 执行
nginx -t检查语法是否正确、路径是否可访问 - 确认无误后执行
nginx -s reload热重载配置(不中断服务) - 访问目标接口,然后
tail -f /var/log/nginx/xxx.log实时查看是否生成符合预期的日志条目











