如何编写合适的Nginx日志正则表达式

问题描述

$ request是 log_format 属性,其格式类似于此:

GET /stocks?pattern=1a2b3c&isauto=1&associate=0&userid=4d5e6f&pl=g&isrealcode=1 HTTP/1.1

或类似这样:

GET /stocks?pattern=1a2b3c&field=5 HTTP/1.1

我想编写一个正则表达式来拦截中间字符串并将其格式更改为以下形式:

pattern=1a2b3c&...=...&...=... => pattern:1a2b3c,...:...,...:...

解决方法

使用以下表达式提取中间字符串:

    if ($request ~* "GET /stocks\?(.*) HTTP/1.1$"){
        set $custom $1;
    }

提取的字符串如下:

pattern=1a2b3c&field=5&...=...

如何替换这些符号:

'=' => ':' '$'=>','