nginx调试日志的几种方法

编程技术  /  houtizong 发布于 3年前   192
最简单的方式就是

fprintf(stderr, "haoning hahahah:%s\r\n","ningning");


或者
 ngx_log_stderr(0,"haoning: ngx_http_hello_world_handler\"%s\"","haohao" );

但是如果打印
ngx_log_stderr(0,"haoning haohao subrequest in memory: %d", (int) r->subrequest_in_memory);ngx_log_stderr(0,"haoning haohao  r->method : %d",(int) r->method);ngx_log_stderr(0,"haoning haohao r->http_version: %d",(int) r->http_version) ;ngx_log_stderr(0,"haoning haohao r->request_line.data: %s",r->request_line.data) ;ngx_log_stderr(0,"haoning haohao r->uri.data): %s",r->uri.data);ngx_log_stderr(0,"haoning haohao r->args.data: %s",r->args.data);ngx_log_stderr(0,"haoning haohao r->unparsed_uri.data: %s",r->unparsed_uri.data);ngx_log_stderr(0,"haoning haohao r->method_name.data: %s",r->method_name.data)  ;ngx_log_stderr(0,"haoning haohao r->http_protocol.data: %s",r->http_protocol.data);ngx_log_stderr(0,"haoning haohao r->exten.data: %s",r->exten.data);

会报错

参考章亦春的echo
http://wiki.nginx.org/HttpEchoModule

源码中有个ddebug.h里面定义的打印log都输出到stderr
所以在这个模块的源码中把开头的
#ifndef DDEBUG#define DDEBUG 0#endif

改成
#ifndef DDEBUG#define DDEBUG 1#endif

当启动nginx的时候就输出log了 类似
e.c line 463.echo *** ngx_http_echo_helper: filter used = 1 at /root/hellogit/hello/graphviz/nginx/mymodule/echo-nginx-module-0.48/src/ngx_http_echo_module.c line 324.echo *** ngx_http_echo_helper: found raw arg hello at /root/hellogit/hello/graphviz/nginx/mymodule/echo-nginx-module-0.48/src/ngx_http_echo_module.c line 358.echo *** ngx_http_echo_echo_before_body: processing echo_before_body directive... at /root/hellogit/hello/graphviz/nginx/mymodule/echo-nginx-module-0.48/src/ngx_http_echo_module.c line 463.echo *** ngx_http_echo_helper: found raw arg world at /root/hellogit/hello/graphviz/nginx/mymodule/echo-nginx-module-0.48/src/ngx_http_echo_module.c line 358.echo *** ngx_http_echo_helper: filter used = 1 at /root/hellogit/hello/graphviz/nginx/mymodule/echo-nginx-module-0.48/src/ngx_http_echo_module.c line 324.echo *** ngx_http_echo_helper: found raw arg hiya at /root/hellogit/hello/graphviz/nginx/mymodule/echo-nginx-module-0.48/src/ngx_http_echo_module.c line 358.echo *** ngx_http_echo_helper: found raw arg igor at /root/hellogit/hello/graphviz/nginx/mymodule/echo-nginx-module-0.48/src/ngx_http_echo_module.c line 358.

可以重定向
./nginx >a.log 2>&1

★★★★★★第二种方法★★★★★★
还有一种是通用的 打印log的方法,跟nginx没关系
任何都适用,定义haolog.c   haolog.h 在ngx_http_echo_module.c中引用haolog.h
/root/hellogit/hello/graphviz/nginx/mymodule/echo[root@VM_253_237_tlinux echo]# lsconfig  haolog.c  haolog.h  nginx.conf  ngx_http_echo_module.c  shuoming.txt[root@VM_253_237_tlinux echo]# 

config中标记新增的源码.c 和依赖的.h
ngx_addon_name=ngx_http_echo_moduleHTTP_MODULES="$HTTP_MODULES ngx_http_echo_module"NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_echo_module.c $ngx_addon_dir/haolog.c"NGX_ADDON_DEPS="$NGX_ADDON_DEPS $ngx_addon_dir/haolog.h"CORE_LIBS="$CORE_LIBS -lpcre"

log代码如下
[root@VM_253_237_tlinux echo]# cat  haolog.h#include <stdio.h>#include <time.h>#define DEBUG_LOG( str ) log_append_to_file("/root/hellogit/hello/graphviz/nginx/mymodule/mylog/test.log", str,__FILE__,__LINE__ );void log_append_to_file(char* filename,char* str,char* sourceFile,int fileLine);[root@VM_253_237_tlinux echo]

haolog.c:
[root@VM_253_237_tlinux echo]# cat haolog.c #include <stdio.h>#include <time.h>#define DEBUG_LOG( str ) log_append_to_file("/root/hellogit/hello/graphviz/nginx/mymodule/mylog/test.log", str,__FILE__,__LINE__ );  void log_append_to_file(char* filename,char* str,char* sourceFile,int fileLine){        time_t t;        time(&t);        struct tm* tp= localtime(&t);        char now_str[100];        strftime(now_str, 100, "%Y-%m-%d %H:%M:%S", tp);        FILE *fo;        fo = fopen(filename, "a");    if (fo == 0) {        return;    }        fprintf(fo, "%s %s(:%d):%s\r\n",now_str,sourceFile,fileLine, str);        fclose(fo);}//int main(int argc, char **argv)//{///*********************define******************/////        DEBUG_LOG("haoning----logmain.c");//        printf("Hello World!\n");//        return 0;//} [root@VM_253_237_tlinux echo]# 


