はじめに
データのバックアップなどで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 | |
---|---|---|---|---|---|---|
ディレクトリ | 1 | 0 | 1 | 0 | 0 | 0 |
ファイル | 2 | 2 | 0 | 0 | 0 | 0 |
今回は「失敗」のカウントを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
アラートを検知できました。
コメント