要在Nginx中配置JSON格式的日志记录,你可以使用以下几种方法:
http {
log_format json_log escape=json '{"time": "$time_iso8601", '
'"remote_addr": "$remote_addr", '
'"remote_user": "$remote_user", '
'"request": "$request", '
'"status": "$status", '
'"body_bytes_sent": "$body_bytes_sent", '
'"request_time": "$request_time", '
'"http_referrer": "$http_referer", '
'"http_user_agent": "$http_user_agent"}';
access_log /var/log/nginx/access.json.log json_log;
}
escape=json
参数会自动转义JSON中的特殊字符http {
map $status $loggable {
~^[23] 1;
default 0;
}
log_format json_log escape=json '{'
'"timestamp": "$time_iso8601", '
'"client_ip": "$remote_addr", '
'"request": "$request", '
'"status": "$status", '
'"bytes_sent": "$body_bytes_sent", '
'"referrer": "$http_referer", '
'"user_agent": "$http_user_agent", '
'"request_time": "$request_time", '
'"upstream_response_time": "$upstream_response_time", '
'"server_name": "$server_name", '
'"loggable": "$loggable"'
'}';
access_log /var/log/nginx/access.json.log json_log if=$loggable;
}
http {
lua_package_path "/path/to/lua/scripts/?.lua;;";
log_by_lua_block {
local cjson = require "cjson"
local log_table = {
time = ngx.var.time_iso8601,
remote_addr = ngx.var.remote_addr,
request = ngx.var.request,
status = ngx.var.status,
body_bytes_sent = ngx.var.body_bytes_sent,
http_referer = ngx.var.http_referer,
http_user_agent = ngx.var.http_user_agent,
request_time = ngx.var.request_time,
server_name = ngx.var.server_name
}
local file = io.open("/var/log/nginx/access.json.log", "a")
if file then
file:write(cjson.encode(log_table) .. "\n")
file:close()
end
}
}
jq
等工具方便地分析JSON日志在/etc/logrotate.d/nginx
中添加:
/var/log/nginx/access.json.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
}
这样配置后,Nginx就会以JSON格式记录访问日志,便于后续的日志分析和处理。