1.引入
Nginx的日志模块(这里所说的日志模块是ngx_errlog_module模块, 而ngx_http_log_module模块是用于记录HTTP请求的访问日志的, 两者功能不同, 在实现上也没有任何关系) 为其他模块提供了基本的记录日志功能!
2.出于跨平台的考虑, 日志模块提供了相当多的接口, 主要是因为有些平台下不支持可变参数。 主要讨论支持可变参数的日志接口, 事实上不支持可变参数的日志接口在实现方面与其并没有太大的不同。
#define ngx_log_error(level,log,args...) \
if((log)->log_level>=level>=level) ngx_log_error_core(level, log, args)
#define ngx_log_debug(level, log, args...) \
if ((log)->log_level & level) \
ngx_log_error_core(NGX_LOG_DEBUG, log, args)
void ngx_log_error_core(ngx_uint_t level, ngx_log_t log, ngx_err_t err, const char fmt, ...);
解析:采取宏函数
Nginx的日志模块记录日志的核心功能是由ngx_log_error_core方法实现的, ngx_log_error
宏和ngx_log_debug宏只是对它做了简单的封装
参数解析:
1.level参数 对于ngx_log_error宏来说, level表示当前这条日志的级别
级别大全:
级别名称 | 值 | 意义 |
NGX_LOG_STDERR | 0 | 最高级别日志,日志的内容不会再写入 log参数指定的文件,而是会直接将日志输出到标准错误设备,如控制台屏幕 |
NGX_LOG_EMERG | 1 | 大于NGX_LOG_ALERT级别,而小于或等于NGX_LOG_EMERG级别的l志都会输出到log参数指定的文件中 |
NGx_LOG_ALERT |
2 | >NGX_LOG_CRIT |
NGX_LOG_CRIT | 3 | >NGX_LOG_ERR |
NGX_LOG_ERR | 4 | >NGX_LOG_WARN |
NGX_LOG_WARN | 5 | >NGX_LOG_NOTICE |
NGX_LOG_NOTICE | 6 | >NGX_LOG_INFO |
NGX_LOG_INFO | 7 | >NGX LOG DEBUG |
NGX LOG DEBUG | 8 | 调试级别,最低级别 |
注:使用ngx_log_error宏记录日志时, 如果传入的level级别小于或等于log参数中的日志级别
(通常是由nginx.conf配置文件中指定) , 就会输出日志内容
注:在使用ngx_log_debug宏时, level的意义完全不同, 它表达的意义不再是级别(已经是
DEBUG级别) , 而是日志类型, 因为ngx_log_debug宏记录的日志必须是NGX_LOG_DEBUG
调试级别的, 这里的level由各子模块定义
级别名称 | 值 | 意义 |
---|---|---|
NGX_LOG_DEBUG_CORE |
0X010 | 核心模板的调试日志 |
NGX_LOG_DEBUG_ALLOC | 0X020 | ngxin在分配内存时使用的的调试日志 |
NGX_LOG_DEBUG_MUTEX | 0X040 | ngxin在使用进程锁使用的调试日志 |
NGX_LOG_DEBUG_EVENT | 0X080 | ngxin在使用时间模板的调试日志 |
NGX_LOG_DEBUG_HTTP | 0X100 | ngx——http模板的日志 |
NGX_LOG_DEBUG_MAIL | 0X200 | mail模板使用的日志 |
NGX_LOG _DEBUG_MYSOL | 0X400 | 表示使用mysql的相关模板的调试日志 |
当HTTP模块调用ngx_log_debug宏记录日志时, 传入的level参数是NGX_LOG_DEBUG_HTTP, 这时如果log参数不属于HTTP模块, 如使用了event事件模块的log, 则不会输出任何日志。 它正是ngx_log_debug拥有level参数的意义所在
2.log参数
实际上, 在开发HTTP模块时我们并不用关心log参数的构造, 因为在处理请求时
ngx_http_request_t结构中的connection成员就有一个ngx_log_t类型的log成员, 可以传给
ngx_log_error宏和ngx_log_debug宏记录日志。 在读取配置阶段, ngx_conf_t结构也有log成员可
以用来记录日志( 读取配置阶段时的日志信息都将输出到控制台屏幕)
typedef struct ngx_log_s ngx_log_t;
typedef u_char (ngx_log_handler_pt) (ngx_log_t log, u_char buf, size_t len);
struct ngx_log_s {
ngx_uint_t log_level;
ngx_open_file_t *file;
void data;
char action;
};
1.关于data参数:为连接数, 不为0时会输出到日志中ngx_atomic_uint_t connection;
记录日志时的回调方法。 当handler已经实现(不为NULL),并且不是DEBUG调试级别时, 才会调用handler钩子方法 ngx_log_handler_pt handler;每个模块都可以自定义 data的使用方法。 通常,data参数都是在实现了上面的 handler回调方法后才使用的。
例如,HTTP框架就定义了handler方法, 并在data中放入了这个请求的上下文信息, 这样每次输出日志时都会把这个请求URI输出到日志的尾部
2.关于action参数:表示当前的动作。 实际上,action与data是一样的, 只有在实现了handler回调方法后才会使用
例如:HTTP框架就在handler方法中检查action是否为NULL, 如果不为
NULL, 就会在日志后加入“while ”+action, 以此表示当前日志是在进行什么操作, 帮助定位问题
总结:可以看到, 如果只是想把相应的信息记录到日志文件中, 那么完全不需要关心ngx_log_t
类型的log参数是如何构造的。 特别是在编写HTTP模块时, HTTP框架要求所有的HTTP模块
都使用它提供的log, 如果重定义ngx_log_t中的handler方法, 或者修改data指向的地址, 那么
很可能会造成一系列问题
3.err参数:
err参数就是错误码, 一般是执行系统调用失败后取得的errno参数。 当err不为0时,Nginx日志模块将会在正常日志内容前输出这个错误码以及其对应的字符串形式的错误消息
4.fmt参数
fmt就是可变参数
ngx_log_error(NGX_LOG_ALERT, r->connection->log,0,
"test_flag=%d,test_str=%V,path=%*s,mycf addr=%p",
mycf->my_flag,
&mycf->my_str,
mycf->my_path->name.len,
mycf->my_path->name.data,
mycf);
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/129610.html