error日志的用法

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_STDERR0最高级别日志,日志的内容不会再写入 log参数指定的文件,而是会直接将日志输出到标准错误设备,如控制台屏幕
NGX_LOG_EMERG1大于NGX_LOG_ALERT级别,而小于或等于NGX_LOG_EMERG级别的l志都会输出到log参数指定的文件中

NGx_LOG_ALERT

2>NGX_LOG_CRIT
NGX_LOG_CRIT3>NGX_LOG_ERR
NGX_LOG_ERR4>NGX_LOG_WARN
NGX_LOG_WARN5>NGX_LOG_NOTICE
NGX_LOG_NOTICE6>NGX_LOG_INFO
NGX_LOG_INFO7>NGX LOG DEBUG
NGX LOG DEBUG8调试级别,最低级别

注:使用ngx_log_error宏记录日志时, 如果传入的level级别小于或等于log参数中的日志级别
(通常是由nginx.conf配置文件中指定) , 就会输出日志内容

注:在使用ngx_log_debug宏时, level的意义完全不同, 它表达的意义不再是级别(已经是
DEBUG级别) , 而是日志类型, 因为ngx_log_debug宏记录的日志必须是NGX_LOG_DEBUG
调试级别的, 这里的level由各子模块定义

ngx_log_debug日志接口level参数的取值范围
级别名称意义

NGX_LOG_DEBUG_CORE

0X010核心模板的调试日志
NGX_LOG_DEBUG_ALLOC0X020ngxin在分配内存时使用的的调试日志
NGX_LOG_DEBUG_MUTEX0X040ngxin在使用进程锁使用的调试日志
NGX_LOG_DEBUG_EVENT0X080ngxin在使用时间模板的调试日志
NGX_LOG_DEBUG_HTTP0X100ngx——http模板的日志
NGX_LOG_DEBUG_MAIL0X200mail模板使用的日志
NGX_LOG _DEBUG_MYSOL0X400表示使用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);


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值