在 OpenResty 中使用 set_by_lua 添加换行符

我正在使用 https://openresty.org/en/ ,以下是我的 nginx.conf 文件

我试图在 set_by_lua 部分的每个请求头之间插入一个换行符\n,然后将其输出到 access.log 日志文件中。

http {
    # 为了在 access.log 中方便地查看请求头信息,我需要尝试在 lua 中添加换行符,但似乎行排版不正常
    log_format  main  '(ra:)$remote_addr - (ru:)$remote_user (time_local:)[$time_local] (request:)"$request" (status:)$status (bodybytessent:)$body_bytes_sent (http_referer)"$http_referer" (useragent:)"$http_user_agent" (xforward:)"$http_x_forwarded_for" \n(requestheaders:)$request_headers';

    access_log  logs/access.log  main;

    server {
        listen       80;
        server_name  localhost;

        location / {

            set_by_lua $request_headers '
              local h = ngx.req.get_headers()
              local request_headers_all = ""
              for k, v in pairs(h) do
                # 这里是问题所在- \n 标志符不能正常工作
                # 只需要在字符串末尾添加一个换行符
                request_headers_all = request_headers_all .. ""..k..": "..v..";" .. "\n"
              end
              return request_headers_all
            ';

            root   html;
            index  index.html index.htm;
        }

...继续

错误信息如下:

2020/06/29 11:36:04 [error] 8204#8204: *25 加载 Lua 代码失败:set_by_lua:6: unfinished string near '"'

问题代码如下:

request_headers_all = request_headers_all .. ""..k..": "..v..";" .. "\n"

这似乎是一些转义问题。Lua ignore Escape Sequence ,我对此束手无策。

我的基础操作系统是 Ubuntu 18.04。我希望在 access.log 日志文件中得到类似于以下的格式:

output from browser

而不是以下的格式:

(ra:)37.152.225.237 - (ru:)- (time_local:)[29/Jun/2020:11:47:46 +0000] (request:)"GET / HTTP/1.1" (status:)200 (bodybytessent:)422 (http_referer)"-" (useragent:)"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:77.0) Gecko/20100101 Firefox/77.0" (xforward:)"-"
(requestheaders:)host: openrestytest836.westeurope.cloudapp.azure.com;accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8;upgrade-insecure-requests: 1;cache-control: no-cache;accept-language: en-GB,en;q=0.5;user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:77.0) Gecko/20100101 Firefox/77.0;pragma: no-cache;connection: keep-alive;accept-encoding: gzip, deflate;

有很多方法可以解决这个问题,但我很好奇如何将换行符添加到 Lua 生成的字符串中。

点赞
用户26086
用户26086

感谢上面评论区的@un.def修复了Lua问题,现在是这样的:

set_by_lua_block $request_headers {
     local h = ngx.req.get_headers()
     local request_headers_all = ""
     for k, v in pairs(h) do
         request_headers_all = request_headers_all .. ""..k..": "..v.."\n"
     end
     return request_headers_all
}

我还没有尝试建议的表格策略。

来自 http://nginx.org/en/docs/http/ngx_http_log_module.html

我还必须在log_format中设置esacpe=none

log_format  main escape=none '(remote_addr:)$remote_addr - (remote_user:)$remote_user (time_local:)[$time_local] (request:)"$request" (status:)$status (bodybytessent:)$body_bytes_sent (http_referer)"$http_referer" (useragent:)"$http_user_agent" (xforward:)"$http_x_forwarded_for" \n(requestheaders:)\n$request_headers';

它产生了所需的输出: enter image description here

2020-06-29 16:00:15