スマートスタイル TECH BLOG|データベース&クラウドの最新技術情報を配信

MySQL8.0でエラーログのフィルタリング

MySQL8.0からエラーログは新機能となるコンポーネントベースで管理するように変更されています。
出力形式にJSON形式が追加されていたり、フィルタリングについても今まではログレベルでのフィルタリングのみでしたが、ルールベースでのフィルタリングも可能になっています。

今回は、新たに追加されたルールベースでのフィルタリングについて確認したいと思います。

デフォルトでは log_filter_internal 組込みコンポーネントが設定されており、ログレベルでのフィルタリングのみが可能です。
log_filter_internal で出力するログレベルの設定をするには、これまでと同様に log_error_verbosity パラメータを使用します。

手順としては、以下のような手順となります。

1. log_filter_dragnet コンポーネントをインストール
2. log_filter_dragnet を使用するよう設定
3. ルールの定義

それでは、各手順を確認していきます。

1. log_filter_dragnet コンポーネントをインストール

コンポーネントをインストールします。

インストールされたコンポーネントを確認します。

file://component_log_filter_dragnet が存在する事が確認できました。

2. log_filter_dragnet を使用するよう設定

今回はデフォルトのログファイルにフィルタを適用する為、以下のように設定します。

※log_sink_internal はデフォルトのログWriterとなります。

設定を確認します。

3. ルールの定義

log_filter_dragnet のデフォルト設定では、ログレベルがNote以上のログが出力されるので(log_error_verbosity=3 相当)、今回は以下のようなクライアントの認証時のエラーを出力しないように設定しようと思います。

ルール定義の構文については、以下にように定義します。

  IF condition THEN action [ELSEIF condition THEN action] [ELSE action].

log_filter_dragnet のルール定義の詳細については、以下のMySQLリファレンスに記載されています。
https://dev.mysql.com/doc/refman/8.0/en/error-log-filtering.html#error-log-filtering-language

conditionに「エラーコードが010926」、actionとして「drop」を指定して設定します。

※MySQL8.0より「SET PERSIST」構文が追加されています。「SET GLOBAL」では、サーバ再起動により設定情報が破棄されてしまいますが、「SET PERSIST」を使用した場合は、サーバを再起動しても設定情報が保持されます。

以下のようにエラーコードを設定する事もできます。

1 warningが表示されていますが、
https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_dragnet.log_error_filter_rules
に記載されているように、ルール作成に成功するとNoteメッセージが生成されます。

設定した内容を確認します。

この設定によって、クライアントの認証エラーが発生した場合に、エラーメッセージが表示されない事が確認できました。

まとめ

上に記載のMySQLリファレンスを見ても、これまでのログレベル以外にも今回検証したエラーコード、さらにはクライアントホストやユーザ等によるフィルタリングも可能となっており、用途によってはログサイズの縮小化、ログ解析の効率化にも役立ってくれそうです。


MySQL

 

Return Top