目的
需求:nginx日志按照天的单位进行自动分割存储。
样式:
access.json_2025-04-29
access.json_2025-04-28
两种方法
- nginx本身自带模块map
- split切割工具
本章介绍方法一(nginx本身自带模块map)
通过使用$time_iso8601变量和map指令,实现了日志文件按天分割的功能。以下是详细的说明
- 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 变量,这个变量将用于日志文件的命名。
- 日志文件存储
access_log /var/log/nginx/access.json_$logdate json;access_log: 配置了访问日志的路径,并使用$logdate变量生成按天分割的日志文件名。日志文件的完整路径格式为/data/logs/access.json_YYYY-MM-DD,其中YYYY-MM-DD是日期。
- 工作流程
- 每当有请求到达时,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