【问题标题】:Log parsed request with nginx使用 nginx 记录解析的请求
【发布时间】:2012-04-06 08:58:45
【问题描述】:

如何为 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 中的值。如何以日志格式使用它们?

【问题讨论】:

    标签: logging nginx rewrite


    【解决方案1】:

    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;
    }
    

    【讨论】:

    • 对于任何最新版本的 nginx,您可以使用 location ~* ^/counter/(?&lt;xxxx&gt;[0-9]+)/(?&lt;yyyy&gt;[^/]+)/dailymail.gif$ { 命名捕获并跳过集合调用
    • 好收获! PCRE 版本也很重要——你可能有最新的 Nginx 和旧的 PCRE..
    • 好点。对于旧的 pcre,您需要使用 ?P&lt; 而不仅仅是 ?&lt;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-10
    • 2013-07-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多