2

如何为 nginx 设置自定义日志格式,以便解析请求并将其部分单独记录?

我们提供图片文件来计算邮件打开次数。图片的网址各不相同,但遵循以下规则:

http://www.server.com/counter/XXXXX/YYYYY/dailymail.gif

XXXXX - 电子邮件活动的 ID;YYYYY - 收件人 ID。

有一个单独的/counter位置日志,我想给出一个格式

XXXXX   YYYYY    DATETIME

位置部分看起来像

    location    ~* ^counter/([0-9]+)/([^/]+)/dailymail\.gif$ {
        access_log /var/log/mailopened.log
        alias /var/www/site.com/1x1.gif?cid=$1&uid=$2&type=daily;
    }

所以我有变量 $1 和 $2 中的值。如何以日志格式使用它们?

4

1 回答 1

5

log_format指令http仅在级别允许,因此您必须根据其他变量来定义它,例如

http {
  log_format tracking "$xxxx $yyyy $time_local";

稍后,在您的位置,只需设置这些变量并登录tracking格式:

location ~* ^counter/([0-9]+)/([^/]+)/dailymail\.gif$ {
  set $xxxx $1;
  set $yyyy $2;
  access_log /var/log/mailopened.log tracking;
  alias /var/www/site.com/1x1.gif?cid=$1&uid=$2&type=daily;
}

使用最新版本的 Nginx 和 PCRE 库,可以省略set调用并明确命名捕获location(感谢@kolbyjack):

location ~* ^counter/(?<xxxx>[0-9]+)/(?<yyyy>[^/]+)/dailymail\.gif$ {
  access_log /var/log/mailopened.log tracking;
  alias /var/www/site.com/1x1.gif?cid=$1&uid=$2&type=daily;
}
于 2012-04-06T09:18:25.127 回答