檢視原始碼 error_logger (kernel v10.2)
Erlang 錯誤記錄器。
注意
在 Erlang/OTP 21.0 中,新增了一個用於記錄的新 API。舊的
error_logger
模組仍然可以被舊程式碼使用,但記錄事件會被重新導向到新的 Logger API。新的程式碼應該直接使用 Logger API。
error_logger
預設不再啟動,但是當使用error_logger:add_report_handler/1,2
加入事件處理器時會自動啟動。然後,error_logger
模組也會被新增為新記錄器的處理器。
Erlang *錯誤記錄器* 是一個事件管理器(請參閱 OTP 設計原則 和 gen_event
),註冊為 error_logger
。
錯誤記錄器預設不再啟動,但是當使用 add_report_handler/1,2
加入事件處理器時會自動啟動。然後,error_logger
模組也會被新增為新記錄器的處理器,導致記錄事件從記錄器轉發到錯誤記錄器,並進而轉發到所有已安裝的錯誤記錄器事件處理器。
可以新增使用者定義的事件處理器來處理應用程式特定的事件。
STDLIB 和 SASL 提供的現有事件處理器仍然可用,但是 OTP 不再使用。
警告事件在 Erlang/OTP R9C 中引入,並從 Erlang/OTP 18.0 開始預設啟用。為了保持與現有使用者定義事件處理器的向後相容性,可以使用命令列標誌 +W <e | i | w>
將警告事件標記為 errors
或 info
,因此在記錄中顯示為 ERROR REPORT
或 INFO REPORT
。
事件
所有加入到錯誤記錄器的事件處理器都必須處理以下事件。Gleader
是傳送事件的程序的群組領導者 PID,而 Pid
是傳送事件的程序。
{error, Gleader, {Pid, Format, Data}}
- 當呼叫error_msg/1,2
或format/2
時產生。{error_report, Gleader, {Pid, std_error, Report}}
- 當呼叫error_report/1
時產生。{error_report, Gleader, {Pid, Type, Report}}
- 當呼叫error_report/2
時產生。{warning_msg, Gleader, {Pid, Format, Data}}
- 當呼叫warning_msg/1,2
時,如果警告設定為標記為警告時產生。{warning_report, Gleader, {Pid, std_warning, Report}}
- 當呼叫warning_report/1
時,如果警告設定為標記為警告時產生。{warning_report, Gleader, {Pid, Type, Report}}
- 當呼叫warning_report/2
時,如果警告設定為標記為警告時產生。{info_msg, Gleader, {Pid, Format, Data}}
- 當呼叫info_msg/1,2
時產生。{info_report, Gleader, {Pid, std_info, Report}}
- 當呼叫info_report/1
時產生。{info_report, Gleader, {Pid, Type, Report}}
- 當呼叫info_report/2
時產生。
請注意,也可能會接收到一些系統內部事件。因此,在事件處理器回呼函數 gen_event:handle_event/2
的定義中,最後必須加入 catch-all 子句。這也適用於 gen_event:handle_info/2
,因為事件處理器也必須處理一些系統內部訊息。
參閱
摘要
函式
將新的事件處理器加入到錯誤記錄器。事件處理器必須實作為 gen_event
回呼模組。
透過呼叫 gen_event:delete_handler(error_logger, Handler, [])
從錯誤記錄器刪除事件處理器。
記錄標準錯誤事件。Format
和 Data
引數與 STDLIB 中 io:format/2
的引數相同。
記錄標準錯誤事件。錯誤記錄器將事件轉發到 Logger,包括允許與舊錯誤記錄器事件處理器向後相容的中繼資料。
記錄使用者定義的錯誤事件。錯誤記錄器將事件轉發到 Logger,包括允許與舊錯誤記錄器事件處理器向後相容的中繼資料。
回傳 max(10, Depth)
,其中 Depth
是 Kernel 應用程式中 error_logger_format_depth
的值(如果 Depth 是整數)。否則,會回傳 unlimited
。
記錄標準資訊事件。Format
和 Data
引數與 STDLIB 中 io:format/2
的引數相同。
記錄標準資訊事件。錯誤記錄器將事件轉發到 Logger,包括允許與舊錯誤記錄器事件處理器向後相容的中繼資料。
記錄使用者定義的資訊事件。錯誤記錄器將事件轉發到 Logger,包括允許與舊錯誤記錄器事件處理器向後相容的中繼資料。
啟用或停用將標準事件列印到檔案。
啟用 (Flag == true
) 或停用 (Flag == false
) 將標準事件列印到終端機。
回傳警告事件的目前對應。
記錄標準警告事件。Format
和 Data
引數與 STDLIB 中 io:format/2
的引數相同。
記錄標準警告事件。錯誤記錄器將事件轉發到 Logger,包括允許與舊錯誤記錄器事件處理器向後相容的中繼資料。
記錄使用者定義的警告事件。錯誤記錄器將事件轉發到 Logger,包括允許與舊錯誤記錄器事件處理器向後相容的中繼資料。
型別
函式
-spec add_report_handler(Handler, Args) -> Result when Handler :: module(), Args :: gen_event:handler_args(), Result :: gen_event:add_handler_ret().
將新的事件處理器加入到錯誤記錄器。事件處理器必須實作為 gen_event
回呼模組。
Handler
通常是回呼模組的名稱,而 Args
是一個選擇性詞語(預設為 []),傳遞給初始化回呼函式 gen_event:init/1
。如果成功,則函式回傳 ok
。
事件處理器必須能夠處理此模組中的事件,請參閱 事件 一節。
第一次呼叫此函式時,會將 error_logger
新增為 Logger 處理器,並啟動 error_logger
程序。
-spec delete_report_handler(Handler) -> Result when Handler :: module(), Result :: gen_event:del_handler_ret().
透過呼叫 gen_event:delete_handler(error_logger, Handler, [])
從錯誤記錄器刪除事件處理器。
如果在刪除後不再有任何事件處理器,則會將 error_logger
從 Logger 處理器中移除,並停止 error_logger
程序。
-spec error_msg(Format) -> ok when Format :: string().
記錄標準錯誤事件。Format
和 Data
引數與 STDLIB 中 io:format/2
的引數相同。
錯誤記錄器將事件轉發到 Logger,包括允許與舊錯誤記錄器事件處理器向後相容的中繼資料。
該事件由預設的 Logger 處理器處理。
此函式保留以供向後相容,且新程式碼不得使用。請改用 ?LOG_ERROR
巨集或 logger:error/1,2,3
。
範例
1> error_logger:error_msg("An error occurred in ~p", [a_module]).
=ERROR REPORT==== 22-May-2018::11:18:43.376917 ===
An error occurred in a_module
ok
警告
如果在格式字串中使用 Unicode 轉換修飾詞 (
t
),則所有事件處理器都必須確保格式化的輸出針對 I/O 裝置正確編碼。
-spec error_report(Report) -> ok when Report :: report().
記錄標準錯誤事件。錯誤記錄器將事件轉發到 Logger,包括允許與舊錯誤記錄器事件處理器向後相容的中繼資料。
該事件由預設的 Logger 處理器處理。
此函式保留以供向後相容,且新程式碼不得使用。請改用 ?LOG_ERROR
巨集或 logger:error/1,2,3
。
範例
2> error_logger:error_report([{tag1,data1},a_term,{tag2,data}]).
=ERROR REPORT==== 22-May-2018::11:24:23.699306 ===
tag1: data1
a_term
tag2: data
ok
3> error_logger:error_report("Serious error in my module").
=ERROR REPORT==== 22-May-2018::11:24:45.972445 ===
Serious error in my module
ok
記錄使用者定義的錯誤事件。錯誤記錄器將事件轉發到 Logger,包括允許與舊錯誤記錄器事件處理器向後相容的中繼資料。
錯誤記錄器也會在此事件的中繼資料中加入一個 domain
欄位,其值為 [Type]
,導致預設 Logger 處理器的篩選器捨棄該事件。必須加入不同的 Logger 處理器或錯誤記錄器事件處理器來處理此事件。
建議 Report
的結構與 error_report/1
的結構相同。
此函式保留以供向後相容,且新程式碼不得使用。請改用 ?LOG_ERROR
巨集或 logger:error/1,2,3
。
-spec get_format_depth() -> unlimited | pos_integer().
回傳 max(10, Depth)
,其中 Depth
是 Kernel 應用程式中 error_logger_format_depth
的值(如果 Depth 是整數)。否則,會回傳 unlimited
。
注意
自 Erlang/OTP 21.0 引入 Logger API 後,
error_logger_format_depth
變數已棄用。保留此變數和此函式是為了向下相容,因為舊的報告處理器可能仍會使用它們。
-spec info_msg(Format) -> ok when Format :: string().
等同於 info_msg(Format, [])
。
記錄標準資訊事件。Format
和 Data
引數與 STDLIB 中 io:format/2
的引數相同。
錯誤記錄器將事件轉發到 Logger,包括允許與舊錯誤記錄器事件處理器向後相容的中繼資料。
該事件由預設的 Logger 處理器處理。
保留這些函式是為了向下相容,新程式碼不得使用。請改用 ?LOG_INFO
巨集或 logger:info/1,2,3
。
範例
1> error_logger:info_msg("Something happened in ~p", [a_module]).
=INFO REPORT==== 22-May-2018::12:03:32.612462 ===
Something happened in a_module
ok
警告
如果在格式字串中使用 Unicode 轉換修飾詞 (
t
),則所有事件處理器都必須確保格式化的輸出針對 I/O 裝置正確編碼。
-spec info_report(Report) -> ok when Report :: report().
記錄標準資訊事件。錯誤記錄器將事件轉發到 Logger,包括允許與舊錯誤記錄器事件處理器向後相容的中繼資料。
該事件由預設的 Logger 處理器處理。
保留此函式是為了向下相容,新程式碼不得使用。請改用 ?LOG_INFO
巨集或 logger:info/1,2,3
。
範例
2> error_logger:info_report([{tag1,data1},a_term,{tag2,data}]).
=INFO REPORT==== 22-May-2018::12:06:35.994440 ===
tag1: data1
a_term
tag2: data
ok
3> error_logger:info_report("Something strange happened").
=INFO REPORT==== 22-May-2018::12:06:49.066872 ===
Something strange happened
ok
記錄使用者定義的資訊事件。錯誤記錄器將事件轉發到 Logger,包括允許與舊錯誤記錄器事件處理器向後相容的中繼資料。
錯誤記錄器也會在此事件的中繼資料中加入一個 domain
欄位,其值為 [Type]
,導致預設 Logger 處理器的篩選器捨棄該事件。必須加入不同的 Logger 處理器或錯誤記錄器事件處理器來處理此事件。
建議 Report
遵循與 info_report/1
相同的結構。
保留此函式是為了向下相容,新程式碼不得使用。請改用 ?LOG_INFO
巨集或 logger:info/1,2,3
。
-spec logfile(Request :: {open, Filename}) -> ok | {error, OpenReason} when Filename :: file:name(), OpenReason :: allready_have_logfile | open_error(); (Request :: close) -> ok | {error, CloseReason} when CloseReason :: module_not_found; (Request :: filename) -> Filename | {error, FilenameReason} when Filename :: file:name(), FilenameReason :: no_log_file.
啟用或停用將標準事件列印到檔案。
這是透過新增或刪除 error_logger_file_h
事件處理器來完成的,因此間接地將 error_logger
作為 Logger 處理器新增。
請注意,此函式不會直接操作 Logger 配置,這表示如果預設的 Logger 處理器已經記錄到檔案,此函式可能會導致記錄到第二個檔案。
此函式在開發和測試期間可用作快捷方式,但不應在生產系統中使用。有關如何為即時系統配置 Logger 的資訊,請參閱 Kernel 使用者指南中的「記錄」章節和 logger
手冊頁。
Request
是下列其中之一
{open, Filename}
- 開啟記錄檔Filename
。如果成功,則傳回ok
;如果已啟用記錄到檔案,則傳回{error, allready_have_logfile}
;如果發生其他錯誤(例如,無法開啟Filename
),則傳回錯誤元組。該檔案以 UTF-8 編碼開啟。close
- 關閉目前的記錄檔。傳回ok
,或{error, module_not_found}
。filename
- 傳回記錄檔的名稱Filename
,如果未啟用記錄到檔案,則傳回{error, no_log_file}
。
-spec tty(Flag) -> ok when Flag :: boolean().
啟用 (Flag == true
) 或停用 (Flag == false
) 將標準事件列印到終端機。
這是透過操作 Logger 配置來完成的。此函式在開發和測試期間可用作快捷方式,但不應在生產系統中使用。有關如何為即時系統配置 Logger 的資訊,請參閱 Kernel 使用者指南中的「記錄」章節和 logger
手冊頁。
-spec warning_map() -> Tag when Tag :: error | warning | info.
回傳警告事件的目前對應。
使用 warning_msg/1,2
或 warning_report/1,2
傳送的事件會根據命令列旗標 +W
的值標記為錯誤、警告(預設)或資訊。
範例
os$ erl
Erlang (BEAM) emulator version 5.4.8 [hipe] [threads:0] [kernel-poll]
Eshell V5.4.8 (abort with ^G)
1> error_logger:warning_map().
warning
2> error_logger:warning_msg("Warnings tagged as: ~p~n", [warning]).
=WARNING REPORT==== 11-Aug-2005::15:31:55 ===
Warnings tagged as: warning
ok
3>
User switch command
--> q
os$ erl +W e
Erlang (BEAM) emulator version 5.4.8 [hipe] [threads:0] [kernel-poll]
Eshell V5.4.8 (abort with ^G)
1> error_logger:warning_map().
error
2> error_logger:warning_msg("Warnings tagged as: ~p~n", [error]).
=ERROR REPORT==== 11-Aug-2005::15:31:23 ===
Warnings tagged as: error
ok
-spec warning_msg(Format) -> ok when Format :: string().
記錄標準警告事件。Format
和 Data
引數與 STDLIB 中 io:format/2
的引數相同。
錯誤記錄器將事件轉發到 Logger,包括允許與舊錯誤記錄器事件處理器向後相容的中繼資料。
該事件由預設的 Logger 處理器處理。記錄層級可以變更為錯誤或資訊,請參閱 warning_map/0
。
保留這些函式是為了向下相容,新程式碼不得使用。請改用 ?LOG_WARNING
巨集或 logger:warning/1,2,3
。
警告
如果在格式字串中使用 Unicode 轉換修飾詞 (
t
),則所有事件處理器都必須確保格式化的輸出針對 I/O 裝置正確編碼。
-spec warning_report(Report) -> ok when Report :: report().
記錄標準警告事件。錯誤記錄器將事件轉發到 Logger,包括允許與舊錯誤記錄器事件處理器向後相容的中繼資料。
該事件由預設的 Logger 處理器處理。記錄層級可以變更為錯誤或資訊,請參閱 warning_map/0
。
保留此函式是為了向下相容,新程式碼不得使用。請改用 ?LOG_WARNING
巨集或 logger:warning/1,2,3
。
記錄使用者定義的警告事件。錯誤記錄器將事件轉發到 Logger,包括允許與舊錯誤記錄器事件處理器向後相容的中繼資料。
錯誤記錄器也會在此事件的中繼資料中加入一個 domain
欄位,其值為 [Type]
,導致預設 Logger 處理器的篩選器捨棄該事件。必須加入不同的 Logger 處理器或錯誤記錄器事件處理器來處理此事件。
記錄層級可以變更為錯誤或資訊,請參閱 warning_map/0
。
建議 Report
遵循與 warning_report/1
相同的結構。
保留此函式是為了向下相容,新程式碼不得使用。請改用 ?LOG_WARNING
巨集或 logger:warning/1,2,3
。