MySQL8.0からエラーログは新機能となるコンポーネントベースで管理するように変更されています。
出力形式にJSON形式が追加されていたり、フィルタリングについても今まではログレベルでのフィルタリングのみでしたが、ルールベースでのフィルタリングも可能になっています。
今回は、新たに追加されたルールベースでのフィルタリングについて確認したいと思います。
log_filter_internal で出力するログレベルの設定をするには、これまでと同様に log_error_verbosity パラメータを使用します。
手順としては、以下のような手順となります。
1. log_filter_dragnet コンポーネントをインストール
2. log_filter_dragnet を使用するよう設定
3. ルールの定義
それでは、各手順を確認していきます。
1. log_filter_dragnet コンポーネントをインストール
コンポーネントをインストールします。
1 2 |
mysql> INSTALL COMPONENT 'file://component_log_filter_dragnet'; Query OK, 0 rows affected (0.10 sec) |
インストールされたコンポーネントを確認します。
1 2 3 4 5 6 7 8 |
mysql> SELECT * FROM mysql.component; +--------------+--------------------+-------------------------------------+ | component_id | component_group_id | component_urn | +--------------+--------------------+-------------------------------------+ | 1 | 1 | file://component_validate_password | | 2 | 2 | file://component_log_filter_dragnet | +--------------+--------------------+-------------------------------------+ 2 rows in set (0.00 sec) |
file://component_log_filter_dragnet が存在する事が確認できました。
2. log_filter_dragnet を使用するよう設定
今回はデフォルトのログファイルにフィルタを適用する為、以下のように設定します。
1 2 |
mysql> SET PERSIST log_error_services = 'log_filter_dragnet; log_sink_internal'; Query OK, 0 rows affected (0.00 sec) |
※log_sink_internal はデフォルトのログWriterとなります。
設定を確認します。
1 2 3 4 5 6 7 |
mysql> SHOW GLOBAL VARIABLES LIKE 'log_error_services'; +--------------------+---------------------------------------+ | Variable_name | Value | +--------------------+---------------------------------------+ | log_error_services | log_filter_dragnet; log_sink_internal | +--------------------+---------------------------------------+ 1 row in set (0.01 sec) |
3. ルールの定義
log_filter_dragnet のデフォルト設定では、ログレベルがNote以上のログが出力されるので(log_error_verbosity=3 相当)、今回は以下のようなクライアントの認証時のエラーを出力しないように設定しようと思います。
1 |
2018-07-03T09:13:11.738546Z 11 [Note] [MY-010926] [Server] Access denied for user 'test'@'localhost' (using password: YES) |
ルール定義の構文については、以下にように定義します。
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」を指定して設定します。
1 2 |
mysql> SET PERSIST dragnet.log_error_filter_rules = 'IF err_code == 010926 THEN drop.'; Query OK, 0 rows affected, 1 warning (0.00 sec) |
※MySQL8.0より「SET PERSIST」構文が追加されています。「SET GLOBAL」では、サーバ再起動により設定情報が破棄されてしまいますが、「SET PERSIST」を使用した場合は、サーバを再起動しても設定情報が保持されます。
以下のようにエラーコードを設定する事もできます。
1 2 |
mysql> SET PERSIST dragnet.log_error_filter_rules = 'IF err_code == ER_ACCESS_DENIED_ERROR_WITH_PASSWORD THEN drop.'; Query OK, 0 rows affected, 1 warning (0.00 sec) |
1 warningが表示されていますが、
https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_dragnet.log_error_filter_rules
に記載されているように、ルール作成に成功するとNoteメッセージが生成されます。
1 2 3 4 5 6 7 |
mysql> SHOW WARNINGS; +-------+------+-------------------------------------------------------------------------------------------------------------+ | Level | Code | Message | +-------+------+-------------------------------------------------------------------------------------------------------------+ | Note | 3703 | filter configuration accepted: SET @@global.dragnet.log_error_filter_rules='IF err_code==10926 THEN drop.'; | +-------+------+-------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec) |
設定した内容を確認します。
1 2 3 4 5 6 7 |
mysql> SHOW GLOBAL VARIABLES LIKE 'dragnet.log_error_filter_rules'; +--------------------------------+----------------------------------------------------------------+ | Variable_name | Value | +--------------------------------+----------------------------------------------------------------+ | dragnet.log_error_filter_rules | IF err_code == ER_ACCESS_DENIED_ERROR_WITH_PASSWORD THEN drop. | +--------------------------------+----------------------------------------------------------------+ 1 row in set (0.00 sec) |
この設定によって、クライアントの認証エラーが発生した場合に、エラーメッセージが表示されない事が確認できました。
まとめ
上に記載のMySQLリファレンスを見ても、これまでのログレベル以外にも今回検証したエラーコード、さらにはクライアントホストやユーザ等によるフィルタリングも可能となっており、用途によってはログサイズの縮小化、ログ解析の効率化にも役立ってくれそうです。