SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

SQL Server on Linux の syslog をフィルターして OMS に連携する

leave a comment

OMS では標準機能として、syslog の連携機能を持っています
Log Analytics の Syslog データ ソース

上記のドキュメントに、次のように記載されているとおり、ファシリティ (Facility)と重要度 (Sevirity) で取得対象をフィルタすることができるようになっています。

OMS Agent for Linux は、構成で指定されているファシリティと重大度を持つイベントだけを収集します。 OMS ポータルを通じて、または Linux エージェントで構成ファイルを管理することによって、Syslog を構成できます。

image

Windows の場合、SQL Server 系のログがイベントログに出力されます。
Linux の場合は、syslog に出力されますので、syslog 経由でエラーの発生状況を監視することになるかと。

SQL Server on Linux の syslog を OMS に連携してみる で記載しましたが、SQL Server の syslog の出力は [daemon.info]として出力されます。
image

 

OMS の syslog 連携については、「/etc/rsyslog.d/95-omsagent.conf」として、構成ファイルが連携されてきます。
image

OMS Agent の syslog の連携用ポートとしてリスニングしている TCP:25224 に対して連携をする構成ファイルが生成されていますね。

この状態ですと、シンプルなフィルターのみとなっていますので「systemctl restart mssql-server」で SQL Server を再起動した際に出力されている ERRORLOG の内容についてもすべて、 OMS に連携されることになります。
image

監視で OMS を使用する場合、syslog に出力されたすべての SQL Server の情報ではなく、Error の情報のみを連携したいというニーズが出てくるかと思います。
そのような場合には、OMS 標準の syslog のフィルターではなく、自分で syslog の設定を記載する必要が出てくるかと。

今回は次のような構成ファイルを「99-sql.conf」として作成をしてみました。

if ($programname == 'sqlservr') then {
    action(type="omfile" file="/var/log/sql.log")
    if ($msg contains 'Error:') then {
        @127.0.0.1:25224
    }
}

SQL Server の syslog については、programname が「sqlservr」ですので、そのログについては、個別のログに出力し、さらにメッセージに「Error:」が出力されている場合には、OMS に連携するようにしています。

(Error: ではなく、Sevirity: 等でもフィルタリングできるかと思います。)

連携のテストについては logger コマンドを実行しすることで試すことができるかと。

logger -p daemon.info -t "sqlservr" "Error: Error Message"

このコマンドで出力したメッセージが OMS に連携され、SQL Server のサービスを再起動した際のメッセージについては連携されていないようでしたら、フィルターの設定が実行できています。

実際に SQL Server から出力されたメッセージが連携されるかは、バックアップを失敗させて取得してみるとよいかと。

存在しないデータベースに対しての BACKUP DATABASE はエラーとして記録されますので、バックアップの失敗を OMS を経由して実行することができるかを確認できます。

image

SQL Server から明示的な syslog への出力としては、「RAISERROR(N’Test Message’, 11,1) WITH LOG」というように RAISERROR を WITH LOG を指定して実行する方法もありますので、この方法を使用してのテストを実施してもよいかと。

SQL Server の syslog 連携の現状の問題点ですが、「日本語のメッセージが含まれていると、正常に連携されない」という問題があります。

例ですが、次のようなクエリを実行してみます。

RAISERROR(N'Test Message', 11,1) WITH LOG
RAISERROR(N'テスト メッセージ', 11,1) WITH LOG
RAISERROR(N'Test Message', 11,1) WITH LOG


「Test Message」というメッセージについては、正常に出力されるのですが、「テスト メッセージ」については正常に出力されません。

(実際には、日本語を含んだメッセージを出力した場合、次に、半角のみのメッセージを出力した場合、または、ある程度のメッセージが蓄積されたタイミングにまとめて出力され、日本語の情報が欠損している微妙な出力内容になります。)

image

RAISERROR のメッセージであれば、半角のみで構成すればよいのですが、それ以外のメッセージについては制御がちょっと面倒です。

システム系の処理については、使用するログインの言語の設定を「english」にしておいた方がよいかと思います。

インストールパラメーターで「MSSQL_LCID」を指定しない場合、言語設定は english となっていますが、それ以外の言語 (例 : MSSQL_LCID=1041) でインストールした場合、言語設定のデフォルトが「japanese」になるため、syslog への出力がうまくできないような状態になる可能性があります。

syslog に出力する必要のある処理を実行するログインについては、ログインの「既定の言語」の設定を「english」にしておくとよいかと。

image

Written by masayuki.ozawa

1月 21st, 2018 at 3:43 pm

Posted in SQL Server

Tagged with , ,

Leave a Reply

*