Zabbixでrobocopyコマンドのログファイルを監視する方法

スポンサーリンク

はじめに

データのバックアップなどでrobocopyコマンドを使用することがあります。robocopyコマンドはオプションを指定することでログファイルを書き出すことができます。

以下はrobocopyコマンドを使用したデータコピーのバッチファイルです。

@ECHO OFF

set Robo_Source="C:\temp\test1"
set Robo_Destination="C:\temp\test2"
set Robo_Log="C:\temp\log\robocopy_%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%%time:~6,2%.txt"

robocopy %Robo_Source% %Robo_Destination% /UNILOG:%Robo_Log%

書き出されたログファイルの中身です。

-------------------------------------------------------------------------------
   ROBOCOPY     ::     Windows の堅牢性の高いファイル コピー                              
-------------------------------------------------------------------------------

  開始: 2022年5月21日 6:03:14
   コピー元 : C:\temp\test1\
     コピー先 : C:\temp\test2\

    ファイル: *.*
	    
  オプション: *.* /DCOPY:DA /COPY:DAT /R:1000000 /W:30 

------------------------------------------------------------------------------

	                   2	C:\temp\test1\

------------------------------------------------------------------------------

                  合計     コピー済み      スキップ       不一致        失敗    Extras
   ディレクトリ:         1         0         1         0         0         0
     ファイル:         2         0         2         0         0         0
      バイト:        10         0        10         0         0         0
       時刻:   0:00:00   0:00:00                       0:00:00   0:00:00
   終了: 2022年5月21日 6:03:14

ログファイルの最後に結果がまとめられています。

 合計コピー済みスキップ不一致失敗Extras
ディレクトリ101000
ファイル220000

今回は「失敗」のカウントをZabbixで監視することにします。赤字の部分です。

Zabbixの環境

Zabbixサーバ

OS:CentOS 7.8
Apache:2.4.6
PHP:7.2.32
MySQL:8.0.21
Zabbix Server:4.0.23
Zabbix Agent:4.0.23

検証サーバ

OS:Windows Server2019

Zabbixの設定

ホストの登録

最初にホストを作成します。

ホスト名Windows2019-1(任意に指定)
グループWindows Servers
エージェントのインターフェースサーバのIPアドレス

アイテムの作成

名前RoboCopy_ディレクトリ_失敗(任意に指定)
タイプZabbixエージェント(アクティブ)
キーlogrt["C:\temp\log\^robocopy_[0-9]{8}_.[0-9]{5}.txt$","ディレクトリ: {1,}([0-9]{1,}) {1,}([0-9]{1,}) {1,}([0-9]{1,}) {1,}([0-9]{1,}) {1,}([0-9]{1,}) {1,}([0-9]{1,})",utf-16,,skip,\5,,]
データ型数値(整数)
監視間隔1h(任意に指定)
アプリケーションLog(任意に指定)

ここでのポイントはキーの部分です。データコピーのバッチファイルは1時間ごとに実行されてログファイルが作成されます。

robocopy_20220601_ 90000.txt
robocopy_20220601_100000.txt
robocopy_20220601_110000.txt
・・・

そのため、logrtで可変のファイル名を正規表現を使って読み込みます。
"C:\temp\log\^robocopy_[0-9]{8}_.[0-9]{5}.txt$"

時間の部分ですが、AM9:00は「09」とならずに「 9」(半角スペースと9)になるので .[0-9]{5}にしています。

「.txt」のピリオドは、正規表現の記号です。文字列と正規表現の記号が混在しているのでしっかり区別できることが必要です。

ログファイルから任意の値を取得します。まずディレクトリの失敗した値を取得します。
ディレクトリ: {1,}([0-9]{1,}) {1,}([0-9]{1,}) {1,}([0-9]{1,}) {1,}([0-9]{1,}) {1,}([0-9]{1,}) {1,}([0-9]{1,})

正規表現を見慣れていないと意味不明だと思いますが、それぞれの意味がわかれば簡単です。

項目説明
{1,}頭に半角スペースあり。
つまり半角スペースが1つ以上あるという意味です。
[0-9]0から9のいずれか
([0-9]{1,})0から9のいずれかが1桁以上あるという意味です。

これがわかれば正規表現で以下の部分を抽出していることが理解できると思います。

   ディレクトリ:         1         0         1         0         0         0

残りの「utf-16,,skip,\5,,」についてです。

utf-16はエンコードです。robocopyコマンドでログを書き出すとエンコードは「utf-16」になります。skipは新規に作成されたログから監視することを指定しています。\5は正規表現で5番目の値を取得します。括弧()の5番目なので失敗の値を指定しています。

ファイル失敗のアイテムも同様に作成しましょう。

名前RoboCopy_ファイル_失敗(任意に指定)
タイプZabbixエージェント(アクティブ)
キーlogrt["C:\temp\log\^robocopy_[0-9]{8}_.[0-9]{5}.txt$","ファイル: {1,}([0-9]{1,}) {1,}([0-9]{1,}) {1,}([0-9]{1,}) {1,}([0-9]{1,}) {1,}([0-9]{1,}) {1,}([0-9]{1,})",utf-16,,skip,\5,,]
データ型数値(整数)
監視間隔1h(任意に指定)
アプリケーションLog(任意に指定)

トリガーの作成

名前RoboCopy_ディレクトリ_失敗
深刻度軽度の障害(任意に指定)
条件式{Windows2019-1:logrt["C:\temp\log\^robocopy_[0-9]{8}_.[0-9]{5}.txt$","ディレクトリ: {1,}([0-9]{1,}) {1,}([0-9]{1,}) {1,}([0-9]{1,}) {1,}([0-9]{1,}) {1,}([0-9]{1,}) {1,}([0-9]{1,})",utf-16,,skip,\5,,].last()}<>0
正常イベントの生成条件式
障害イベント生成モード単一
正常時のイベントクローズすべての障害
手動クローズを許可チェックを入れる

条件式がポイントになりますが、0以外であればアラートを上げるようにします。

ファイル失敗のアイテムも同様に作成しましょう。

名前RoboCopy_ファイル_失敗
深刻度軽度の障害(任意に指定)
条件式{Windows2019-1:logrt["C:\temp\log\^robocopy_[0-9]{8}_.[0-9]{5}.txt$","ファイル: {1,}([0-9]{1,}) {1,}([0-9]{1,}) {1,}([0-9]{1,}) {1,}([0-9]{1,}) {1,}([0-9]{1,}) {1,}([0-9]{1,})",utf-16,,skip,\5,,].last()}<>0
正常イベントの生成条件式
障害イベント生成モード単一
正常時のイベントクローズすべての障害
手動クローズを許可チェックを入れる

動作確認

ログファイルのディレクトリとファイルの失敗部分の数字を修正します。
ディレクトリ失敗:0→1
ファイル失敗:0→100

アラートを検知できました。

コメント