Sky4

ngx_http_accounting_module的解析

This project is maintained by wangfakang

对NGX_HTTP_ACCOUNTTING_MODULE的分析:

内容:

一:配置说明

二:openlog函数解析

三:syslog函数解析

四:细节注意点

五:日志各字段含义

六:执行流程

一.配置说明:

    http{
        http_accounting  on;   # turn on accounting function
        ...
        server {
            server_name example.com;
            http_accounting_id  accounting_id_str;   # set accounting_id based on server
            ...
            location / { 
                http_accounting_id  accounting_id_str;    # set accounting_id based on location
                ...
            }
        }
    } 

上面的配置就启用了ngx_http_accountting的功能.那么该模块的功能是啥恩?该模块可以作为不同server级别location级别的流量统计,    启动nginx后,日志会记录到系统日志,/var/log/message,类似:

May 1 17:32:25 localhost NgxAccounting: pid:195|from:1368783525|to:13683555|accounting_id:test|requests:30|bytes_out:882066|200:30
May 1 17:53:45 localhost NgxAccounting: pid:196|from:1368784635|to:13684665|accounting_id:test|requests:1|bytes_out:4087|200:1

当然也可以配置独立的log来进行存储:   

echo "syslog.*                /var/log/syslog" >>  /etc/syslog.conf           

service syslog restart

二.openlog函数的解析:

void openlog(const char*ident ,int option,int facility)    
参数一:ident:表示的字符串会加载到每一行的日志信息当中    
参数二:表示一些设置选项    
参数说明:    
LOG_CONS    如果将信息发送给syslogd守护进程时发生错误,直接将相关信息输出到终端    
LOG_NDELAY  立即打开与系统日志的连接(通常情况下,只有在产生第一条日志信息的情况下才会打开与日志系统的连接)     
LOG_NOWAIT  在记录日志信息时,不等待可能的子进程的创建    
LOG_ODELAY  类似于LOG_NDELAY参数,与系统日志的连接只有在syslog函数调用时才会创建    

参数说明    
LOG_PERROR  在将信息写入日志的同时,将信息发送到标准错误输出(POSIX.1-2001不支持该参数)   
LOG_PID 每条日志信息中都包括进程号   


参数三:facility表示rsyslog.conf中前面所配置的,意思表示日志信息 的来源  类型    
facility参数  syslog.conf中对应的facility取值   
LOG_KERN    kern    
LOG_USER    user   
LOG_MAIL    mail    
LOG_DAEMON  daemon   
LOG_AUTH    auth    
LOG_SYSLOG  syslog   
LOG_LPR lpr   
LOG_NEWS    news   
LOG_UUCP    uucp   
LOG_CRON    cron   
LOG_AUTHPRIV    authpriv    
LOG_FTP ftp   
LOG_LOCAL0~LOG_LOCAL7 local0~local7    

三.其次是:syslog函数

原型:     
void syslog(int priority,const char*format,…)    
参数一:priority表示消息的级别    
priority参数  syslog.conf中对应的level取值    
LOG_EMERG   emerg 表示最紧急的信息   
LOG_ALERT   alert 紧急信息    
LOG_CRIT    crit 重要信息      
LOG_ERR err 错误信息    
LOG_WARNING warning    
LOG_NOTICE  notice 普通重要信息    
LOG_INFO    info 通知性消息     
LOG_DEBUG    

LOG_NONO    debug    

nono  没有重要性 不记录任何日志信息    
参数二:表示消息的格式   之后是所要发送的信息      

四.特别注意点:


在syslog的配置文件中:    
   在进行配置什么来源以及什么级别的日志  写入什么文件当中,  在文件路径的前面加"-"减号的时候:其含义是先将其写入缓存,然后在写入磁盘文件.
这样可以提高性能,但是有些不安全  由于有可能某个时候机器宕机了,则机器中缓存的数据就丢失了.

五.输出日志的各字段的含义:


The output contains a list of k/v for the accounting metrics, in the sequence of:          
key     meaning     
pid     pid of nginx worker process   
from / to   metric was collected between these timestamps    
accounting_id   identify for the accounting unit, you name it with http_accounting_id directive       
requests    count of total requests processed    
bytes_in    total bytes receiverd by the server     
bytes_out   total bytes send out by the server    
latency_ms  a sum of $request_time, in millisecond        
upstream_latency_ms     a sum of $upstream_response_time, in millisecond               
200 / 302 / 400 / 404 / 500 ...     count of requests which response is with http code 200/302/400/404/500, etc     

六.内部执行过程: 

其中WORK_PROCESS_INTERVAL 默认值是30    

ngx_http_accounting_work_process_init     
          |   
         \|/     
ngx_add_timer(write_out_ev,WORK_PROCESS_INTERVAL*(rand()%200))  最开始最多等6秒钟    
          |    
         \|/    
write_out_ev有一个handler,其指向work_process_alarm_handler       
          |     
         \|/    
ngx_http_accounting_hash_iterate   ngx_add_timer(write_out_ev,WORK_PROCESS_INTERVAL*1000)  后续每隔30秒输出一次    
          |      
         \|/   
上面函数主要就是调用openlog  syslog其相应函数进行写syslog.       

有问题反馈

在使用中有任何问题,欢迎反馈给我,可以用以下联系方式跟我交流

感激

chunshengsterATgmail.com

关于作者

Linux\nginx\golang\c\c++爱好者

欢迎一起交流 一起学习#