Tengine设置响应日志为中文

因为业务上一些需求,想要查看某站点返回了什么内容,网上有很多文章,但中文部分都是乱码,还要用Python 转码一下,麻烦!!!

本身想写nginx的,但因为线上用的是Tengine,两家相差不大,就一起写吧,顺便测了一下完全兼容


名称 版本
Nginx 1.18
Tengine 2.3.0 (约等于1.15)

安装依赖

yum -y install lrzsz unzip pcre-devel patch perl vim libxml2 libxslt-devel

安装LuaJit

wget http://luajit.org/download/LuaJIT-2.0.5.tar.gz
tar -xzvf LuaJIT-2.0.5.tar.gz
cd LuaJIT-2.0.5
make
make install
vim /etc/profile
添加:
export LUAJIT_LIB=/usr/local/LuaJIT/lib
export LUAJIT_INC=/usr/local/LuaJIT/include/luajit-2.0
source /etc/profile
echo "/usr/local/LuaJIT/lib" >> /etc/ld.so.conf
ldconfig

安装nginx Lua模块

cd /usr/local/src
wget https://github.com/chaoslawful/lua-nginx-module/archive/v0.10.15.tar.gz
tar -xzvf v0.10.15.tar.gz

修改源码文件,将中文转16位去掉

cd /usr/local/src/tengine-2.3.0/
vim src/http/modules/ngx_http_log_module.c 

改成下面这个样子

ngx_http_log_escape(u_char *dst, u_char *src, size_t size)
{
    ngx_uint_t      n;
   /* static u_char   hex[] = "0123456789ABCDEF"; */

    static uint32_t   escape[] = {
        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */

                    /* ?>=< ;:98 7654 3210  /.-, +*)( '&%$ #"!  */
        0x00000004, /* 0000 0000 0000 0000  0000 0000 0000 0100 */

                    /* _^]\ [ZYX WVUT SRQP  ONML KJIH GFED CBA@ */
        0x10000000, /* 0001 0000 0000 0000  0000 0000 0000 0000 */

                    /*  ~}| {zyx wvut srqp  onml kjih gfed cba` */
        0x80000000, /* 1000 0000 0000 0000  0000 0000 0000 0000 */

        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */
        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */
        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */
        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */
    };


    if (dst == NULL) {

        /* find the number of the characters to be escaped */

        n = 0;


        while (size) {
            if (escape[*src >> 5] & (1U << (*src & 0x1f))) {
                n++;
            }
            src++;
            size--;
        }

        return (uintptr_t) n;
    }

    while (size) {
    /*
        if (escape[*src >> 5] & (1U << (*src & 0x1f))) {
            *dst++ = '\\';
            *dst++ = 'x';
            *dst++ = hex[*src >> 4];
            *dst++ = hex[*src & 0xf];
            src++;

        } else {
            *dst++ = *src++;
        } */
        *dst++ = *src++;
        size--;
    }

    return (uintptr_t) dst;
}

./configure --prefix=/usr/local/tengine-2.3.0 --user=root --group=root --with-http_ssl_module --with-http_flv_module --with-file-aio --with-http_realip_module --with-http_addition_module --with-http_xslt_module --with-http_sub_module --with-http_dav_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_secure_link_module --with-http_degradation_module --with-http_stub_status_module  --with-debug --with-stream --add-module=/usr/local/src/lua-nginx-module-0.10.9rc7/ --add-module=/usr/local/src/ngx_devel_kit-0.3.0

make && make install        # 记得实现备份一下nginx文件

写一个resp.conf 文件 ,需要的话直接include即可

    set $resp_body "";
    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
    ';

在主配置文件修改日志格式

    log_format  main  '$hostname|$remote_addr|-|[$time_local]|$server_name'
                      '|$request|$request_length|$request_time'
                      '|"$status"|$body_bytes_sent|$bytes_sent|$connection|$connection_requests'
                      '|"$http_user_agent"|"$http_referer"'
                      '|$upstream_addr|$upstream_status|$upstream_response_time|tx-$hostname-$server_addr|"$request_body"|$resp_body';

参考链接:https://www.jianshu.com/p/2ae060c0f3b3

发表评论