日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

Nginx的error_log和Access_log分析 nginx access log


Nginx的error_log和Access_log分析 nginx access log


nginx配置中有關(guān)日志的配置主要是圍繞著下面兩個指令:
1、error_log
2、access_log:記錄訪問日志
首先要強(qiáng)調(diào)的一點(diǎn)是,如果access日志和error日志都是常量文件名(因?yàn)閍ccess支持變量文件名,后續(xù)會講到),那么nginx進(jìn)程會緩存文件描述符直到進(jìn)程結(jié)束 。
什么時候日志的fd會改變呢?
1)進(jìn)程重啟
2)收到了NGX_REOPEN_SIGNAL信號,會產(chǎn)生新的日志文件
其他情況下,日志的fd不變,所以當(dāng)進(jìn)程運(yùn)行中,刪除了日志文件的話,并不會生成新的日志文件,且日志都會丟失
下面詳細(xì)講一下這兩個指令的來龍去脈
一:先說error_log:
nginx有兩個模塊支持error_log指令:
一個是 ngx_errlog_module ,這個模塊只有一個指令,就是error_log ,配置類型為:NGX_MAIN_CONF,回調(diào)函數(shù)為:ngx_error_log;
另一個是 ngx_http_core_module,這個模塊中也有指令:error_log ,配置類型為:NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF,回調(diào)函數(shù)為:ngx_http_core_error_log 。
static ngx_command_t ngx_errlog_commands[] = {
{ngx_string("error_log"),
NGX_MAIN_CONF|NGX_CONF_1MORE,
ngx_error_log,
0,
0,
NULL},
ngx_null_command
};
static ngx_command_t ngx_http_core_commands[] = {
{ ngx_string("error_log"),
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,
ngx_http_core_error_log,
NGX_HTTP_LOC_CONF_OFFSET,
0,
NULL },
}
這樣會產(chǎn)生幾個疑問:
1:為什么需要兩個相同的指令實(shí)現(xiàn)相同的功能 。
2:兩個指令的類型均支持NGX_HTTP_MAIN_CONF ,那么在main中配置的error_log到底使用的是哪一個
3:兩者的作用關(guān)系 。
下面來解釋一下:
nginx在進(jìn)行模塊注冊時,會發(fā)現(xiàn) ngx_errlog_module 模塊是先于 ngx_http_core_module 模塊注冊的。
在nginx在解析配置文件的時候 ,見到 error_log,會按照注冊模塊的順序查找指令,這樣,會先找到ngx_errlog_module模塊,如果此時,error_log是在main配置的,那么和ngx_errlog_module模塊error_log的NGX_HTTP_MAIN_CONF match,執(zhí)行ngx_error_log 。
如果error_log是在http{}配置的,也會按照注冊模塊的順序查找指令,找到ngx_errlog_module模塊的error_log,發(fā)現(xiàn)type是NGX_HTTP_MAIN_CONF,不match,繼續(xù)往下找,找到ngx_http_core_module的error_log,type是NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF ,match后執(zhí)行ngx_http_core_error_log 。
上面提到了ngx_error_log 和 ngx_http_core_error_log兩個函數(shù),這兩個函數(shù)的功能基本一致,但是因?yàn)閮蓚€配置作用域不同,所以配置存儲位置不同:ngx_errlog_module存儲在cycle->new_log,ngx_http_core_module存儲在http core模塊數(shù)據(jù)結(jié)構(gòu)ngx_http_core_loc_conf_s的error_log(在此簡寫成:clcf->error_log) 。
clcf->error_log是http模塊中的,其主要記錄和http請求相關(guān)的日志 。
cycle->new_log主要記錄如進(jìn)程啟動,event等 。
但是主進(jìn)程啟動的時候,此時還沒有讀取配置文件,即沒有指定日志打印在哪里 。nginx這時候雖然可以將一些出錯內(nèi)容或者結(jié)果輸?shù)綐?biāo)準(zhǔn)輸出,但是如果要記錄一些系統(tǒng)初始化情況,socket監(jiān)聽狀況,還是需要寫到日志文件中去的 。在nginx的main函數(shù)中,首先會調(diào)用ngx_log_init 函數(shù),默認(rèn)日志文件為:安裝路徑/logs/error.log,如果這個文件沒有權(quán)限訪問的話,會直接報錯退出 。在mian函數(shù)結(jié)尾處,在ngx_master_process_cycle函數(shù)調(diào)用之前,會close掉這個日志文件 。
如果只在main配置了error_log,http{}中沒有設(shè)置,那么clcf->error_log賦值為clcf->error_log,如下:
static char *

推薦閱讀