在 logger_helper.h 可發現 log_debug()
、log_info()
… 等 macro 皆是呼叫 logger_helper_print()
,並傳入對應的 level。
而 logger_helper_print()
原始碼如下 :
void logger_helper_print(logger_id_t const logger_id, logger_level_t const level, char const* const format, ...) {
va_list argp;
if (level < logger_output_level_get(stdout)) {
return;
}
va_start(argp, format);
lock_handle_lock(&lock);
logger_va(logger_id, level, format, argp);
lock_handle_unlock(&lock);
va_end(argp);
}
在第 4 行可發現若使用的 logger level 小於 stdout 的 level,便會直接 return ,不會印出任何訊息。
附上 logger 等級表 (由低至高排序)
LOGGER_DEBUG
LOGGER_INFO
LOGGER_NOTICE
LOGGER_WARNING
LOGGER_ERR
LOGGER_CRIT
LOGGER_ALERT
LOGGER_EMERG
首先,原本在 tangle-accelerator/WORKSPACE 裡可以看到使用 entangled 的 commit 版本如下
git_repository(
name = "entangled",
commit = "46cab95db5fa1e03274446d9f2df9a4b7ba12462",
remote = "https://github.com/iotaledger/entangled.git",
)
在這個 commit 版本中的 logger_helper_init()
如下:
retcode_t logger_helper_init() {
if (LOGGER_VERSION != logger_version()) {
return RC_UTILS_INVALID_LOGGER_VERSION;
}
logger_init();
logger_color_prefix_enable();
logger_color_message_enable();
logger_output_register(stdout);
logger_output_level_set(stdout, LOGGER_WARNING);
lock_handle_init(&lock);
return RC_OK;
}
可以注意到 : 第 9 行將 stdout 註冊為一個 logger 的 output stream,第 10 行將 stdout 的 level 設定為 LOGGER_WARNING,這代表透過 log_debug()
、 log_info()
、log_notice()
印出的訊息將無法顯示在 stdout 上,因為這三者的等級低於 LOGGER_WARNING。
因此當時在使用 logger 的時候,若呼叫 logger_helper_init()
,那麼 stdout 不會顯示任何透過 log_debug()
、 log_info()
、log_notice()
印出的訊息。當時的解決方法便是將 logger_helper_init()
裡的程式碼抽出來用,其中
logger_output_level_set(stdout, LOGGER_WARNING);
改寫成
logger_output_level_set(stdout, LOGGER_DEBUG);
也就是將 stdout 的 level 設定成 LOGGER_DEBUG (最低等級),如此一來等級在 LOGGER_DEBUG 以上(含)的 logger 訊息便都能顯示在 stdout 上。
因此整個程式碼如下:
// Initialize logger
if (LOGGER_VERSION != logger_version()) {
return EXIT_FAILURE;
}
logger_init();
logger_color_prefix_enable();
logger_color_message_enable();
logger_output_register(stdout);
logger_output_level_set(stdout, LOGGER_DEBUG);
在 entangled 這個版本中的 logger_helper.c 中可發現,logger_helper_init()
不再將 stdout 的等級寫死成 LOGGER_WARNING 了,而是透過參數設定 stdout 的 level (下方程式碼第 10 行)。此版本的 logger_helper_init()
程式碼如下 :
retcode_t logger_helper_init(logger_level_t level) {
if (LOGGER_VERSION != logger_version()) {
return RC_UTILS_INVALID_LOGGER_VERSION;
}
logger_init();
logger_color_prefix_enable();
logger_color_message_enable();
logger_output_register(stdout);
logger_output_level_set(stdout, level);
lock_handle_init(&lock);
return RC_OK;
}
main()
int main(int argc, char *argv[]) {
status_t ret;
mosq_config_t cfg;
struct mosquitto *mosq = NULL;
// Initialize logger
if (LOGGER_VERSION != logger_version()) {
return EXIT_FAILURE;
}
logger_init();
logger_color_prefix_enable();
logger_color_message_enable();
logger_output_register(stdout);
logger_output_level_set(stdout, LOGGER_DEBUG);
logger_id = logger_helper_enable(MQTT_INTERFACE_LOGGER, LOGGER_DEBUG, true);
.
.
.
}
應改寫成
int main(int argc, char *argv[]) {
status_t ret;
mosq_config_t cfg;
struct mosquitto *mosq = NULL;
// Initialize logger
if (logger_helper_init(LOGGER_DEBUG) != RC_OK) {
return EXIT_FAILURE;
}
logger_id = logger_helper_enable(MQTT_INTERFACE_LOGGER, LOGGER_DEBUG, true);
.
.
.
}
main()
int main(int argc, char* argv[]) {
served::multiplexer mux;
mux.use_after(served::plugin::access_log);
// Initialize logger
if (LOGGER_VERSION != logger_version()) {
return EXIT_FAILURE;
}
logger_init();
logger_color_prefix_enable();
logger_color_message_enable();
logger_output_register(stdout);
logger_output_level_set(stdout, LOGGER_DEBUG);
server_logger_id = logger_helper_enable(SERVER_LOGGER, LOGGER_DEBUG, true);
.
.
.
}
應改寫成
int main(int argc, char* argv[]) {
served::multiplexer mux;
mux.use_after(served::plugin::access_log);
// Initialize logger
if (logger_helper_init(LOGGER_DEBUG) != RC_OK) {
return EXIT_FAILURE;
}
server_logger_id = logger_helper_enable(SERVER_LOGGER, LOGGER_DEBUG, true);
.
.
.
}
main()
int main(int argc, char* argv[]) {
if (signal_handle_register(SIGINT, ta_stop) == SIG_ERR || signal_handle_register(SIGTERM, ta_stop) == SIG_ERR) {
return EXIT_FAILURE;
}
// Initialize logger
if (LOGGER_VERSION != logger_version()) {
return EXIT_FAILURE;
}
logger_init();
logger_color_prefix_enable();
logger_color_message_enable();
logger_output_register(stdout);
logger_output_level_set(stdout, LOGGER_DEBUG);
logger_id = logger_helper_enable(MAIN_LOGGER, LOGGER_DEBUG, true);
.
.
.
}
應改寫成
int main(int argc, char* argv[]) {
if (signal_handle_register(SIGINT, ta_stop) == SIG_ERR || signal_handle_register(SIGTERM, ta_stop) == SIG_ERR) {
return EXIT_FAILURE;
}
// Initialize logger
if (logger_helper_init(LOGGER_DEBUG) != RC_OK) {
return EXIT_FAILURE;
}
logger_id = logger_helper_enable(MAIN_LOGGER, LOGGER_DEBUG, true);
.
.
.
}
logger_helper_enable()
中的
logger_id_level_set(logger_id, level);
此行是設定傳入的 logger_id 的 level ,而非設定 output stream 的 level。
logger_helper_init()
中的
logger_output_level_set(stdout, level);
才是設定 output stream (在此為 stdout) 的 level。
DLTcollab