完整的nginx模块如下
[root@VM_253_237_tlinux echo]# cat ngx_http_echo_module.c /** Copyright (C) fabricehao*/#include <ngx_config.h>#include <ngx_core.h>#include <ngx_http.h>#include <time.h>#include "haolog.h"/* Module config */typedef struct {    ngx_str_t  ed;} ngx_http_echo_loc_conf_t;static char *ngx_http_echo(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);static void *ngx_http_echo_create_loc_conf(ngx_conf_t *cf);static char *ngx_http_echo_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child);/* Directives */static ngx_command_t  ngx_http_echo_commands[] = {        {                 ngx_string("echo"),        NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,        ngx_http_echo,        NGX_HTTP_LOC_CONF_OFFSET,        offsetof(ngx_http_echo_loc_conf_t, ed),        NULL         },    ngx_null_command};/* Http context of the module */static ngx_http_module_t  ngx_http_echo_module_ctx = {    NULL,                                  /* preconfiguration */    NULL,                                  /* postconfiguration */    NULL,                                  /* create main configuration */    NULL,                                  /* init main configuration */    NULL,                                  /* create server configuration */    NULL,                                  /* merge server configuration */    ngx_http_echo_create_loc_conf,         /* create location configration */    ngx_http_echo_merge_loc_conf           /* merge location configration */};/* Module */ngx_module_t  ngx_http_echo_module = {    NGX_MODULE_V1,    &ngx_http_echo_module_ctx,             /* module context */    ngx_http_echo_commands,                /* module directives */    NGX_HTTP_MODULE,                       /* module type */    NULL,                                  /* init master */    NULL,                                  /* init module */    NULL,                                  /* init process */    NULL,                                  /* init thread */    NULL,                                  /* exit thread */    NULL,                                  /* exit process */    NULL,                                  /* exit master */    NGX_MODULE_V1_PADDING};/* Handler function */static ngx_int_tngx_http_echo_handler(ngx_http_request_t *r){        DEBUG_LOG("haoning.........ngx_http_echo_handler");    ngx_int_t rc;    ngx_buf_t *b;    ngx_chain_t out;    ngx_http_echo_loc_conf_t *elcf;    elcf = ngx_http_get_module_loc_conf(r, ngx_http_echo_module);    if(!(r->method & (NGX_HTTP_HEAD|NGX_HTTP_GET|NGX_HTTP_POST)))    {        return NGX_HTTP_NOT_ALLOWED;    }    r->headers_out.content_type.len = sizeof("text/html") - 1;    r->headers_out.content_type.data = (u_char *) "text/html";    r->headers_out.status = NGX_HTTP_OK;    r->headers_out.content_length_n = elcf->ed.len;    if(r->method == NGX_HTTP_HEAD)    {                DEBUG_LOG("haoning......ngx_http_echo_handlerr---r->method == NGX_HTTP_HEAD");        rc = ngx_http_send_header(r);        if(rc != NGX_OK)        {            return rc;        }    }    b = ngx_pcalloc(r->pool, sizeof(ngx_buf_t));    if(b == NULL)    {        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "Failed to allocate response buffer.");        return NGX_HTTP_INTERNAL_SERVER_ERROR;    }    out.buf = b;    out.next = NULL;    b->pos = elcf->ed.data;    b->last = elcf->ed.data + (elcf->ed.len);    b->memory = 1;    b->last_buf = 1;    rc = ngx_http_send_header(r);    if(rc != NGX_OK)    {        return rc;    }        DEBUG_LOG("haoning......ngx_http_output_filter");    return ngx_http_output_filter(r, &out);}static char *ngx_http_echo(ngx_conf_t *cf, ngx_command_t *cmd, void *conf){        DEBUG_LOG("haoning --ngx_http_echo->>>>> init");    ngx_http_core_loc_conf_t  *clcf;    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);    clcf->handler = ngx_http_echo_handler;    ngx_conf_set_str_slot(cf,cmd,conf);    return NGX_CONF_OK;}static void *ngx_http_echo_create_loc_conf(ngx_conf_t *cf){        DEBUG_LOG("haoning --ngx_http_echo_create_loc_conf");    ngx_http_echo_loc_conf_t  *conf;    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_echo_loc_conf_t));    if (conf == NULL) {        return NGX_CONF_ERROR;    }    conf->ed.len = 0;    conf->ed.data = NULL;    return conf;}static char *ngx_http_echo_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child){        DEBUG_LOG("haoning --ngx_http_echo_merge_loc_conf");    ngx_http_echo_loc_conf_t *prev = parent;    ngx_http_echo_loc_conf_t *conf = child;    ngx_conf_merge_str_value(conf->ed, prev->ed, "");    return NGX_CONF_OK;}[root@VM_253_237_tlinux echo]# 

调用
DEBUG_LOG("haoning --ngx_http_echo_merge_loc_conf");
就打印到自定义的
/root/hellogit/hello/graphviz/nginx/mymodule/mylog/test.log


疑问,handler里的怎么打印不出来????

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!

留言需要登陆哦

技术博客集 - 网站简介:
前后端技术:
后端基于Hyperf2.1框架开发,前端使用Bootstrap可视化布局系统生成

网站主要作用:
1.编程技术分享及讨论交流,内置聊天系统;
2.测试交流框架问题,比如:Hyperf、Laravel、TP、beego;
3.本站数据是基于大数据采集等爬虫技术为基础助力分享知识,如有侵权请发邮件到站长邮箱,站长会尽快处理;
4.站长邮箱:[email protected];

      订阅博客周刊 去订阅

文章归档

文章标签

友情链接

Auther ·HouTiZong
侯体宗的博客
© 2020 zongscan.com
版权所有ICP证 : 粤ICP备20027696号
PHP交流群 也可以扫右边的二维码
侯体宗的博客