分享

2.2 利用日志信息跟踪Nginx

 mediatv 2015-10-21

《深入剖析Nginx》第2章跟踪与调试,本章将介绍一些跟踪与调试程序的方法,除了最基本的 gdb 调试,我还将结合个人经验,介绍一些相对高级的应用技巧这除了包括最基本的gdb调试以外,结合作者的个人经验,还提供一些相对高级的应用技巧。本节为大家介绍利用日志信息跟踪Nginx。

AD:【线下活动】三大新锐HTML 5企业汇聚51CTO—大话移动前端技术

2.2  利用日志信息跟踪Nginx

优秀的程序都会带有自己的日志输出接口,并且一般还会给出不同等级的输出级别,以便于重次信息的过滤,比如 Linux 内核的日志输出标准接口为 printk,并且给出了KERN_EMERG、KERN_ALERT、KERN_DEBUG等这样的输出等级。Nginx 与此类似,下面具体来看。

为了获取最丰富的日志信息,我们在进行configure配置时,需要把--with-debug选项加上,这样能生成一个名为NGX_DEBUG的宏,而在Nginx源码内,该宏被用作控制开关,如果没有它,那么很多日志逻辑代码将在make编译时直接跳过。比如对单连接的debug_connection调试指令、分模块日志调试debug_http功能等。

  1. 00:00: 代码片段2.2-1,文件名: ngx_auto_config.h  
  2. 01:01: #define NGX_CONFIGURE " --with-debug"  
  3. 02:02:  
  4. 03:03: #ifndef NGX_DEBUG  
  5. 04:04: #define NGX_DEBUG  1  
  6. 05:05: #endif  
  7. 620:620: 代码片段2.2-2,文件名: nginx.c  
  8. 621:621: #if (NGX_DEBUG)  
  9. 622:622:        {  
  10. 623:623:        char  **e;  
  11. 624:624:        for (e = env; *e; e++) {  
  12. 625:625:              ngx_log_debug1(NGX_LOG_DEBUG_CORE, cycle->log, 0, "env: %s", *e);  
  13. 626:626:        }  
  14. 627:627:        }  
  15. 628:628: #endif 

有了上面这个编译前提条件之后,我们还想需在配置文件里做恰当的设置。关于这点,Nginx提供的主要配置指令为error_log。该配置项的默认情况(默认值定义在objs/ngx_auto_config.h文件内)为

  1. error_log logs/error.log error; 

表示日志信息记录在logs/error.log(如果没改变Nginx的默认工作路径的话,那么默认其父目录为/usr/local/nginx/)文件内,而日志记录级别为error。

在实际进行配置时,可以修改日志信息记录文件路径(比如修改为/dev/null,此时所有日志信息将被输出到所谓的linuxLinux黑洞设备,导致日志信息全部丢弃)或直接输出到标准终端(此时指定为stderr)。Nginx提供的日志记录级别一共有8八级,等级从低到高分别为debug、info、notice、warn、error、crit、alert、emerg。如果设置为error,则表示Nginx内等级为error、crit、alert、和emerg的4四种级别的日志将被输出到日志文件或标准终端。另外的debug、info、notice、warn这4四种日志将被直接过滤掉而不会输出。因此如果我们只关注特别严重的信息,只需将日志等级设置为emerg即可大大减少Nginx的日志输出量,这样就避免了在大量的日志信息里寻找重要信息的麻烦。

当我们利用日志跟踪Nginx时,需要获取最大量的日志信息,所以此时可以把日志等级设置为最低的debug级。在这种情况下,如果觉得调试日志太多,Nginx提供按模块控制的更细粒等级:debug_core、debug_alloc、debug_mutex、debug_event、debug_http、debug_imap。比如如果只想看http的调试日志,则需做如下设置。

  1. error_log logs/error.log debug_http; 

此时Nginx将输出从info到emerg所有等级的日志信息,而debug日志则将只输出与http模块相关的内容。

error_log配置指令可以放在配置文件的多个上下文内,比如main、http、server、location,但同一个上下文中只能设置一个error_log,否则Nginx将提示类似如下这样的错误。

  1. nginx: [emerg] "error_log" directive is duplicate in /usr/local/nginx/conf/ nginx.conf:9 

但在不同的配置文件上下文里可以设置各自的error_log配置指令,通过设置不同的日志文件,这是Nginx提供的又一种信息切割过滤手段。

  1. 00:00: 代码片段2.2-3,文件名: example.conf  
  2. 01:01: ...  
  3. 02:02: error_log  logs/error.log error;  
  4. 03:03: ...  
  5. 04:04: http {  
  6. 05:05:       error_log  logs/http.log debug;  
  7. 06:06:       ...  
  8. 07:07:       server {  
  9. 08:08:             ...  
  10. 09:09:             error_log  logs/server.log debug;  
  11. 10:10: ... 

Nginx提供的另一种更有针对性的日志调试信息记录是针对特定连接的,这通过debug_connection配置指令来设置,比如如下设置调试日志仅针对IP地址192.168.1.1和IP段192.168.10.0/24:

  1. 11:11: 代码片段2.2-4,文件名: example.conf  
  2. 12:12: events {  
  3. 13:13:       debug_connection 192.168.1.1;  
  4. 14:14:       debug_connection 192.168.10.0/24;  
  5. 15:15: } 

Nginx的日志功能仍在不断改进中,如能利用得好,对于我们跟着跟踪Nginx还是非常有帮助的,至少我知道有不少朋友十分习惯于使用C库的printf()函数打印调试,相比如此,Nginx提供的ngx_log_xxx()系列函数要强大得多。

【责任编辑:book TEL:(010)68476606】


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多