插件窝 干货文章 nginx日志access_log怎么配置

nginx日志access_log怎么配置

Nginx access log 日志 826    来源:    2025-04-21

Nginx access_log 配置详解

access_log 是 Nginx 中用于记录客户端访问日志的重要指令。以下是关于如何配置 access_log 的详细信息:

基本语法

access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];

或关闭日志记录:

access_log off;

常用配置示例

1. 基本配置

access_log /var/log/nginx/access.log;

2. 指定日志格式

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

access_log /var/log/nginx/access.log main;

3. 缓冲写入日志

access_log /var/log/nginx/access.log main buffer=32k;

4. 压缩日志

access_log /var/log/nginx/access.log main gzip;

5. 按条件记录日志

access_log /var/log/nginx/access.log main if=$loggable;

6. 不同位置使用不同日志

server {
    access_log /var/log/nginx/example.com.access.log main;

    location /private/ {
        access_log /var/log/nginx/private.access.log main;
    }
}

常用日志变量

Nginx 提供了许多内置变量可用于日志格式:

  • $remote_addr - 客户端IP地址
  • $remote_user - 客户端用户名(用于基本认证)
  • $time_local - 本地时间
  • $request - 请求行(GET / HTTP/1.1)
  • $status - 响应状态码
  • $body_bytes_sent - 发送给客户端的字节数
  • $http_referer - 来源页面
  • $http_user_agent - 客户端浏览器信息
  • $http_x_forwarded_for - 代理服务器IP
  • $request_time - 请求处理时间(秒)
  • $upstream_response_time - 后端服务器响应时间

高级配置

1. 日志轮转

通常配合 logrotate 使用,示例配置 /etc/logrotate.d/nginx:

/var/log/nginx/*.log {
    daily
    missingok
    rotate 14
    compress
    delaycompress
    notifempty
    create 0640 www-data adm
    sharedscripts
    postrotate
        [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
    endscript
}

2. JSON 格式日志

log_format json_combined escape=json
  '{'
    '"time_local":"$time_local",'
    '"remote_addr":"$remote_addr",'
    '"remote_user":"$remote_user",'
    '"request":"$request",'
    '"status": "$status",'
    '"body_bytes_sent":"$body_bytes_sent",'
    '"request_time":"$request_time",'
    '"http_referer":"$http_referer",'
    '"http_user_agent":"$http_user_agent",'
    '"http_x_forwarded_for":"$http_x_forwarded_for"'
  '}';

access_log /var/log/nginx/access.log json_combined;

3. 条件日志记录

map $status $loggable {
    ~^[23]  0;  # 不记录2xx和3xx响应
    default 1;
}

access_log /var/log/nginx/errors.log main if=$loggable;

性能优化建议

  1. 对于高流量网站,使用缓冲日志:

    access_log /var/log/nginx/access.log main buffer=64k flush=5m;
    
  2. 考虑将静态资源请求记录到单独的文件或完全禁用:

    location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
       access_log off;
    }
    
  3. 使用 syslog 将日志直接发送到远程日志服务器:

    access_log syslog:server=10.0.0.1:514,facility=local7,tag=nginx,severity=info main;
    

希望这些信息对您配置 Nginx 访问日志有所帮助!