生产环境中的某些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>\xE5\xBE\xAE\xE4\xBF\xA1\xE6\x9D\xA1\xE7\xA0\x81\xE6\x94\xAF\xE4\xBB\x98</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[\xE9\x93\xB6\xE8\xA1\x8C\xE5\x8D\xA1\xE5\x8F\xAF\xE7\x94\xA8\xE4\xBD\x99\xE9\xA2\x9D\xE4\xB8\x8D\xE8\xB6\xB3\xEF\xBC\x88\xE5\xA6\x82\xE4\xBF\xA1\xE7\x94\xA8\xE5\x8D\xA1\xE5\x88\x99\xE4\xB8\xBA\xE5\x8F\xAF\xE9\x80\x8F\xE6\x94\xAF\xE9\xA2\x9D\xE5\xBA\xA6\xE4\xB8\x8D\xE8\xB6\xB3\xEF\xBC\x89\xEF\xBC\x8C\xE8\xAF\xB7\xE6\xA0\xB8\xE5\xAE\x9E\xE5\x90\x8E\xE5\x86\x8D\xE8\xAF\x95]]></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里面的一些内容都是\xE9\x93\xB6\xE8,无法理解。怎么办呢?继续往下看

NGINX POST十六进制内容转中文

回到《nginx记录响应与POST请求日志》一问,我们捕获到了nginx post请求的内容以及响应给用户的内容,但是我们可以看到\xE5\xAE\x9E\xE5\x90\x8E\xE5\x86\x8D\xE8\类似的内容,不知何意,接下来我们用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>\xE5\xBE\xAE\xE4\xBF\xA1\xE6\x9D\xA1\xE7\xA0\x81\xE6\x94\xAF\xE4\xBB\x98</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[\xE9\x93\xB6\xE8\xA1\x8C\xE5\x8D\xA1\xE5\x8F\xAF\xE7\x94\xA8\xE4\xBD\x99\xE9\xA2\x9D\xE4\xB8\x8D\xE8\xB6\xB3\xEF\xBC\x88\xE5\xA6\x82\xE4\xBF\xA1\xE7\x94\xA8\xE5\x8D\xA1\xE5\x88\x99\xE4\xB8\xBA\xE5\x8F\xAF\xE9\x80\x8F\xE6\x94\xAF\xE9\xA2\x9D\xE5\xBA\xA6\xE4\xB8\x8D\xE8\xB6\xB3\xEF\xBC\x89\xEF\xBC\x8C\xE8\xAF\xB7\xE6\xA0\xB8\xE5\xAE\x9E\xE5\x90\x8E\xE5\x86\x8D\xE8\xAF\x95]]></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>"

我们抓取响应的内容,\xE9\x93\xB6\xE8\xA1\x8C\xE5\x8D\xA1\xE5\x8F\xAF\xE7\x94\xA8\xE4\xBD\x99\xE9\xA2\x9D\xE4\xB8\x8D\xE8\xB6\xB3\xEF\xBC\x88\xE5\xA6\x82\xE4\xBF\xA1\xE7\x94\xA8\xE5\x8D\xA1\xE5\x88\x99\xE4\xB8\xBA\xE5\x8F\xAF\xE9\x80\x8F\xE6\x94\xAF\xE9\xA2\x9D\xE5\xBA\xA6\xE4\xB8\x8D\xE8\xB6\xB3\xEF\xBC\x89\xEF\xBC\x8C\xE8\xAF\xB7\xE6\xA0\xB8\xE5\xAE\x9E\xE5\x90\x8E\xE5\x86\x8D\xE8\xAF\x95。

编写php文件

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

1
2
3
4
5
6
7
8
<?php
function
hexDecode($s)
{
$s
=
str_replace('\x','',$s);//先把\x去掉,变成完整的十六进制
return
preg_replace('/(\w{2})/e',"chr(hexdec('\\1'))",$s);//十六进制转为汉字
}
$s
=
$_GET['s'];
$hexEncode

hexEncode($s);
?>

测试

网址输入:http://www.ttlsa.com/t.php?s=\xE9\x93\xB6\xE8\xA1\x8C\xE5\x8D\xA1\xE5\x8F\xAF\xE7\x94\xA8\xE4\xBD\x99\xE9\xA2\x9D\xE4\xB8\x8D\xE8\xB6\xB3\xEF\xBC\x88\xE5\xA6\x82\xE4\xBF\xA1\xE7\x94\xA8\xE5\x8D\xA1\xE5\x88\x99\xE4\xB8\xBA\xE5\x8F\xAF\xE9\x80\x8F\xE6\x94\xAF\xE9\xA2\x9D\xE5\xBA\xA6\xE4\xB8\x8D\xE8\xB6\xB3\xEF\xBC\x89\xEF\xBC\x8C\xE8\xAF\xB7\xE6\xA0\xB8\xE5\xAE\x9E\xE5\x90\x8E\xE5\x86\x8D\xE8\xAF\x95

