本节我们主要讲述一下nginx中日志的相关实现。
1. 相关静态函数声明
下面简要介绍一下这些函数:
-
ngx_error_log()
: 解析error_log指令时相应的处理函数
-
ngx_log_set_levels()
: 主要是为了设置日志级别
-
ngx_log_insert()
: 将new_log插入到log链表中,log链表是按log->log_level
从大到小的顺序排列的。
-
ngx_log_memory_writer()
: 此函数在NGX_DEBUG
条件下使用,主要用于在调试环境下将buf数据写到内存中。
-
ngx_log_memory_cleanup()
: 此函数在NGX_DEBUG
条件下使用,主要用于清除内存buf
-
ngx_log_memory_buf_t
: 此数据结构在NGX_DEBUG
条件下使用,用于在内存中保存日志的buf。这是一个循环buffer内存,下面我们详细介绍一下该数据结构中各字段的含义:
2. 相关变量定义
这里定义了error_log模块ngx_errlog_module
,该模块对应的上下文为ngx_errlog_module_ctx
,该模块对应的指令为ngx_errlog_commands
。
接着定义了3个变量:
最后定义了日志错误级别及debug级别。
3. nginx中的error_log指令
这里在介绍nginx log之前,我们再介绍一下error_log
指令:
Syntax: error_log file [level];
Default:
error_log logs/error.log error;
Context: main, http, mail, stream, server, location
上述指令用于配置日志。在同一level层级(main/http/mail/stream/server/location)可以配置多个日志。假如在main配置层级并未显示的指定日志的存放位置,那么此时会采用默认的文件来进行存放。
上述指令的第一个参数file
用于定义log的存放位置。需要指出的是如果file被指定为特殊值stderr
时,则日志会被输出到标准错误。如果需要将日志写到syslog
的话,则配置的前缀为syslog:
。而如果需要将日志写到一个循环内存buffer
中,则使用memory
加上一个size
大小,将日志写到内存一般用在调试阶段。
第二个参数level
定义日志的打印级别,可取值有:debug, info, notice, warn, error, crit, alert, 或者emerg。前面列出的log级别是按照错误的严重顺序递增排列的,大于等于该指定级别的日志都会被打印出来。例如,将日志的打印级别设置为默认值error,则error,crit,alert,emerg消息都会被记录。当level
参数被省略时,会采用默认的error级别。
注意:要想使debug级别日志工作,则在nginx编译源代码时必须添加--with-debug
选项。
4. 函数ngx_log_error_core()
当前我们支持c99可变参数宏。本函数是进行错误日志打印的核心函数,下面我们简要分析一下该函数的实现:
5. 普通日志及debug日志输出函数
上面两个函数主要是为了处理编译器不支持可变参数宏的情况下普通日志及debug日志的输出。
6. 函数ngx_log_abort()
用于输出alert级别的日志。
7. 函数ngx_log_stderr()
将相应的日志输出到stderr
8. 函数ngx_log_errno()
将ngx_err_t
类型的错误码格式化到buf中。
[参考]
-
git的使用
-
bit book
-
nginx error log