Nginx - Hide/mask/change 日志中的值基于正则表达式匹配

Nginx - Hide/mask/change value in logs based on Regex match

MY API要求请求路径中使用email地址作为资源的标识,例如:

/api/users/john.smith@company.com

由于担心个人身份信息 (PII) 存储在日志中,我正在寻找一种方法来转换以下日志:

{ip_address} - - [04/Mar/2021:11:22:22 +0000] "GET /api/users/john.smith@company.com HTTP/1.1" 200 961 "{request_from}" etc.

进入如下内容:

{ip_address} - - [04/Mar/2021:11:22:22 +0000] "GET /api/users/*email_redacted* HTTP/1.1" 200 961 "{request_from}" etc.

我在标题中提到了基于正则表达式匹配来执行此操作,因为这似乎是检测电子邮件是否在初始日志中的明显方法。

我是 Nginx 的新手,所以 straight-forward 简洁的回复将不胜感激。非常感谢!

访问日志由 access_loglog_format 指令控制(详见 this document)。

默认情况下,访问日志记录 $request 变量的值,其中包含您要更改的字符串。

您可以使用 map 语句更改 $request 变量的文本,并使用 log_format 语句为使用编辑值的日志文件定义新格式.有关详细信息,请参阅 this document

例如:

map $request $redacted {
    default $request;
    ~^(?<prefix>.*)pattern(?<suffix>.*)$ $prefix*email_redacted*$suffix;
}

log_format redacted '$remote_addr - $remote_user [$time_local] '
    '"$redacted" $status $bytes_sent '
    '"$http_referer" "$http_user_agent" "$gzip_ratio"';

access_log /var/log/nginx/access.log redacted;

用匹配任何合法电子邮件地址的正则表达式替换上面的“模式”。