Nginx 如何基于日志消息内容实现条件日志过滤?
Nginx按特定字符串过滤日志实现方案
该需求可通过Nginx原生的map指令+条件日志功能实现,具体操作如下:
实现步骤
1. 定义匹配规则
在Nginx配置的http块中新增map配置,根据你要匹配的字段(请求URI、请求头、响应参数等)设置是否记录日志的标识:
http { # 示例:匹配请求URI中包含指定字符串的请求,$loggable为1时记录日志,为0时不记录 map $request_uri $loggable { default 1; ~*/healthcheck 0; # 过滤所有URI包含/healthcheck的请求 ~*/static/ 0; # 过滤所有URI包含/static/的静态资源请求 # 可在此新增更多需要过滤的字符串规则 } # 其他原有http块配置... }
2. 关联日志配置
在需要生效的server或location块中修改access_log指令,新增条件判断参数:
server { listen 80; server_name your-domain.com; # 仅当$loggable值为1时才记录访问日志 access_log /var/log/nginx/access.log main if=$loggable; error_log /var/log/nginx/error.log; # 其他原有server块配置... }
拓展匹配场景
如果需要匹配其他字段的特定字符串,只需修改map指令的第一个源参数即可:
- 匹配请求User-Agent字段:使用
$http_user_agent作为源变量,可过滤指定爬虫请求 - 匹配自定义请求头字段:使用
$http_字段名全小写格式,例如X-App-ID对应变量为$http_x_app_id - 匹配响应状态码:使用
$status作为源变量,可过滤指定状态码的请求日志
注意事项
map指令仅可定义在http配置块中,不可放置在server、location等下层块内- 正则匹配语法:
~代表区分大小写匹配,~*代表不区分大小写匹配 - 配置修改完成后需先执行
nginx -t校验配置合法性,校验通过后执行nginx -s reload使配置生效
内容的提问来源于stack exchange,提问作者JD2k
相关产品推荐
相关产品推荐

