PowerShellでtail(※)ができるのを知っていますか?それを利用して今回はログファイルのエラー監視を作ってみました。
※tailは新規でログに書き込まれた際、表示してくれる機能。Linux系では標準実装されており、WindowsのPowerShellもVer3から実装されています。
PowerShellでログ監視を行う
まずはソースから。
イベントログにログソース名を登録
初回のみ、以下のコマンドを実行しイベントログのログソース名を作成します。
1 |
New-EventLog -LogName Application -Source LogKanshi |
ApplicationをSystemに変えればシステムログに出力できます。
LogKanshiがログソース部分です。
PowerShellのログ監視ソース
test.logを監視し、特定の文言(ここではAlert Keyword)が含まれていたらイベントログにエラーを出力します。
1 |
Get-Content -Path "C:\work\test.log" -Wait -Tail 0 | ForEach-Object { If($_ -like "*Alert Keyword*") { Write-EventLog -LogName Application -Source LogKanshi -EventID 999 -EntryType Error -Message "エラー(TEST)が発生しました" } } |
ソース解説
覚え書きとしてソース解説しておきます。
Get-Content -Path "C:\work\test.log" -Wait -Tail 0
監視対象のログファイル指定と、tailコマンド。tail 0は最終行から0行目を意味する。0を10にすると最終行から10行目まで遡って読み込みます。
ForEach-Object { If($_ -like "*Alert Keyword*")
監視対象のキーワードを指定。すべてのログを監視することはあまり無いかなと。インフォメーションのログ系はチェックしませんよね?
{ Write-EventLog -LogName Application -Source LogKanshi -EventID 999 -EntryType Error -Message "エラー(TEST)が発生しました" } }
イベントログに出力させる。文言などは適宜変更が可能。
作成した経緯
過去にVBSでファイルのエラーログ監視を作ったことがありますが、こんなデメリットがありました。
- 500ステップぐらいになった
- ソースが僕しか読めない
- リアルタイムでの監視ができない
※タスク管理で5分毎監視など
応用:関数化して別の処理も
イベントログだけでなく、関数を呼び出して引数としてログの内容を渡すことも可能です。
1 |
Get-Content -Path "C:\work\test.log" -Wait -Tail 0 | ForEach-Object { If($_ -like "*Alert Keyword*") { $outer=$_; fncDataCheck $_ } } |
$outer=$ はネストを2段階にすると $_ が使えないから。一旦変数に入れるとネスト後の関数呼び出し部で $_ が使えるようになる。
ややこしいので、もっと良い方法があれば教えてください。
著作権について
著作権は当サイトの管理者に帰属します。
商用利用以外であれば著作権フリーですが、念のためコメントにてお知らせください。