更新時(shí)間:2023年10月18日17時(shí)53分 來源:傳智教育 瀏覽次數(shù):
EMQ X 使用了分層的日志系統(tǒng),在日志級(jí)別上,包括全局日志級(jí)別 (primary log level)、以及各 log hanlder 的日志級(jí)別。
[Primary Level] -- global log level and filters / \ [Handler 1] [Handler 2] -- log levels and filters at each handler
log handler 是負(fù)責(zé)日志處理和輸出的工作進(jìn)程,它由 log handler id 唯一標(biāo)識(shí),并負(fù)有如下任務(wù):
接收什么級(jí)別的日志
如何過濾日志消息
將日志輸出到什么地方
我們來看一下 emqx 默認(rèn)安裝的 log handlers:
/opt/emqx $ emqx_ctl log handlers list LogHandler(id=ssl_handler, level=debug, destination=console) LogHandler(id=file, level=warning, destination=log/emqx.log) LogHandler(id=default, level=warning, destination=console)
file: 負(fù)責(zé)輸出到日志文件的 log handler。它沒有設(shè)置特殊過濾條件,即所有日志消息只要級(jí)別滿足要求就輸出。輸出目的地為日志文件。
default: 負(fù)責(zé)輸出到控制臺(tái)的 log handler。它沒有設(shè)置特殊過濾條件,即所有日志消息只要級(jí)別滿足要 求就輸出。輸出目的地為控制臺(tái)。
ssl_handler: ssl 的 log handler。它的過濾條件設(shè)置為當(dāng)日志是來自 ssl 模塊時(shí)輸出。輸出目的地為控制臺(tái)。
日志消息輸出前,首先檢查消息是否高于 primary log level,日志消息通過檢查后流入各 log handler,再檢查各 handler 的日志級(jí)別,如果日志消息也高于 handler level,則由對(duì)應(yīng)的 handler 執(zhí)行相應(yīng)的過濾條件,過濾條件通過則輸出。
設(shè)想一個(gè)場景,假設(shè) primary log level 設(shè)置為 info,log handler default (負(fù)責(zé)輸出到控制臺(tái)) 的級(jí)別設(shè)置為debug,log handler file (負(fù)責(zé)輸出到文件) 的級(jí)別設(shè)置為 warning:
雖然 console 日志是 debug 級(jí)別,但此時(shí) console 日志只能輸出 info 以及 info 以上的消息,因?yàn)榻?jīng)過primary level 過濾之后,流到 default 和 file 的日志只剩下 info 及以上的級(jí)別;
emqx.log.N 文件里面,包含了 warning 以及 warning 以上的日志消息。
在日志級(jí)別小節(jié)中提到的 log.level 是修改了全局的日志級(jí)別。這包括 primary log level 和各個(gè) handlers 的日志級(jí)別,都設(shè)置為了同一個(gè)值。
Primary Log Level 相當(dāng)于一個(gè)自來水管道系統(tǒng)的總開關(guān),一旦關(guān)閉則各個(gè)分支管道都不再有水流通過。這個(gè)機(jī)制保證了日志系統(tǒng)的高性能運(yùn)作。
運(yùn)行時(shí)修改日志級(jí)別
可以使用 EMQ X 的命令行工具 emqx_ctl 在運(yùn)行時(shí)修改 emqx 的日志級(jí)別:
修改全局日志級(jí)別:
例如,將 primary log level 以及所有 log handlers 的級(jí)別設(shè)置為 debug:
$ emqx_ctl log set-level debug
修改主日志級(jí)別:
例如,將 primary log level 設(shè)置為 debug:
$ emqx_ctl log handlers set-level file debug
北京校區(qū)