我看Nginx源代码的时候,感觉整个系统都在传递log指针。log在nginx里是比较关键的。日志和内存分配是最基础的两个起点代码,最好是在自己写的程序框架中早点完善并实现。以免未来要用大量的精力调整。
1. 日志的源代码位置日志的源代码在src/code/ngx_log.c及ngx_log.h里。
2. 日志的初始化在main()函数一开始,对一些基础数据进行初始化,其中之一就是日志,源代码如下:
log = ngx_log_init();
if (log == NULL) {
return 1;
}
3. 传递日志指针在创建任何结构或执行任何函数,无论那种结构体都至少会包含一个向下传递的日志指针,例如以下代码:
init_cycle.log = log;
ngx_cycle = &init_cycle;
init_cycle.pool = ngx_create_pool(1024, log);
if (init_cycle.pool == NULL) {
return 1;
}
说明cycle结构体内含有日志指针、在创建内存池的时候最后一个参数也是日志指针。
我们在列举一些结构,例如:
struct ngx_connection_s {
void *data;
ngx_event_t *read;
ngx_event_t *write;
ngx_socket_t fd;
ngx_recv_pt recv;
ngx_send_pt send;
ngx_recv_chain_pt recv_chain;
ngx_send_chain_pt send_chain;
ngx_listening_t *listening;
off_t sent;
ngx_log_t *log;
在connection结构里也传递了log指针。
4. 日志的分级为了开发调试方便,日志被分成很多等级,我们可以只写入我们关心等级的日志,Nginx的调试等级分成了两个维度,如下:
#define NGX_LOG_STDERR 0
#define NGX_LOG_EMERG 1
#define NGX_LOG_ALERT 2
#define NGX_LOG_CRIT 3
#define NGX_LOG_ERR 4
#define NGX_LOG_WARN 5
#define NGX_LOG_NOTICE 6
#define NGX_LOG_INFO 7
#define NGX_LOG_DEBUG 8
#define NGX_LOG_DEBUG_CORE 0x010
#define NGX_LOG_DEBUG_ALLOC 0x020
#define NGX_LOG_DEBUG_MUTEX 0x040
#define NGX_LOG_DEBUG_EVENT 0x080
#define NGX_LOG_DEBUG_HTTP 0x100
#define NGX_LOG_DEBUG_MAIL 0x200
#define NGX_LOG_DEBUG_MYSQL 0x400
#define NGX_LOG_DEBUG_FIRST NGX_LOG_DEBUG_CORE
#define NGX_LOG_DEBUG_LAST NGX_LOG_DEBUG_MYSQL
#define NGX_LOG_DEBUG_CONNECTION 0x80000000
#define NGX_LOG_DEBUG_ALL 0x7ffffff0
第一个维度是0-8,当我们在配置文件中如下设置:
#error_log logs/debug.log debug;
#error_log logs/error.log notice;
#error_log logs/error.log info;
常量如何与字符串对应起来的可以看,log.c文件中的一段定义:
static const char *err_levels[] = {
"stderr", "emerg", "alert", "crit", "error",
"warn", "notice", "info", "debug"
};
在nginx的判断中只要是debug就一定会输出小于8的所有信息,源代码如下:
#define ngx_log_error(level, log, args...) \
if ((log)->
log_level >= level) ngx_log_error_core(level, log, args)
或者我们管这种维度叫做 error 维度。
另外一个维度是0x10以上,我们可以自由扩展,这个维度是按照叠加效果计算的,源代码如下:
#define ngx_log_debug(level, log, args...) \
if ((log)->
log_level & level) \
ngx_log_error_core(NGX_LOG_DEBUG, log, args)
ngx_set_error_log_levels() {
...
for (n = 1; n <= NGX_LOG_DEBUG; n++) {
if (ngx_strcmp(value[i].data, err_levels[n]) == 0) {
if (log->log_level != 0) {
ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
"duplicate log level \"%s\"",
value[i].data);
return NGX_CONF_ERROR;
}
log->log_level = n;
continue;
}
}
...
}
按照这个逻辑,nginx只认第一有效设置,不能使用这样的配置
error_log logs/debug.log debug | info;
错误是 [emerg] 3596#0: duplicate log level "info" in /data/services/nginx/conf/nginx.conf:6
但可以写
error_log logs/debug.log debug | langwan;
写错了没事 :)
或者我们管这个维度叫做 debug 维度,相关源代码如下:
#define NGX_LOG_DEBUG_FIRST NGX_LOG_DEBUG_CORE
#define NGX_LOG_DEBUG_LAST NGX_LOG_DEBUG_MYSQL
ngx_set_error_log_levels() {
...
for (n = 0, d = NGX_LOG_DEBUG_FIRST; d <= NGX_LOG_DEBUG_LAST; d <<= 1) {
if (ngx_strcmp(value[i].data, debug_levels[n++]) == 0) {
if (log->log_level & ~NGX_LOG_DEBUG_ALL) {
ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
"invalid log level \"%s\"",
value[i].data);
return NGX_CONF_ERROR;
}
log->log_level |= d;
}
}
...
}
由于NGX_LOG_DEBUG_ALL的限制,限制了0-8这9个等级,不能出现在相同的配置里,例如下面的设置是错误的:
error_log logs/debug.log debug | debug_alloc;
错误是 [emerg] 3579#0: invalid log level "debug_alloc" in /data/services/nginx/conf/nginx.conf:6
只能写成
error_log logs/debug.log debug_http | debug_alloc;
5. debug与debug_http之间的关系实际上开启了debug等级会输出所有debug_开头的调试信息,如果我们想过滤一下信息,只能详细去按照 debug_http|debug_alloc 这样去设置,否则光设置debug就全出来了,具体表示关系的代码如下:
if (log->log_level == 0) {
log->log_level = NGX_LOG_ERR;
} else if (log->log_level == NGX_LOG_DEBUG) {
log->log_level = NGX_LOG_DEBUG_ALL;
}
当错误等级包含NGX_LOG_DEBUG设置所有的调试等级给log_level。
6. 默认的错误等级上面的代码实际上也已经说明了,默认的错误等级是NGX_LOG_ERR
7. 错误日志有关的四个函数之间的调度关系ngx_log_error() 按照优先级的大小判定是否输出错误信息,例如:
error_log logs/debug.log error;
不会输出 NGX_LOG_WARN、NGX_LOG_NOTICE、NGX_LOG_INFO、NGX_LOG_DEBUG 信息。
ngx_log_debug() 系列函数一共有10个,这里的0-8表示参数个数,不代表错误等级,用于输出DEBUG_HTTP等调试信息。这9个函数均是ngx_log_debug()的一种宏定义,例如:
#define ngx_log_debug3(level, log, err, fmt, arg1, arg2, arg3) \
if ((log)->log_level & level) \
ngx_log_debug_core(log, err, fmt, arg1, arg2, arg3)
剩下还有ngx_log_debug_core()、与ngx_log_error_core()两个函数
分享到:
相关推荐
它既可以用作一次性容器(装入源代码并启动容器以启动应用程序),也可以用作构建其他图像的基础。 nginx:<version>-alpine 该图像是基于流行的高山Linux项目,可用的alpine官方图片。Alpine Linux比大多数分发...
包含源码和编译好的文件夹。 编译好的可以直接拷贝使用,配置log格式的时候在文件名中加上 $date_udf 变量即可(如:access_log logs/$date_udf.access.log main; 将在 logs目录下生成类似 2014-01-21.access.log 的...
资源包含 nginx最新(1.5.9)源码(修改后的)和编译好的nginx服务器两部分。 nginx 文件夹可直接拷贝到系统中即可用,带有日志自动分割功能 有特殊需要的朋友可以自己编译,和原版nginx编译方式一样
nginx源码分析,整合网络资源精彩呈现,分析的很详细,并附有源码解释,作者:http://blog.csdn.net/kenbinzhang
Linux运维-d2企业级Nginx使用-01基于域名的日志分割.mp4
同时它在处理高并发方面也比spawn-fcgi引擎好很多,因此,推荐Nginx+PHP/PHP-FPM这个组合对PHP进行解析。 FastCGI 的主要优点是把动态语言和HTTP Server分离开来,所以Nginx与PHP/PHP-FPM经常被部署在不同的服务器上...
这个日志分割的方法是从这个博客学的:http://blog.csdn.net/zbfaaadjl/article/details/18768061 这资源确实不值5分,设置5分的主要目的是,如果大家不急着用,还是下载原作者的的资源分析一下吧:...
本解本实现了使用shell脚本实现nginx日志分割,大家如果没资源分下载,可以转至:https://mp.csdn.net/mdeditor/85233117# 去查看源代码。谢谢大家
在您拥有此模块的代码后,通过使用 Nginx 源对其进行配置,将其安装为通常的 Nginx 模块 ./configure --add-module=modules/ngx-flaxton-logger make sudo make install 基本上你就完成了! 配置 模块有一些可...
nginx解析 nginx执行过程 防盗链 缓存 压缩 限速 黑白名单 跨域处理 负载均衡 htts配置 nginx高可用 nginx动态添加模块 平滑升级 常见问题 手动日志分隔 自动日志分隔 pid问题 附录 附录1-目录...
nginx-1.19.9_win服务启动_分割日志(1).rar
环境配置: linux:Centos7 JDK:1.8 Hadoop:2.8.5(默认已安装好集群环境) Nginx:14.0(独立部署) Flume:1.8.0(与Nginx部署在一起) ...3、 进入到nginx的源码目录中 cd /usr/local/src/nginx-14.0/ 4、 预
NULL 博文链接:https://baobeituping.iteye.com/blog/2165977
实时收集、解析Nginx日志(日志文件在不断地增加),需要较好的处理: * **断点续读**:agent意外挂掉,重启之后从上次处理过的位置继续处理 * **日志滚动**:当rename Nginx日志文件,并reload Nginx的时候,...
Igor 将源代码以类 BSD 许可证的形式发布。尽管还是测试版,但是,Nginx 已经因为它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名了。 使用 Nginx 前必须了解的事项 目前官方 Nginx 并不支持 ...
基于Hadoop网站流量日志数据分析系统项目源码+教程.zip网站流量日志数据分析系统 典型的离线流数据分析系统 技术分析 hadoop nginx flume hive sqoop mysql springboot+mybatisplus+vcharts 基于Hadoop网站流量日志...
如果要想以json格式记录nginx日志以便logstash分析,该如何指定日志格式呢?可以按照下面的格式来实现。 定义nginx日志格式: 代码如下: log_format logstash_json ‘{ “@timestamp”: “$time_local”, ‘ ‘”...
NULL 博文链接:https://senon.iteye.com/blog/1202835
可一键配置nginx日志生成格式,并进行图形化解析,充分了解访客数据与后台服务运行状况。 docker容器部署 将nginx与nginxWebUI集成到一个docker镜像中,完美的打造一个拥有图形界面的nginx运行包,不与服务器上...
Python分析日志文件,日志可以是apache、nginx的访问日志,也可以是自定义生成的日志 ### 统计数据入库 将Python分析日志得到的统计数据放到MySQL库中 ### 利用Flask渲染页面 利用Flask框架,生成路由和渲染图表...