0%

nginx日志系统

如题

一、nginx主要有三种log:

  1. 记录系统信息的
  2. 记录http框架信息的
  3. 记录访问信息的
性质 1.系统信息log 2.http框架信息log 3.记录访问信息log
默认文件[1] error.log error.log access.log
记录的信息 系统信息,比如内存申请,时间更新,事件分发 关于HTTP事件的信息,比如建立连接,建立请求上下文,处理阶段 详细记录访问信息,支持变量和自定义格式
主要谁在用 cycle,各个核心代码和框架代码(除http) listening,connection,event使用的多 ngx_http_log_module模块使用,也是11个处理阶段中最后一个阶段

[1]关于默认文件的说明:1和2默认记录在相同文件,也可以不同文件。配置项也相同,都是error_log,只不过作用域不同。

二、主要人物都使用的哪种类型log

1. ngx_cycle_t

用的就是初始化的时候设置的,log = ngx_log_init(ngx_prefix);init_cycle(只在初始化的时候用到)再传到ngx_cycle

2. ngx_event_t

作为ls的c的rev的log是从c中拿过来的,而作为ls的c的log是从ls拿过来的:

1
2
3
c->log = &ls[i].log;
rev = c->read;
rev->log = c->log;

作为接收连接的log跟c的log一样,见下方。

3. ngx_listening_t

用的error_log配置项指定的文件,新建的:

1
2
3
ls->logp = clcf->error_log;
ls->log.data = &ls->addr_text;
ls->log.handler = ngx_accept_log_error;

表示的是新建立连接时候的日志,在遍历建立起来的ls的时候,又重新配置了一遍所有的ls

1
ls[i].log = *ls[i]logp;

所以logp只是初始化配置的时候使用的。

4. ngx_connection_t

自己申请的log = ngx_palloc(c->pool, sizof(ngx_lot_t));,但值是从ls->log中拿来的*log = ls->log;

5. http

ngx_http_log_module.c提供的,可以进行的配置项有:

1
2
3
log_format
access_log
opne_log_file_cache

主要是操作access.log的,记录响应的访问及处理信息。

三、核心函数

只有一个:

1
void ngx_log_error_core();

实现了三次,主要是为了跨平台:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#if (NGX_HAVE_C99_VARIADIC_MACROS)

void ngx_log_error_core(ngx_uint_t level, ngx_log_t *log, ngx_err_t err,
const char *fmt, ...);

#elif (NGX_HAVE_GCC_VARIADIC_MACROS)

void ngx_log_error_core(ngx_uint_t level, ngx_log_t *log, ngx_err_t err,
const char *fmt, ...);

#else /* NO VARIADIC MACROS */

void ngx_log_error_core(ngx_uint_t level, ngx_log_t *log, ngx_err_t err,
const char *fmt, va_list args);

#endif /* VARIADIC MACROS */

另外,在系统初始化的时候,并没有配置好日志文件,因此日志是输出到终端的,当从配置文件或命令行参数中获取并正确配置好后,才将后续日志写入文件中。