檢視原始碼 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 模組也會被新增為新記錄器的處理器。

請參閱 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> 將警告事件標記為 errorsinfo,因此在記錄中顯示為 ERROR REPORTINFO REPORT

事件

所有加入到錯誤記錄器的事件處理器都必須處理以下事件。Gleader 是傳送事件的程序的群組領導者 PID,而 Pid 是傳送事件的程序。

  • {error, Gleader, {Pid, Format, Data}} - 當呼叫 error_msg/1,2format/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, logger, log_mf_h, kernel, sasl

摘要

函式

將新的事件處理器加入到錯誤記錄器。事件處理器必須實作為 gen_event 回呼模組。

透過呼叫 gen_event:delete_handler(error_logger, Handler, []) 從錯誤記錄器刪除事件處理器。

記錄標準錯誤事件。FormatData 引數與 STDLIB 中 io:format/2 的引數相同。

記錄標準錯誤事件。錯誤記錄器將事件轉發到 Logger,包括允許與舊錯誤記錄器事件處理器向後相容的中繼資料。

記錄使用者定義的錯誤事件。錯誤記錄器將事件轉發到 Logger,包括允許與舊錯誤記錄器事件處理器向後相容的中繼資料。

回傳 max(10, Depth),其中 Depth 是 Kernel 應用程式中 error_logger_format_depth 的值(如果 Depth 是整數)。否則,會回傳 unlimited

記錄標準資訊事件。FormatData 引數與 STDLIB 中 io:format/2 的引數相同。

記錄標準資訊事件。錯誤記錄器將事件轉發到 Logger,包括允許與舊錯誤記錄器事件處理器向後相容的中繼資料。

記錄使用者定義的資訊事件。錯誤記錄器將事件轉發到 Logger,包括允許與舊錯誤記錄器事件處理器向後相容的中繼資料。

啟用或停用將標準事件列印到檔案。

啟用 (Flag == true) 或停用 (Flag == false) 將標準事件列印到終端機。

回傳警告事件的目前對應。

記錄標準警告事件。FormatData 引數與 STDLIB 中 io:format/2 的引數相同。

記錄標準警告事件。錯誤記錄器將事件轉發到 Logger,包括允許與舊錯誤記錄器事件處理器向後相容的中繼資料。

記錄使用者定義的警告事件。錯誤記錄器將事件轉發到 Logger,包括允許與舊錯誤記錄器事件處理器向後相容的中繼資料。

型別

連結到此型別

open_error()

檢視原始碼 (未匯出)
-type open_error() :: file:posix() | badarg | system_limit.
-type report() :: [{Tag :: term(), Data :: term()} | term()] | string() | term().

函式

連結到此函式

add_report_handler(Handler)

檢視原始碼
-spec add_report_handler(Handler) -> any() when Handler :: module().

等同於 add_report_handler(Handler, [])

連結到此函式

add_report_handler(Handler, Args)

檢視原始碼
-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 程序。

連結到此函式

delete_report_handler(Handler)

檢視原始碼
-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().

等同於 error_msg(Format, [])

連結到此函式

error_msg(Format, Data)

檢視原始碼
-spec error_msg(Format, Data) -> ok when Format :: string(), Data :: list().

記錄標準錯誤事件。FormatData 引數與 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
連結到此函式

error_report(Type, Report)

檢視原始碼
-spec error_report(Type, Report) -> ok when Type :: term(), Report :: report().

記錄使用者定義的錯誤事件。錯誤記錄器將事件轉發到 Logger,包括允許與舊錯誤記錄器事件處理器向後相容的中繼資料。

錯誤記錄器也會在此事件的中繼資料中加入一個 domain 欄位,其值為 [Type],導致預設 Logger 處理器的篩選器捨棄該事件。必須加入不同的 Logger 處理器或錯誤記錄器事件處理器來處理此事件。

建議 Report 的結構與 error_report/1 的結構相同。

此函式保留以供向後相容,且新程式碼不得使用。請改用 ?LOG_ERROR 巨集或 logger:error/1,2,3

-spec format(Format, Data) -> ok when Format :: string(), Data :: list().

等同於 error_msg(Format, Data)

連結到此函式

get_format_depth()

檢視原始碼 (自 OTP 20.0 起)
-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, [])

連結到此函式

info_msg(Format, Data)

檢視原始碼
-spec info_msg(Format, Data) -> ok when Format :: string(), Data :: list().

記錄標準資訊事件。FormatData 引數與 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
連結到此函式

info_report(Type, Report)

檢視原始碼
-spec info_report(Type, Report) -> ok when Type :: any(), Report :: report().

記錄使用者定義的資訊事件。錯誤記錄器將事件轉發到 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,2warning_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().

等同於 warning_msg(Format, [])

連結到此函式

warning_msg(Format, Data)

檢視原始碼
-spec warning_msg(Format, Data) -> ok when Format :: string(), Data :: list().

記錄標準警告事件。FormatData 引數與 STDLIB 中 io:format/2 的引數相同。

錯誤記錄器將事件轉發到 Logger,包括允許與舊錯誤記錄器事件處理器向後相容的中繼資料。

該事件由預設的 Logger 處理器處理。記錄層級可以變更為錯誤或資訊,請參閱 warning_map/0

保留這些函式是為了向下相容,新程式碼不得使用。請改用 ?LOG_WARNING 巨集或 logger:warning/1,2,3

警告

如果在格式字串中使用 Unicode 轉換修飾詞 (t),則所有事件處理器都必須確保格式化的輸出針對 I/O 裝置正確編碼。

連結到此函式

warning_report(Report)

檢視原始碼
-spec warning_report(Report) -> ok when Report :: report().

記錄標準警告事件。錯誤記錄器將事件轉發到 Logger,包括允許與舊錯誤記錄器事件處理器向後相容的中繼資料。

該事件由預設的 Logger 處理器處理。記錄層級可以變更為錯誤或資訊,請參閱 warning_map/0

保留此函式是為了向下相容,新程式碼不得使用。請改用 ?LOG_WARNING 巨集或 logger:warning/1,2,3

連結到此函式

warning_report(Type, Report)

檢視原始碼
-spec warning_report(Type, Report) -> ok when Type :: any(), Report :: report().

記錄使用者定義的警告事件。錯誤記錄器將事件轉發到 Logger,包括允許與舊錯誤記錄器事件處理器向後相容的中繼資料。

錯誤記錄器也會在此事件的中繼資料中加入一個 domain 欄位,其值為 [Type],導致預設 Logger 處理器的篩選器捨棄該事件。必須加入不同的 Logger 處理器或錯誤記錄器事件處理器來處理此事件。

記錄層級可以變更為錯誤或資訊,請參閱 warning_map/0

建議 Report 遵循與 warning_report/1 相同的結構。

保留此函式是為了向下相容,新程式碼不得使用。請改用 ?LOG_WARNING 巨集或 logger:warning/1,2,3