zoukankan      html  css  js  c++  java
  • nginx记录响应与POST请求日志

    生产环境中的某些api出现故障,但是问题无法重现,但是又很想解决掉问题以及我们新项目上线,需要跟踪请求与响应的信息,可以预先找到一些bug,减少大面积的损失。
    安装nginx与ngx_lua
    响应日志需要lua的支持,
    请参考ttlsa之前的文章《nginx + ngx_lua安装测试》
    备注:安装过程中,发现nginx-1.9.0版本与ngx_lua不兼容,所以我换成nginx-1.4.2
     
    nginx日志配置


    # vim /usr/local/nginx-1.4.2/conf/nginx.conf
    ....省略一些配置....
    log_format  main  '$remote_addr | $remote_user | [$time_local] | "$request" | '
                          '$status | $body_bytes_sent | "$http_referer"  | '
                          '"$http_user_agent" | "$http_x_forwarded_for" |  "$request_body" | "$resp_body"';
    ....省略一些配置....
     
    $request_body变量由nginx自身提供,用于记录POST请求日志
    $resp_body变量由我们后面再server中定义,由ngx_lua获取
     
    nginx虚拟主机配置


    server{
           listen      80;
           server_name www.ttlsa.com;
           access_log /data/logs/nginx/www.ttlsa.com.access.log main;


           indexindex.htmlindex.phpindex.html;
           root/data/site/www.ttlsa.com/;
           set$resp_body"";// 这个必须放到最外层,否则日志取不到默认值
           location/ttlsa/api
           {
            // 以下配置可以放到server里面,如此一来,整个server的请求都会记录到log中
            lua_need_request_bodyon;
            body_filter_by_lua'
                            local resp_body = string.sub(ngx.arg[1], 1, 1000)
                            ngx.ctx.buffered = (ngx.ctx.buffered or"") .. resp_body
                            if ngx.arg[2] then
                                    ngx.var.resp_body = ngx.ctx.buffered
                            end
              ';
             //省略一些配置
        }
     
    配置完毕之后,所有/ttlsa/api下的请求都会记录到log中,包含request和response日志
     
    日志结果展示
    10.11.11.11 | - | [23/May/2015:11:51:11 +0800] | "POST /ttlsa/api HTTP/1.1" | 200 ~ 519 | "-" | "Apache-HttpClient/4.3.2 (java 1.5)" | "-" | "<xml><appid>10002221</appid><mch_id>78912321</mch_id><device_info>10001</device_info><nonce_str>WhQD62S7mW06uGZb09JHZx78VN6Z9VO7</nonce_str><body>xE5xBExAExE4xBFxA1xE6x9DxA1xE7xA0x81xE6x94xAFxE4xBBx98</body><out_trade_no>20150523109755485501108746</out_trade_no><total_fee>20910</total_fee><spbill_create_ip>192.168.1.103</spbill_create_ip><auth_code>130145050921275499</auth_code><sign>8F7C57A99DBA452EFEF685CBE14BE599</sign></xml>" | "<xml><appid>10002221</appid><device_info>10001</device_info><err_code><![CDATA[NOTENOUGH]]></err_code><err_code_des><![CDATA[xE9x93xB6xE8xA1x8CxE5x8DxA1xE5x8FxAFxE7x94xA8xE4xBDx99xE9xA2x9DxE4xB8x8DxE8xB6xB3xEFxBCx88xE5xA6x82xE4xBFxA1xE7x94xA8xE5x8DxA1xE5x88x99xE4xB8xBAxE5x8FxAFxE9x80x8FxE6x94xAFxE9xA2x9DxE5xBAxA6xE4xB8x8DxE8xB6xB3xEFxBCx89xEFxBCx8CxE8xAFxB7xE6xA0xB8xE5xAEx9ExE5x90x8ExE5x86x8DxE8xAFx95]]></err_code_des><mch_id>78912321</mch_id><nonce_str><![CDATA[PxPXdLScGOhBZ17O]]></nonce_str><result_code><![CDATA[FAIL]]></result_code><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg><sign><![CDATA[F04FE3EEF6B3E1E6962616786A177C22]]></sign></xml>"
    以上是某个微信支付项目中的日志,通过根据此日志,可以及早发现问题并且修复。有些人可能有疑问,POST里面的一些内容都是xE9x93xB6xE8,无法理解。怎么办呢?继续往下看


    NGINX POST十六进制内容转中文

    回到《nginx记录响应与POST请求日志》一问,我们捕获到了nginx post请求的内容以及响应给用户的内容,但是我们可以看到xE5xAEx9ExE5x90x8ExE5x86x8DxE8类似的内容,不知何意,接下来我们用php把他给解析出来。

    日志内容

    以下是上篇内容的日志

    10.11.11.11 | - | [23/May/2015:11:51:11 +0800] | "POST /ttlsa/api HTTP/1.1" | 200 ~ 519 | "-" | "Apache-HttpClient/4.3.2 (java 1.5)" | "-" | "<xml><appid>10002221</appid><mch_id>78912321</mch_id><device_info>10001</device_info><nonce_str>WhQD62S7mW06uGZb09JHZx78VN6Z9VO7</nonce_str><body>xE5xBExAExE4xBFxA1xE6x9DxA1xE7xA0x81xE6x94xAFxE4xBBx98</body><out_trade_no>20150523109755485501108746</out_trade_no><total_fee>20910</total_fee><spbill_create_ip>192.168.1.103</spbill_create_ip><auth_code>130145050921275499</auth_code><sign>8F7C57A99DBA452EFEF685CBE14BE599</sign></xml>" | "<xml><appid>10002221</appid><device_info>10001</device_info><err_code><![CDATA[NOTENOUGH]]></err_code><err_code_des><![CDATA[xE9x93xB6xE8xA1x8CxE5x8DxA1xE5x8FxAFxE7x94xA8xE4xBDx99xE9xA2x9DxE4xB8x8DxE8xB6xB3xEFxBCx88xE5xA6x82xE4xBFxA1xE7x94xA8xE5x8DxA1xE5x88x99xE4xB8xBAxE5x8FxAFxE9x80x8FxE6x94xAFxE9xA2x9DxE5xBAxA6xE4xB8x8DxE8xB6xB3xEFxBCx89xEFxBCx8CxE8xAFxB7xE6xA0xB8xE5xAEx9ExE5x90x8ExE5x86x8DxE8xAFx95]]></err_code_des><mch_id>78912321</mch_id><nonce_str><![CDATA[PxPXdLScGOhBZ17O]]></nonce_str><result_code><![CDATA[FAIL]]></result_code><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg><sign><![CDATA[F04FE3EEF6B3E1E6962616786A177C22]]></sign></xml>"

     

    我们抓取响应的内容,xE9x93xB6xE8xA1x8CxE5x8DxA1xE5x8FxAFxE7x94xA8xE4xBDx99xE9xA2x9DxE4xB8x8DxE8xB6xB3xEFxBCx88xE5xA6x82xE4xBFxA1xE7x94xA8xE5x8DxA1xE5x88x99xE4xB8xBAxE5x8FxAFxE9x80x8FxE6x94xAFxE9xA2x9DxE5xBAxA6xE4xB8x8DxE8xB6xB3xEFxBCx89xEFxBCx8CxE8xAFxB7xE6xA0xB8xE5xAEx9ExE5x90x8ExE5x86x8DxE8xAFx95。

    编写php文件

    大体流程,我们通过参数s传值给php,php首先将x去掉,将字符串变成完成的十六进制,最后将十六进制转为中文。

     

    测试

    网址输入:http://www.ttlsa.com/t.php?s=xE9x93xB6xE8xA1x8CxE5x8DxA1xE5x8FxAFxE7x94xA8xE4xBDx99xE9xA2x9DxE4xB8x8DxE8xB6xB3xEFxBCx88xE5xA6x82xE4xBFxA1xE7x94xA8xE5x8DxA1xE5x88x99xE4xB8xBAxE5x8FxAFxE9x80x8FxE6x94xAFxE9xA2x9DxE5xBAxA6xE4xB8x8DxE8xB6xB3xEFxBCx89xEFxBCx8CxE8xAFxB7xE6xA0xB8xE5xAEx9ExE5x90x8ExE5x86x8DxE8xAFx95

    输出结果如下:

    nginx post

    十六进制转中文


  • 相关阅读:
    echarts基础使用
    将数据表中的热词统计结果用echarts热词云展示
    LInux下bash: wget: command not found解决方法
    利用Jieba对txt进行分词操作并保存在数据库中
    idea运行Guns示例demo
    浅谈一下mshta在CVE201711882里的命令构造
    CVE201711882 POC 全版本通杀
    本地复现Flash 0day漏洞(CVE20184878)
    Oracle安装错误
    oracle远程连接服务器出现 ORA12170 TNS:连接超时 解决办法
  • 原文地址:https://www.cnblogs.com/duyinqiang/p/5696396.html
Copyright © 2011-2022 走看看