1. 程式人生 > >openresty nginx記錄日誌中文變成十六進位制

openresty nginx記錄日誌中文變成十六進位制

問題描述:

通過openresty的nginx接收到url get方式帶引數請求之後,記錄下相關引數的日誌,發現中文全部被轉成了十六進位制。例如:xE6\xBC\x94\xE7\xA4\xBA\xE7\xAB\x99。

url這邊引數是經過編碼傳輸的,而nginx配置裡url的引數已經經過解碼。

當使用此方法:
local str = ngx.unescape_uri(url);
ngx.say(ngx.unescape_uri(str));
頁面輸出的是中文, 說明解碼成功。

當使用此方法:
log_format webaccess "$u_a|$u_b";
location /test1 {

set_unescape_uri $u_b "中國";

set_unescape_uri $u_a $arg_pa;

log_subrequest on;

access_log /source/428/web/access.log webaccess;

}
access.log 日誌裡$u_a|$u_b 都轉換成了 16進位制。

網上搜索的解決辦法有:

1.改編碼

編輯conf下面的nginx.conf

在server段里加以下兩行

default_type 'text/html';
charset utf-8;

然後重啟。

這個方法沒用。

2.參考部落格

https://www.jianshu.com/p/8f8c2b5ca2d1,

設定轉義方式,這個方法我試過escape=none或者json都無效,應該是這個方法是針對nginx 1.11.8 以上版本

log_format postdata escape=json '$remote_addr | $request_body | $resp_body';

通過nginx -v命令得知,我安裝的nginx版本是1.9.3的,
nginx version: openresty/1.9.3.1

3.針對我這個版本的nginx,採用以下方法可以解決:

直接在 nginx.conf的記錄日誌的location部分裡面配置下面這一行就好了:
    log_escape_non_ascii off;