Loading... # 目的 > 需求:nginx日志按照天的单位进行自动分割存储。 > > 样式: > > access.json_2025-04-29 > > access.json_2025-04-28 ## 两种方法 - nginx本身自带模块map - split切割工具 ### 本章介绍方法一(nginx本身自带模块map) > 通过使用 `$time_iso8601` 变量和 `map` 指令,实现了`日志文件`按天分割的功能。以下是详细的说明 1. map指令 ```shell 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)。 - 正则表达式: ~^(?<ymd>\d{4}-\d{2}-\d{2}) 用于从 $time_iso8601 中提取日期部分(例如 2024-08-13)。正则表达式中的 (?<ymd>\d{4}-\d{2}-\d{2}) 捕获年-月-日部分,并将其赋值给变量 $ymd。 - 映射结果: 提取的日期部分被映射为 $logdate 变量,这个变量将用于日志文件的命名。 2. 日志文件存储 ```shell access_log /var/log/nginx/access.json_$logdate json; ``` * **`access_log`**: 配置了访问日志的路径,并使用 `$logdate` 变量生成按天分割的日志文件名。日志文件的完整路径格式为 `/data/logs/access.json_YYYY-MM-DD`,其中 `YYYY-MM-DD` 是日期。 3. 工作流程 - 每当有请求到达时,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/ #### 完整配置文件 ```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/*; } ``` #### 验证 ```shell 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 ``` 最后修改:2025 年 05 月 02 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 5 如果觉得我的文章对你有用,请随意赞赏