《深入剖析Nginx》——2.2 利用日志信息跟踪Nginx

2.2 利用日志信息跟踪Nginx

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

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

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

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

error_log logs/error.log error;

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

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

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

error_log logs/error.log debug_http;

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

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

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

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

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

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

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

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

时间: 2024-08-08 16:22:08

《深入剖析Nginx》——2.2 利用日志信息跟踪Nginx的相关文章

《深入剖析Nginx》一2.2 利用日志信息跟踪Nginx

2.2 利用日志信息跟踪Nginx 深入剖析Nginx 优秀的程序都会带有自己的日志输出接口,并且一般还会给出不同等级的输出级别,以便于重次信息的过滤,比如 Linux 内核的日志输出标准接口为 printk,并且给出了KERN_EMERG.KERN_ALERT.KERN_DEBUG等这样的输出等级.Nginx 与此类似,下面具体来看. 为了获取最丰富的日志信息,我们在进行configure配置时,需要把--with-debug选项加上,这样能生成一个名为NGX_DEBUG的宏,而在Nginx源

《深入剖析Nginx》一2.3 利用strace/pstack调试Nginx

2.3 利用strace/pstack调试Nginx 深入剖析NginxLinux下有两个命令strace1和ltrace2可以分别用来查看一个应用程序在运行过程中所发起的系统函数调用和动态库函数调用,这对作为标准应用程序的Nginx自然同样可用.由于这两个命令大同小异,下面就仅以strace为例做简单介绍,大致了解一些它能帮助我们获取哪些有用的调试信息.关于strace/ltrace以及后面介绍的pstack更多的用法请参考对应的Man手册. 从strace的Man手册可以看到几个有用的选项.

《深入剖析Nginx》——2.3 利用strace/pstack调试Nginx

2.3 利用strace/pstack调试Nginx Linux下有两个命令strace1和ltrace2可以分别用来查看一个应用程序在运行过程中所发起的系统函数调用和动态库函数调用,这对作为标准应用程序的Nginx自然同样可用.由于这两个命令大同小异,下面就仅以strace为例做简单介绍,大致了解一些它能帮助我们获取哪些有用的调试信息.关于strace/ltrace以及后面介绍的pstack更多的用法请参考对应的Man手册. 从strace的Man手册可以看到几个有用的选项. p pid:通过

《深入剖析Nginx》——第2章  跟踪与调试2.1 利用gdb调试

第2章 跟踪与调试 跟踪与调试,不仅是我们解决程序Bug的有力途径,也是帮助我们理解现有代码的有效方法.通过跟踪程序执行的过程,我们可以清楚地了解程序的内部逻辑,对于不明就里的实现细节,调试查看程序内部变量也能更好地帮助我们做出正确的理解.本章将介绍一些跟踪与调试程序的方法,除了最基本的 gdb 调试,我还将结合个人经验,介绍一些相对高级的应用技巧. 2.1 利用gdb调试 gdb是Linux下调试程序的常用工具,任何Linux开发工程师初学程序调试时第一个接触到的工具应该就是gdb.关于gdb

利用strace/pstack调试Nginx

Linux下有两个命令strace 和ltrace 可以查看一个应用程序在运行过程中所发起的系统调用,这对作为标准应用程序的Nginx自然同样可用.由于这两个命令大同小异,所以下面就仅以strace为例做简单介绍,大致了解一些它能帮助我们获取哪些有用的调试信息.关于strace/ltrace以及后面介绍的pstack更多的用法请参考对应的Man手册. 从strace的Man手册可以看到几个有用的选项. -p pid:通过进程号来指定被跟踪的进程. -o filename:将跟踪信息输出到指定文件

如何修改nginx源代码改变访问日志的时间格式

由于公司领导说要把nginx访问日志存进数据库,然后利用程序进行分析,但是nginx访问日志的时间格式是:[17/Jun/2013:14:42:13 +0400] 这种格式不能用datetime格式存进数据库,只能以字符串的格式存进数据库,但是以字符串的格式存进数据库不好按天来进程查询分析,所以需要更改nginx访问日志的时间格式,经过网上查找资料得知更改源代码可以再进行编译可以更改nginx访问日志的格式,但是公司里的程序员都是PHP的,没有人懂C语言,想来想去只有我自己改源码然后编译安装(虽

利用日志记录可以实现什么样的功能?

问题描述 利用日志记录可以实现什么样的功能?比如说收银系统,系统日志中记录了前台各个服务员以及后台人员使用软件时的操作记录,有操作时间,操作人,和操作内容的.可以利用这些数据做一个查看什么时间,什么人,做了什么操作. 解决方案 解决方案二:日志还可以记录访问人的请求信息(分析请求客户端信息,记录ip,访问频率,判断合法性等等吧).还有就是记录系统异常解决方案三:日志的作用主要是在于1.系统异常的时候查找定位问题2.记录关键操作的相关信息,操作人,涉及数据等等3.记录正常交易信息,方便出问题后定位

详解Nginx服务器中的日志相关配置_nginx

nginx 日志相关指令主要有两条, log_format,用来设置日志格式, access_log,用来指定日志文件的存放路径.格式和缓存大小 log_format 格式log_format name( 格式名字) 格式样式(即想要得到什么样的日志内容)   默认的示例: log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_s ent "$h

挖掘QQ空间营销潜力 利用日志打造免费品牌推广

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 作为拥有用户人数最多的QQ平台,很多人都知道QQ拥有的巨大营销价值,目前利用QQ进行营销的方式有QQ群,QQ微博,QQ邮件,QQ的漂流瓶还有QQ空间!其中QQ空间的营销,往往是容易被忽略的一种,可是笔者认为,如果利用好QQ空间的营销,带给自己的不仅仅是产品或者网站的推广,更重要的是能够给网站或者产品带来品牌效应,可见QQ空间营销潜力是有很多能