在 nginx 的 log 顯示請求的 body(json 格式)

  1. 在 nginx 的 log 顯示請求的 body(json 格式)
    1. ssh 登入
    2. 檢查 nginx 版本
    3. 先看一下有沒有設定
    4. 編輯設定檔
    5. 測試 nginx 設定檔正確性
    6. 無縫重啟 nginx
    7. 查看 log 看效果
  2. 加碼(舊版的話)
    1. Python[1]

在 nginx 的 log 顯示請求的 body(json 格式)

ssh 登入

ssh 帳號@主機位址

必要的話,要用 -i 來指定使用的 key

檢查 nginx 版本

nginx -V

必須注意 escape=json 要 Nginx 1.11.5 之後才支援

先看一下有沒有設定

less /etc/nginx/nginx.conf

注意 http 段落中,有一個在設定 log 的地方,內容大約如下

http {
...
##
# Logging Settings
##

access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
...
}

編輯設定檔

sudo vim /etc/nginx/nginx.conf

要設定 nginx 的 log format 請求才會出現 JOSN 的內容

http {
##
# Logging Settings
##

# log_format compression
# '[$time_local] $remote_addr - $status '
# '"$request" $request_body';

log_format json_log
# escape=json # Nginx 1.11.5 之後才支援
'[$time_local] $remote_addr - $status '
'"$request" $request_body';

access_log /var/log/nginx/access.log json_log;
error_log /var/log/nginx/error.log;
}
  1. log_format json_log escape=json

宣告一個 log_format 叫做 json_log 格式,escape=json 指定 json 格式處理特殊字元。

  1. access_log /var/log/nginx/access.log json_log;

設定 access_log 在 /var/log/nginx/access.log 以 json_log 格式儲存。

測試 nginx 設定檔正確性

確認無誤之後,再重啟,所以要先測試一下指令是否有錯誤

sudo nginx -t 

無縫重啟 nginx

透過 systemctl 重啟 nginx (推薦使用)

sudo systemctl reload nginx

另一種寫法,直接重啟 nginx

sudo nginx -s reload

查看 log 看效果

sudo tail -f /var/log/nginx/access.log

加碼(舊版的話)

Python[1]

decode.py

import json

msg = """
{\x22id\x22:1}
"""

res_obj = json.loads(msg.encode('raw_unicode_escape').decode('utf8'))
print(json.dumps(res_obj, ensure_ascii=False))

執行後會印出解碼後的樣子。

python3 decode.py
{"id":1}

  1. Python3解决Nginx日志的中文乱码问题 ↩︎