`
zpball
  • 浏览: 916685 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Nginx开发从入门到精通——调试(调试日志)

阅读更多
用户在使用Nginx的过程中,可能会遇到所请求的资源不正确,Nginx Core Dump,段错误等异常情况,这时需要有相应的机制来进行调试及问题定位,特别是面对大量的日志信息,合理的调试处理机制对用户来说是一件非常重要的事情。以下将着重为大家介绍调试日志。

【调试日志】
一,开启调试日志:
要开启调试日志,首先需要在配置Nginx时打开调试功能,然后编译:
./configure --with-debug ...
然后在配置文件中设置error_log的级别为:
error_log /path/to/log debug;
Nginx的Windows二进制版本总是将调试日志开启的,因此只需要设置debug的日志级别即可。

二,日志级别分析:
在此,我们通过分析Nginx源码了解下Nginx将日志分为几个等级及不同日志等级之间的相互关系:

Ngx_log.h代码 
#define NGX_LOG_STDERR 0  
#define NGX_LOG_EMERG 1  
#define NGX_LOG_ALERT 2  
#define NGX_LOG_CRIT 3  
#define NGX_LOG_ERR 4  
#define NGX_LOG_WARN 5  
#define NGX_LOG_NOTICE 6  
#define NGX_LOG_INFO 7  
#define NGX_LOG_DEBUG 8  
  
#define NGX_LOG_DEBUG_CORE 0x010  
#define NGX_LOG_DEBUG_ALLOC 0x020  
#define NGX_LOG_DEBUG_MUTEX 0x040  
#define NGX_LOG_DEBUG_EVENT 0x080  
#define NGX_LOG_DEBUG_HTTP 0x100  
#define NGX_LOG_DEBUG_MAIL 0x200  
#define NGX_LOG_DEBUG_MYSQL 0x400  
  
#define NGX_LOG_DEBUG_FIRST NGX_LOG_DEBUG_CORE  
#define NGX_LOG_DEBUG_LAST NGX_LOG_DEBUG_MYSQL  
#define NGX_LOG_DEBUG_CONNECTION 0x80000000  
#define NGX_LOG_DEBUG_ALL 0x7ffffff0  


其中默认有效的第一级别日志是"stderr","emerg","alert","crit","error","warn","notice","info","debug"。
而Ngx_log.h内列出的其他debug第二级别日志:"debug_core","debug_alloc","debug_mutex","debug_event","debug_http","debug_mail","debug_mysql"等则需要在配置Nginx时启动调试日志功能才能使用,并且用户可以通过修改Ngx_log.h及Ngx_log.c源码来更新debug第二级别。

我们再通过Ngx_log.c的部分代码分析下可以如何使用这些日志级别:

Ngx_log.c代码 
char *  
ngx_log_set_levels(ngx_conf_t *cf, ngx_log_t *log)  
{  
    ...  
  
        for (n = 1; n <= NGX_LOG_DEBUG; n++) {  
            if (ngx_strcmp(value[i].data, err_levels[n].data) == 0) {  
  
                if (log->log_level != 0) {  
                    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,  
                                       "duplicate log level \"%V\"",  
                                       &value[i]);  
                    return NGX_CONF_ERROR;  
                }  
  
                log->log_level = n;  
                found = 1;  
                break;  
            }  
        }  
  
        for (n = 0, d = NGX_LOG_DEBUG_FIRST; d <= NGX_LOG_DEBUG_LAST; d <<= 1) {  
            if (ngx_strcmp(value[i].data, debug_levels[n++]) == 0) {  
                if (log->log_level & ~NGX_LOG_DEBUG_ALL) {  
                    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,  
                                       "invalid log level \"%V\"",  
                                       &value[i]);  
                    return NGX_CONF_ERROR;  
                }  
  
                log->log_level |= d;  
                found = 1;  
                break;  
            }  
        }  
 ...  
 if (log->log_level == NGX_LOG_DEBUG) {  
        log->log_level = NGX_LOG_DEBUG_ALL;  
    }  
 ...  
}  

按照以上代码逻辑,我们可以得出以下结论:
1. 第一级别日志之间是互斥的,如果配置文件内加入如下配置项:

error_log path/logs/error.log warn;  
error_log path/logs/error.log info;  

那么启动Nginx将报错如下:
[emerg]: duplicate log level "info" in /path/conf/nginx.conf:XX
但是需要注意的是,在配置文件不同block中是允许重新定义错误日志的。但是当用户在重新定义错误日志时,如果没有指定相应的日志级别,那么调试日志将会被屏蔽。下面的例子里,在server层中重新定义的日志就屏蔽了这个虚拟主机的调试日志:

  
error_log  /path/to/log  debug;  
  
http {  
    server {  
        error_log  /path/to/log; 

        ... 
为了避免这个问题,可以注释这行重新定义日志的配置,或者也给日志指定debug级别:

  
error_log  /path/to/log  debug;  
  
http {  
    server {  
        error_log  /path/to/log  debug;  

        ... 

2. 第二级别日志是多选的,用户可以根据项目需要配置多个第二级别日志:
 
error_log  logs/error.log debug_mysql;  
error_log  logs/error.log debug_core; 


3. 在第一级别日志与第二级别日志组合配置时,仅有在第一级别日志为"debug"时才可以有第二级别的配置,其他第一级别日志的情况下指定第二级别日志将无法启动Nginx,如:
 
error_log  logs/error.log error;  
error_log  logs/error.log debug_core;  

启动Nginx将获得如下错误信息:
[emerg]: invalid log level “debug_http” in /path/conf/nginx.conf:XX
当用户开启debug级别日志时,会输出所有debug_开头的调试信息,因此可以通过上面组合debug_core|debug_http的形式来获取用户所需要的调试信息。

三,日志格式设置:
用户在使用Nginx提供web服务的时候,可能会有很多场景需要记录日志,如打点日志,访问日志,数据统计日志,性能分析日志等。为了更加方便的对日志进行分析,我们可以通过设置日志格式的方式来要求Nginx按照用户要求进行日志的展现。
控制nginx日志输出的指令如下:

log_format  customLog "$remote_addr^A$remote_user^A$time_local^A$request_method^A$uri^A$args^A$server_protocol"  
        "^A$status^A$body_bytes_sent^A$http_referer"  
        "^A$http_user_agent";  
access_log /path/logs/access.log customLog; 

上面例子中通过使用特殊字符(^A)来作为日志字段的分隔符,用户后续可以使用sort和grep之类的工具对特定url做分析,如统计各url请求量倒排取前50个:

awk -F^A '{print $5}' /path/logs/access.log | sort | uniq -c | sort -nr | head -50 

类似上面的日志定制化设置,可以让用户在调试日志的过程中随心所欲,如鱼得水。
详细的log_format指令和access_log指令,用户可以访问Nginx官网的HttpLog模块。

四,调试日志的几个注意点:
1. 勘误:在Nginx Wiki里面error log相关部分的介绍中提到
http://wiki.nginx.org/NginxHttpMainModule#error_log
Default values for the error level:
in the main section - error
in the HTTP section - crit
in the server section - crit
但是,我们从源码上看:

static char *  
ngx_error_log(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)  
{  
    ...  
  
    if (cf->args->nelts == 2) {  
        cf->cycle->new_log.log_level = NGX_LOG_ERR;  
        return NGX_CONF_OK;  
    }  
 ...  
}  

当error_log 的日志级别选项为配置时,默认日志级别为error,无上面提及的三个section的区别。故特在此勘误。

2. 配置error_log off并不能关闭日志记录——日志信息会被写入到文件名为off的文件当中。如果要关闭日志记录,用户可以做如下配置:
C代码 
error_log /dev/null crit; 

3. 如果nginx进程没有权限将日志信息写入指定的log地址,那么nginx会在启动是报错:
[alert]: could not open error log file: open() "/path/log/nginx/error.log" failed (13: Permission denied)

4. 通过debug_connection配置项,用户可以针对某些地址开启调试日志:

  
error_log  /path/to/log;  
   
events {  
    debug_connection   10.232.10.1;  
    debug_connection   10.232.10.0/24;  
} 





参考文献:
1. 调试日志 http://nginx.org/cn/docs/debugging_log.html
2. nginx error log  http://wiki.nginx.org/NginxHttpMainModule#error_log
3. log format http://wiki.nginx.org/HttpLogModule
4. 使用nginx记日志 http://blog.linezing.com/2011/11/%E4%BD%BF%E7%94%A8nginx%E8%AE%B0%E6%97%A5%E5%BF%97

转发请备注转自:100continue.iteye.com
分享到:
评论

相关推荐

    Nginx开发从入门到精通 Nginx开发从入门到精通 Nginx开发从入门到精通中文

    Nginx开发从入门到精通 中文版,入门到精通 Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理...

    Nginx开发从入门到精通pdf高清带目录

    《Nginx开发从入门到精通》是一本深入解析Nginx技术的书籍,适合对Web服务器技术感兴趣的初学者和进阶者。Nginx是一款高性能的HTTP和反向代理服务器,广泛应用于互联网领域的网站部署和负载均衡。本书旨在帮助读者...

    Nginx开发从入门到精通

    Nginx作为负载均衡服务器:Nginx 既可以在内部直接支持 Rails 和 PHP 程序对外进行服务,也可以支持作为 HTTP代理服务器对外进行服务...Nginx采用C进行编写,不论是系统资源开销还是CPU使用效率都比 Perlbal 要好很多。

    Nginx开发从入门到精通.pdf

    《Nginx开发从入门到精通》这本书是由淘宝核心系统服务器平台组成员创作的,他们利用在淘宝内部使用Nginx的经验和知识,将Nginx的模块开发和原理进行了系统性的讲解,为想要深入了解Nginx的人提供了宝贵的资料。...

    Nginx开发从入门到精通[chm]--淘宝团队作品

    根据... 《Nginx开发从入门到精通》是淘宝团队在nginx定制开发中经验积累写就的作品,本书的作者为淘宝核心系统服务器平台组的成员,本书写作的思路是从模块开发逐渐过渡到nginx原理剖析。

    nginx开发从入门到精通

    ngnix开发从入门到精通的网页,讲得比较全面

    NGINX开发从入门到精通

    NGINX开发从入门到精通 NGINX 是一种流行的开源Web服务器软件,具有高性能、稳定性强、灵活性高的特点。在本节中,我们将从NGINX的架构入手,了解NGINX的工作原理,从而更好地理解和使用NGINX。 NGINX架构 NGINX...

    Nginx教程从入门到精通

    **Nginx教程从入门到精通** 在当前的互联网环境中,Nginx作为一个高性能的HTTP和反向代理服务器,已经成为许多网站和应用的首选。它的轻量级、高并发处理能力以及灵活的配置使得它在业界备受推崇。Nginx自2011年的...

    cpp-Nginx开发从入门到精通

    《cpp-Nginx开发从入门到精通》是一本专注于C/C++编程语言和Nginx Web服务器开发的深度指南。Nginx以其高效、稳定和灵活的架构在全球范围内被广泛采用,尤其在中国的互联网巨头淘宝中扮演着核心角色。本书旨在满足...

    nginx开发从入门到精通pdf版

    《Nginx开发从入门到精通》是一本深入解析Nginx的权威指南,它涵盖了从基础配置到高级开发的全面知识。这本书旨在帮助读者理解Nginx的工作原理,掌握其配置技巧,并能够进行模块的编写,从而实现对Nginx的深度定制。...

Global site tag (gtag.js) - Google Analytics