はじめに
本記事は、WindowsのPowerShellを用いて、アプリケーションが出力するログファイルを監視する方法について記載しています。また、特定のエラーメッセージ検知時にWebhookを使用してチャットアプリに通知します。
監視対象とするログファイルは、Cドライブ配下などに出力するテキストのログファイルを対象とします。
Windoows Serverで監視ソフトウェアを導入することなく、特定のメッセージを検知時に通知したいといった小規模な監視が実現できます。
Webhook
slackやRocket.Chatなどのチャットアプリは、Webhookとしてcurlを使用する場合がほとんどです。
通知の仕組みを作る考え方として、連携したいチャットアプリがSDK等を公開していて、Pythonなどのライブラリを使用できるのであれば、Pythonで書いた方がスマートな場合もあります。本記事では、WindowsでWebhookを使用するための方法を前提とします。
現在は、WSL(Windows Subsystem for Linux)という便利なものがあるので、WSLが使用できる環境であれば、WSLも一つの案だと思います。なお、Windows Server 2016では、Insider Preview build 16215以降に搭載されています。
要約するとWindows ServerでWebhookを使用するためには、curlが必要です。
curlを使用するために、curlから64bitのbinaryをダウンロードします。Providerは、特に理由がなければ「the curl project」でいいでしょう。
PowerShell
Powershellでログ監視の設定を行います。以下の例は、testフォルダ配下のtest.txtファイルに、ERRORの文字列が出力された場合、curl.batを起動してWebhookと連携します。
- powershell.ps1
Get-Content -Path "C:\Users\test\Desktop\test\test.txt" -Wait -Tail 0 | ForEach-Object { If($_ -like "*ERROR*") { Start-Process -FilePath "C:\Users\test\Desktop\test\curl.bat" } }
batファイルでは、Webhookを使用するたにcurlの処理(※)を書きます。Windowsでcurlを使う場合のポイントは、文字列を適切にダブルクォーテーションの引用符でくくることです。また、引用符の中で引用符を使用する場合はエスケープを行います。日本語をメッセージとして出力させたい場合は別途、考慮が必要です。以下の場合、チャットアプリにERRORの文字列を通知します。
(※)例としてcurlのあるフォルダに移動して実行しています。
- curl.bat
@echo off
cd C:\Users\test\Desktop\
curl-7.66.0-win64-mingw\bin\curl --request POST --header "Content-Type: application/json" --data "{\"text\":\"ERROR\"}" <WebhookのURL>
おわりに
上記、powershell.ps1とcurl.batファイルを配備し、powershell.ps1を実行すれば監視が始まります。Windoows Serverでちょっとした監視がしたいという場合に便利です。