在 MySQL 8.4 中,錯誤日誌記錄使用第 7.5 節「MySQL 組件」中描述的 MySQL 組件架構。錯誤日誌子系統由執行日誌事件篩選和寫入的組件,以及一個用於設定要載入和啟用哪些組件以達到所需日誌記錄結果的系統變數組成。
本節討論如何載入和啟用錯誤日誌記錄的組件。如需關於日誌篩選器的特定說明,請參閱第 7.4.2.4 節「錯誤日誌篩選類型」。如需關於 JSON 和系統日誌接收器的特定說明,請參閱第 7.4.2.7 節「JSON 格式的錯誤日誌」和第 7.4.2.8 節「將錯誤日誌記錄到系統日誌」。如需關於所有可用日誌組件的其他詳細資料,請參閱第 7.5.3 節「錯誤日誌組件」。
基於組件的錯誤日誌記錄提供以下功能
可由篩選器組件篩選的日誌事件,以影響可用於寫入的資訊。
由接收器(寫入器)組件輸出的日誌事件。可以啟用多個接收器組件,以將錯誤日誌輸出寫入多個目的地。
實作預設錯誤日誌格式的內建篩選器和接收器組件。
可啟用 JSON 格式日誌記錄的可載入接收器。
可啟用記錄到系統日誌的可載入接收器。
控制要載入和啟用哪些日誌組件,以及每個組件如何運作的系統變數。
本節以下主題描述錯誤日誌配置
log_error_services
系統變數控制要載入哪些可載入日誌組件,以及啟用哪些日誌組件進行錯誤日誌記錄。預設情況下,log_error_services
具有此處顯示的值
mysql> SELECT @@GLOBAL.log_error_services;
+----------------------------------------+
| @@GLOBAL.log_error_services |
+----------------------------------------+
| log_filter_internal; log_sink_internal |
+----------------------------------------+
該值表示日誌事件首先通過 log_filter_internal
篩選器組件,然後通過 log_sink_internal
接收器組件,這兩個組件都是內建組件。篩選器會修改 log_error_services
值中稍後命名的組件看到的日誌事件。接收器是日誌事件的目的地。通常,接收器會將日誌事件處理成具有特定格式的日誌訊息,並將這些訊息寫入其關聯的輸出,例如檔案或系統日誌。
log_filter_internal
和 log_sink_internal
的組合實現了預設的錯誤日誌篩選和輸出行為。這些元件的動作會受到其他伺服器選項和系統變數的影響。
輸出目的地由
--log-error
選項(以及在 Windows 上,由--pid-file
和--console
選項)決定。這些選項決定是否將錯誤訊息寫入主控台或檔案,以及如果寫入檔案,錯誤日誌檔案的名稱。請參閱第 7.4.2.2 節「預設錯誤日誌目的地設定」。log_error_verbosity
和log_error_suppression_list
系統變數會影響log_filter_internal
允許或抑制哪些類型的日誌事件。請參閱第 7.4.2.5 節「基於優先順序的錯誤日誌篩選 (log_filter_internal)」。
在設定 log_error_services
時,請注意以下特性:
日誌元件列表可以使用分號或逗號分隔,並且可以選擇性地加上空格。給定的設定不能同時使用分號和逗號分隔符。元件順序很重要,因為伺服器會按照列出的順序執行元件。
log_error_services
值中的最後一個元件不能是篩選器。這是一個錯誤,因為它對事件的任何變更都不會影響輸出。mysql> SET GLOBAL log_error_services = 'log_filter_internal'; ERROR 1231 (42000): Variable 'log_error_services' can't be set to the value of 'log_filter_internal'
要修正此問題,請在值的末尾包含一個接收器。
mysql> SET GLOBAL log_error_services = 'log_filter_internal; log_sink_internal';
在
log_error_services
中命名的元件順序非常重要,特別是關於篩選器和接收器的相對順序。考慮這個log_error_services
值:log_filter_internal; log_sink_1; log_sink_2
在這個例子中,日誌事件會傳遞到內建的篩選器,然後傳遞到第一個接收器,再傳遞到第二個接收器。兩個接收器都會收到篩選後的日誌事件。
將其與此
log_error_services
值進行比較:log_sink_1; log_filter_internal; log_sink_2
在這個例子中,日誌事件會傳遞到第一個接收器,然後傳遞到內建的篩選器,再傳遞到第二個接收器。第一個接收器會收到未篩選的事件。第二個接收器會收到篩選後的事件。如果您想要一個包含所有日誌事件訊息的日誌,以及另一個僅包含部分日誌事件訊息的日誌,則可以這樣設定錯誤日誌記錄。
錯誤日誌設定涉及根據需要載入和啟用錯誤日誌元件,並執行特定於元件的設定。
有兩種錯誤日誌設定方法:隱式和顯式。建議選擇一種設定方法並專門使用。同時使用這兩種方法可能會在啟動時產生警告。有關更多資訊,請參閱疑難排解設定問題。
隱含錯誤日誌配置
此設定方法會載入並啟用由
log_error_services
變數定義的日誌元件。在InnoDB
儲存引擎完全可用之前,尚未載入的可載入元件會在啟動時隱式載入。此設定方法具有以下優點:日誌元件會在啟動順序的早期載入,早於
InnoDB
儲存引擎,使得記錄的資訊可以更快地使用。它可以避免在啟動期間發生故障時遺失緩衝的日誌資訊。
使用
INSTALL COMPONENT
安裝錯誤日誌元件不是必需的,簡化了錯誤日誌設定。
若要使用此方法,請參閱隱式錯誤日誌設定。
明確錯誤日誌配置
注意此設定方法支援向後相容性。建議使用隱式設定方法。
此設定方法需要使用
INSTALL COMPONENT
載入錯誤日誌元件,然後設定log_error_services
以啟用日誌元件。INSTALL COMPONENT
會將元件新增到mysql.component
表(一個InnoDB
表),並且要在啟動時載入的元件會從此表中讀取,而此表只有在InnoDB
初始化後才能存取。在啟動順序期間,當
InnoDB
儲存引擎初始化時,記錄的資訊會被緩衝,這有時會因在InnoDB
啟動順序期間發生的還原和資料字典升級等操作而延長。若要使用此方法,請參閱顯式錯誤日誌設定。
此程序說明如何使用 log_error_services
隱式載入並啟用錯誤日誌元件。有關錯誤日誌設定方法的討論,請參閱錯誤日誌設定方法。
若要隱式載入並啟用錯誤日誌元件:
在
log_error_services
值中列出錯誤日誌元件。若要在伺服器啟動時載入並啟用錯誤日誌元件,請在選項檔案中設定
log_error_services
。以下範例設定除了內建的日誌篩選器和接收器 (log_filter_internal
、log_sink_internal
) 之外,還使用 JSON 日誌接收器 (log_sink_json
)。[mysqld] log_error_services='log_filter_internal; log_sink_internal; log_sink_json'
注意若要使用 JSON 日誌接收器 (
log_sink_syseventlog
) 而不是預設接收器 (log_sink_internal
),您會將log_sink_internal
替換為log_sink_json
。若要立即載入並啟用元件以及後續重新啟動,請使用
SET PERSIST
設定log_error_services
:SET PERSIST log_error_services = 'log_filter_internal; log_sink_internal; log_sink_json';
如果錯誤日誌元件公開任何必須設定才能使元件初始化成功的系統變數,請將這些變數設定為適當的值。您可以在選項檔案中或使用
SET PERSIST
設定這些變數。重要在實作隱式設定時,請先設定
log_error_services
以載入元件並公開其系統變數,然後再設定元件的系統變數。無論變數指派是在命令列、選項檔案中執行,還是使用SET PERSIST
執行,都必須遵循此設定順序。
若要停用日誌元件,請從 log_error_services
值中移除它。也移除您已定義的任何相關元件變數設定。
使用 log_error_services
隱式載入日誌元件對 mysql.component
表沒有影響。它不會將元件新增到 mysql.component
表,也不會從 mysql.component
表中移除先前使用 INSTALL COMPONENT
安裝的元件。
此程序說明如何通過使用 INSTALL COMPONENT
載入元件,然後使用 log_error_services
啟用元件,來顯式載入和啟用錯誤日誌元件。有關錯誤日誌設定方法的討論,請參閱錯誤日誌設定方法。
若要顯式載入並啟用錯誤日誌元件:
使用
INSTALL COMPONENT
載入元件(除非它是內建的或已載入)。例如,若要載入 JSON 日誌接收器,請發出以下陳述式:INSTALL COMPONENT 'file://component_log_sink_json';
使用
INSTALL COMPONENT
載入元件會將其註冊在mysql.component
系統表中,以便伺服器在後續啟動時(在InnoDB
初始化之後)自動載入它。使用
INSTALL COMPONENT
載入日誌元件時使用的 URN 是以file://component_
為首碼的元件名稱。例如,對於log_sink_json
元件,對應的 URN 是file://component_log_sink_json
。有關錯誤日誌元件 URN,請參閱第 7.5.3 節「錯誤日誌元件」。如果錯誤日誌元件公開任何必須設定才能使元件初始化成功的系統變數,請將這些變數設定為適當的值。您可以在選項檔案中或使用
SET PERSIST
設定這些變數。通過在
log_error_services
值中列出該元件來啟用它。重要當使用
INSTALL COMPONENT
明確載入記錄組件時,請勿在選項檔案中保留或設定log_error_services
,因為它會在啟動時隱式載入記錄組件。請改用SET GLOBAL
陳述式在執行階段啟用記錄組件。以下範例除了內建的記錄篩選器和接收器(
log_filter_internal
、log_sink_internal
)之外,還設定使用 JSON 記錄接收器(log_sink_json
)。SET GLOBAL log_error_services = 'log_filter_internal; log_sink_internal; log_sink_json';
注意若要使用 JSON 日誌接收器 (
log_sink_syseventlog
) 而不是預設接收器 (log_sink_internal
),您會將log_sink_internal
替換為log_sink_json
。
若要停用記錄組件,請將其從 log_error_services
值中移除。然後,如果組件可載入,並且您也想要卸載它,請使用 UNINSTALL COMPONENT
。同時移除您定義的任何相關聯組件變數設定。
嘗試使用 UNINSTALL COMPONENT
來卸載仍在 log_error_services
值中命名的可載入組件會產生錯誤。
如果您先前使用 INSTALL COMPONENT
明確載入錯誤記錄組件,並想要切換到如 隱式錯誤記錄組態 中所述的隱式組態,建議執行下列步驟
將
log_error_services
還原為其預設組態。SET GLOBAL log_error_services = 'log_filter_internal,log_sink_internal';
使用
UNINSTALL COMPONENT
來卸載您先前安裝的任何可載入記錄組件。例如,如果您先前安裝了 JSON 記錄接收器,請如下所示卸載它UNINSTALL COMPONENT 'file://component_log_sink_json';
移除已卸載組件的任何組件變數設定。例如,如果組件變數是在選項檔案中設定的,請從選項檔案中移除這些設定。如果組件變數是使用
SET PERSIST
設定的,請使用RESET PERSIST
來清除這些設定。按照 隱式錯誤記錄組態 中的步驟來重新實作您的組態。
如果您需要從隱式組態還原為明確組態,請執行下列步驟
將
log_error_services
還原為其預設組態,以卸載隱式載入的記錄組件。SET GLOBAL log_error_services = 'log_filter_internal,log_sink_internal';
移除與已卸載組件相關聯的任何組件變數設定。例如,如果組件變數是在選項檔案中設定的,請從選項檔案中移除這些設定。如果組件變數是使用
SET PERSIST
設定的,請使用RESET PERSIST
來清除這些設定。重新啟動伺服器以卸載隱式載入的記錄組件。
按照 明確錯誤記錄組態 中的步驟來重新實作您的組態。
在啟動時,log_error_services
值中列出的記錄組件會在 MySQL 伺服器啟動序列的早期被隱式載入。如果記錄組件先前是使用 INSTALL COMPONENT
載入的,則伺服器會在啟動序列的稍後嘗試再次載入該組件,這會產生警告 無法從指定的 URN 載入組件:'file://component_組件名稱
'。
您可以在錯誤記錄中檢查此警告,或使用以下查詢來查詢效能架構 error_log
表格
SELECT error_code, data
FROM performance_schema.error_log
WHERE data LIKE "%'file://component_%"
AND error_code="MY-013129" AND data LIKE "%MY-003529%";
若要防止此警告,請按照 變更錯誤記錄組態方法 中的指示來調整您的錯誤記錄組態。應使用隱式或明確的錯誤記錄組態,但不能同時使用兩者。
當嘗試明確載入在啟動時被隱式載入的組件時,也會發生類似的錯誤。例如,如果 log_error_services
列出了 JSON 記錄接收器組件,則該組件會在啟動時被隱式載入。稍後嘗試明確載入同一組件會傳回此錯誤
mysql> INSTALL COMPONENT 'file://component_log_sink_json';
ERROR 3529 (HY000): Cannot load component from specified URN: 'file://component_log_sink_json'.
可以設定多個記錄接收器,這可以將輸出傳送到多個目的地。若要除了預設接收器之外(而不是取代)啟用 JSON 記錄接收器,請如下所示設定 log_error_services
值
SET GLOBAL log_error_services = 'log_filter_internal; log_sink_internal; log_sink_json';
若要還原為僅使用預設接收器並卸載系統記錄接收器,請執行以下陳述式
SET GLOBAL log_error_services = 'log_filter_internal; log_sink_internal;
UNINSTALL COMPONENT 'file://component_log_sink_json';
如果已啟用的記錄組件包含提供效能架構支援的接收器,則寫入錯誤記錄的事件也會寫入效能架構 error_log
表格。這可以使用 SQL 查詢來檢查錯誤記錄內容。目前,傳統格式的 log_sink_internal
和 JSON 格式的 log_sink_json
接收器支援此功能。請參閱 第 29.12.22.2 節,「error_log 表格」。