本节我们主要讲述一下nginx中日志的相关实现。
1. 函数ngx_log_init()
本函数用于初始化nginx中的第一个log对象。下面我们简要介绍一下该函数:
2. ngx_log_open_default()函数
本函数用于打开一个默认的log以作为后期日志输出。 这里我们首先介绍一下cycle->new_log
: 因为在nginx初始化时会默认采用一个log,用于打印相应的提示信息,而在完成初始化之后,会初始化一个新的log作为默认log。下面我们简要介绍一下本函数:
3. 函数ngx_log_redirect_stderr()
本函数用于将标准错误重定向到某个文件。这里首先会检查cycle->log_use_stderr
,如果该变量为值为1,则表明当前需要使用stderr,不需要进行重定向;否则,则会将stderr重定向到日志链的一个文件日志中。
4. 函数ngx_log_get_file_log()
本函数用于从一个日志链中获取到第一个文件日志。
5. 函数ngx_log_set_levels()
本函数用于设置日志的级别。下面我们简要分析一下该函数:
6. 函数ngx_error_log()
在解析到error_log
指令时,调用本函数用于设置log
7. 函数ngx_log_set_log()
本函数用于在解析到error_log
指令时,向nginx log链中插入一个新的ngx_log_t
对象。下面我们简要分析一下该函数:
8. 函数ngx_log_insert()
log链是按log->log_level
从大到小的顺序排列的,本函数用于将一个新的ngx_log_t
对象插入到一个已存在的log链中。(注意: 一般log链的头是一个固定地址,因此这里插入到头部时用了一个小技巧)
9. 函数ngx_log_memory_writer()
上面函数较为简单,就是往循环memory buf中写日志数据。这里需要注意的一点是:
written = ngx_atomic_fetch_add(&mem->written, len);
当多线程向buf中写时,通过如上实现原子操作。
上面memory log指示
区域大概内容如下:
10. 函数ngx_log_memory_cleanup()
用于销毁memory log缓存。这里注意,由于目前我们使用的是基于pool的内存,这里我们并不会真正释放内存。实际上,nginx内部基本上只有在整个进程退出时由操作系统来自动释放内存。
[参考]
- nginx error log