erlang日誌功能 問題解析

2021-08-30 05:28:21 字數 1734 閱讀 6250

用mochiweb搭建好**框架後,發現並沒有日誌功能,於是決定增加日誌。

《programming erlang》說,在erlang otp中已經內建了乙個日誌模組,並具備過濾功能。直接使用其提供的配置檔案elog4.config。並定義了4個巨集,分別對應error_logger中的error_***,info_***函式。如下:

[,%% only report errors

,%% define the parameters of the rotating log

%% the log file directory

,%% # bytes per logfile

, % 10 mb

%% maximum number of

]}].

-define (imsg(x), error_logger:info_msg("~p:~p ~p~n",[?module, ?line, x])).

-define (ireport(x), error_logger:info_report([, |x])).

-define (emsg(x), error_logger:error_msg("~p:~p ~p~n",[?module, ?line, x])).

-define (ereport(x), error_logger:error_report([, |x])).

寫了乙個測試。執行後,在用rb檢視日誌資訊時,發現了問題。

按《programming erlang》中的描述,使用這個配置,應該只記錄error資訊才對。結果是,日誌中不僅有error資訊,還有info資訊以及progress資訊。

大惑。google之,找到一篇文章(其大意是errlog_type是受sasl_error_logger影響的。如果設定了,那麼將失效。

英文不佳,沒有理解透徹,只好看**了。原來,sasl中有兩個日誌事件處理器,分別是sasl_error_logger、error_logger_mf。

配置檔案中的引數,可以分為兩種。其中,引數sasl_error_logger、errlog_type是為sasl_error_logger日誌處理器服務的。而引數error_logger_mf_dir、error_logger_mf_maxbytes、error_logger_mf_maxfiles是為error_logger_mf服務的。兩組引數互不影響。

sasl_error_logger是乙個儲存文字資料的日誌處理器。只記錄監管(supervisor_report)、崩潰(crash_report)、程序(progress)三種報告。可以根據引數的不同,對報告進行過濾。***x是progress時,只記錄程序報告。***x是error時,記錄監管、崩潰兩種報告。

對開發除錯、維護跟蹤真正有用的是error_logger_mf日誌處理器。它是乙個儲存二進位制資料的日誌處理器,需要使用rb才能瀏覽其中的資訊。會記錄所有型別的日誌資訊,卻不能過濾任何資訊。

鬱悶,最想要的功能,偏偏沒有。看來只能使用-ifdef()來控制輸出的資訊,或者使用log4erl了。

ps:在中,對erlang的日誌功能存在的一些問題。還介紹了乙個error_logger_mf的替代方案。其輸出的是文字格式的日誌檔案,但依然不具備過濾功能。

在閱讀log_mf_h.erl時發現,log_mf_h是可以指定乙個過濾函式的。只有當這個函式返回true時,才會向日誌檔案中寫入資訊。而在sasl.erl中設定的過濾函式,基本沒有進行任何過濾。

看來,有時間的話,可以試試修改sasl.erl中的過濾函式,實現log_mf_h的型別過濾功能。

多型問題解析

首先,什麼是多型?多型 多種形態 class 動物 class 貓 extends 動物 把貓看成貓 貓 mao new 貓 常態 把貓看成動物 動物 mao new 貓 多型 把子類型別的物件看成了父類型別 貓 mao new 動物 錯誤的 多型 父類型別的引用指向了子類物件 多型的前提條件 存在...

wamp問題解析

乙個網域名稱,乙個主機,兩個專案 怎麼辦?虛擬主機 首先解析幾個隨意的網域名稱,接下來.1 啟用虛擬主機功能 開啟apache的配置檔案httpd.conf 並去掉 include conf extra httpd vhosts.conf前面的 2 找到apache conf extra下的配置檔案...

oracle in list 問題解析

解決where in list 問題,首要考慮的就是解決列表長度問題和效率問題,效率問題首要考慮繫結變數問題,另外還要考慮比如cardinality對執行計畫的影響等 declare v condition varchar2 100 v sql varchar2 1000 v count numbe...