输出结果如下:

十六进制转中文

nginx记录响应与POST请求日志的更多相关文章

  1. nginx记录分析网站响应慢的请求(ngx_http_log_request_speed)

    nginx模块ngx_http_log_request_speed可以用来找出网站哪些请求很慢,针对站点很多,文件以及请求很多想找出哪些请求比较慢的话,这个插件非常有效.作者的初衷是写给自己用的,用来 ...

  2. 如何从Serilog请求日志记录中排除健康检查终结点

    这是在ASP.NET Core 3.X中使用Serilog.AspNetCore系列文章的第四篇文章:. 第1部分-使用Serilog RequestLogging减少日志详细程度 第2部分-使用Se ...

  3. Nginx记录用户请求Header到access log

    为了统计和其它用途,经常有人需要自定义Nginx日志,把http请求中的某个字段记录到日志中,刚好在看lua+nginx的文章,第一想到的是用lua赋值来做,但是想想有点小恶心,于是Google了一番 ...

  4. Spring Boot中使用AOP记录请求日志

    这周看别人写的springboot后端代码中有使用AOP记录请求日志,以前没接触过,因此学习下. 一.AOP简介 AOP为Aspect Oriented Programming的缩写,意为:面向切面编 ...

  5. nginx不记录指定文件类型的日志

    1.指定记录文件日志记录的内容. vim /usr/local/nginx/conf/nginx.conf如下部分: log_format dd '$remote_addr $http_x_forwa ...

  6. 一次docker中的nginx进程响应慢问题定位记录

    有个ft测试的环境,其中nginx使用docker发布的.测试用例是curl的时候,没有获得nginx的响应. docker ps CONTAINER ID IMAGE COMMAND CREATED ...

  7. Nginx记录-Nginx基础(转载)

    1.Nginx常用功能 1.Http代理,反向代理:作为web服务器最常用的功能之一,尤其是反向代理. Nginx在做反向代理时,提供性能稳定,并且能够提供配置灵活的转发功能.Nginx可以根据不同的 ...

  8. 【Nginx系列】Nginx虚拟主机的配置核日志管理

    Nginx配置段 #user nobody; worker_processes 1;// 有1个工作的子进程,可以自行修改,但太大无益,因为要争夺CPU,一般设置为 CPU数*核数 #error_lo ...

  9. nginx之全局设置,location,虚拟主机,日志管理

    nginx之全局设置,location,虚拟主机,日志管理 worker_processes 1;//子进程,cpu数*核数 ****************全局设置************** ** ...

随机推荐

  1. Web Api帮助页面或用户手册

    我这么玩Web Api(一):帮助页面或用户手册(Microsoft and Swashbuckle Help Page)   前言 你需要为客户编写Api调用手册?你需要测试你的Api接口?你需要和 ...

  2. QTableView另类打印解决方案(复用render函数去解决print问题)

    Qt QTableView另类打印解决方案     上回书说道Qt的model/view,我就做了个demo用于显示数据库中的内容.没想到tableview的打印竟然成了问题.我困惑了,难道Qt不应该 ...

  3. java学习之JDBC

    之前学习了数据库原理,上学期也学了oracle数据库,我的学习视频上是讲的mysql数据库,其实都差不多,复习了下sql知识,数据库的学习就没有写下来了,就从Java怎么操作数据库开始吧. 因为这年过 ...

  4. Intellij IDEA创建Maven Web项目

    1前言 在创建项目中,IDEA提供了非常多项目模板,比方Spring MVC模板,能够直接创建一个基于Maven的Spring MVC的demo,各种配置都已经设定好了,直接编译部署就能够使用. 最開 ...

  5. BlogUI的使用

  6. week4_motion_of_ball_1(小球运动)——改进

    # Ball motion with an explicit timer import simplegui # Initialize globals width = 600 height = 600 ...

  7. Servlet乘法表学习笔记

    一.控制台实现乘法表 package com.shanrengo; import java.io.IOException; import java.io.PrintWriter; import jav ...

  8. python 字典有序无序及查找效率,hash表

    刚学python的时候认为字典是无序,通过多次插入,如di = {}, 多次di['testkey']='testvalue' 这样测试来证明无序的.后来接触到了字典查找效率这个东西,查了一下,原来字 ...

  9. openrisc 之 Wishbone总线学习笔记——总线互联

    一,总线命名规范 1,wishbone总线接口信号都是高电平有限 2,wishbone接口信号都是以 _i ,或者是 _o 结束.i表示输入, o表示输出. ()表示该信号为总线信号,总线位宽可以大于 ...

  10. graph isomorphism 开源算法库VFlib, Nauty

    VFlib 开源算法库网站:http://www.cs.sunysb.edu/~algorith/implement/vflib/implement.shtml Nauty 开源算法库网站:http: ...