目的

需求:nginx日志按照天的单位进行自动分割存储。

样式:

access.json_2025-04-29

access.json_2025-04-28

两种方法

  • nginx本身自带模块map
  • split切割工具

本章介绍方法一(nginx本身自带模块map)

通过使用 $time_iso8601 变量和 map 指令,实现了日志文件按天分割的功能。以下是详细的说明
  1. map指令
map $time_iso8601 $logdate{
    '~^(?<ymd>\d{4}-\d{2}-\d{2})' $ymd;
    default 'date-not-found';
}
  • 作用: map 指令将 $time_iso8601 变量映射为 $logdate 变量,其中 $time_iso8601 是 Nginx 内置的变量,表示请求的时间,格式为 ISO 8601(例如 2024-08-13T20:35:06+08:00)。
  • 正则表达式: ~^(?\d{4}-\d{2}-\d{2}) 用于从 $time_iso8601 中提取日期部分(例如 2024-08-13)。正则表达式中的 (?<ymd>\d{4}-\d{2}-\d{2}) 捕获年-月-日部分,并将其赋值给变量 $ymd。
  • 映射结果: 提取的日期部分被映射为 $logdate 变量,这个变量将用于日志文件的命名。
  1. 日志文件存储
access_log /var/log/nginx/access.json_$logdate json;
  • access_log: 配置了访问日志的路径,并使用 $logdate 变量生成按天分割的日志文件名。日志文件的完整路径格式为 /data/logs/access.json_YYYY-MM-DD,其中 YYYY-MM-DD 是日期。
  1. 工作流程
  • 每当有请求到达时,Nginx 会自动根据请求的时间,使用 map 指令提取日期部分,生成 $logdate 变量。
  • 访问日志会记录在以当前日期命名的日志文件中,如 access.json_2025-04-29。
  • 随着日期的变化,$logdate 变量会自动更新,新的日志将记录到新的一天的日志文件中。

总结

通过 map 指令结合正则表达式,从 $time_iso8601 中提取日期部分,并使用该日期生成动态的日志文件名,从而实现了日志的按天分割功能。每一天都会生成一个新的日志文件,方便日后的日志分析与管理。

这里记得注意启动nginx的用户权限是否 有配置日志路径下的权限,记得日志写入权限的验证。

检查目录所有者和权限

ls -l /var/log/nginx/

修改目录权限为可

sudo chmod -R 755 /var/log/nginx/

完整配置文件

user www-data;
worker_processes 2; 
worker_rlimit_nofile 65535;
pid /run/nginx.pid;
error_log /var/log/nginx/error.log;
include /etc/nginx/modules-enabled/*.conf;
events {
    use epoll; 
    worker_connections 10240; 
}
http {
    sendfile on;
    tcp_nopush on;
    types_hash_max_size 2048;
    include /etc/nginx/mime.types;
    default_type application/octet-stream;
    ssl_prefer_server_ciphers on;
    log_format json  escape=json '{"timestamp":"$time_iso8601",'
                        '"remote_addr": "$remote_addr", '
                        '"referer": "$http_referer", '
                        '"request": "$request", '
                        '"status": $status, '
                        '"bytes": $body_bytes_sent, '
                        '"agent": "$http_user_agent", '
                        '"x_forwarded": "$http_x_forwarded_for", '
                        '"up_addr": "$upstream_addr",'
                        '"up_host": "$upstream_http_host",'
                        '"up_resp_time": "$upstream_response_time",'
                        '"request_time": "$request_time",'
                        '"request_GlobalId": "$http_GlobalId",'
                        ' }';
    map $time_iso8601 $logdate{
            '~^(?<ymd>\d{4}-\d{2}-\d{2})' $ymd;
            default 'date-not-found';
    }
    access_log /var/log/nginx/access.json_$logdate json;
    keepalive_timeout 65;
    client_max_body_size 20M;
    client_header_buffer_size 1k; 
    large_client_header_buffers 4 8k; 
    send_timeout 300; 
    gzip on;
    gzip_comp_level 6; 
    gzip_min_length 1000; 
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; 
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

验证

systemctl restart nginx #重启nginx加载配置生效
http://www.hxy.bj.cn/archives/159/ #访问网站,生成请求日志

验证日志是否生成
root@instance-nsstydow:/var/log/nginx# ll access.json*
-rwxr-xr-x 1 www-data www-data 25247 Apr 29 10:15 access.json_2025-04-29*

验证日志内容
root@instance-nsstydow:/var/log/nginx# cat access.json_2025-04-29 |head -1
{"timestamp":"2025-04-29T09:59:12+08:00","remote_addr": "223.104.43.25", "referer": "", "request": "GET /archives/141/ HTTP/1.1", "status": 200, "bytes": 27287, "agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36", "x_forwarded": "", "up_addr": "unix:/var/run/php/php8.3-fpm.sock","up_host": "","up_resp_time": "0.052","request_time": "0.053","request_GlobalId": "","response_GlobalId": "" }


后期持续观察结果
root@instance-nsstydow:/var/log/nginx# ls -l |grep access.json_2025-0
-rwxr-xr-x 1 www-data www-data 239298 Apr 29 23:32 access.json_2025-04-29
-rw-r--r-- 1 www-data www-data 490226 Apr 30 23:40 access.json_2025-04-30
-rw-r--r-- 1 www-data www-data 241376 May  1 23:43 access.json_2025-05-01
-rw-r--r-- 1 www-data www-data 315169 May  2 21:27 access.json_2025-05-02
正文到此结束
  • 本文作者:xinyu.he
  • 文章标题:Nginx日志按天分割-map指令
  • 本文地址:https://www.hxy.bj.cn/archives/159/
  • 版权说明:若无注明,本文皆Xinyu.he blog原创,转载请保留文章出处。
最后修改:2025 年 05 月 02 日
如果觉得我的文章对你有用,请随意赞赏