【Windows】PowerShellでログ監視
システム開発や環境運用で必ず見る機会があるであろうログファイル。
動作確認や調査を行う際は、出力されたログをリアルタイムに確認していくことも多いと思います。
Linux定番のtailコマンドや、Windowsでも同様の出力ができる技について紹介します。
ログファイルの確認とは
システム開発、環境運用の場ではログ確認は必須のスキルです。
正常に動作しているとすれば、その経過を確認できますし、エラーが出たとすれば、どこでどんなエラーが発生しているかが分かります。
何かがあった時に、いつから何が起きていたのか、を把握できるログはとても重要です。
何か障害があってエラーログを見たとき、まれに何の手掛かりもないじゃん!ということも、あったりします…。
ログにどういうエラーを出力させるか、ということはとても重要なのですが、それはまた別のお話ということで。
結果のログから様々な情報を探す場面があるのと同じくらい、今まさに出力されているログをリアルタイムに監視する場面も、往々にしてあると思います。
しかし、ログファイルを開きっぱなしにしていては、競合が発生してシステム側で必要なログの書き込みが出来ない、という状況が発生します。
一方、書き込みを邪魔しないよう別の場所にファイルをコピーして開きなおす、なんてことは手間もかかるし現実的には難しいでしょう。
そんな、ファイルの監視に便利なコマンドを紹介します。
Linuxのtailコマンド
様々なサーバーで利用されているLinux系のOSであれば、tailコマンドがあります。
tail ファイルパス
tailは指定したファイルの末尾数行を表示するコマンドです。
オプション指定がなければ、ただ単に表示しただけで終わってしまいますが、非常に便利なオプションがあります。
tail -f ファイルパス
とすると、コマンド実行後はプロンプトに戻らず待機状態となり、指定したファイルを監視して、追記があればそれを表示してくれます。
そのため、上記オプション付きで動作中のシステムのログファイルを指定すれば、何かしらログに追記があれば常にそれを確認することができます。
必要なファイル分のコマンドプロンプトを立ち上げて、各ファイルをtailコマンドで監視することで、様々なログを同時に見ることも可能です。
WindowsのGet-Contentコマンド
シンプルで便利なtailコマンドですが、残念ながらWindowsにはtailコマンドがありません。
とはいえ、Windowsでログの監視が出来ないかというと、そんなことはありません。
PowerShellのGet-Contentコマンドレットで同様の監視をすることができます。
Get-Content -Wait -Tail 行数 -Path ファイルパス
Get-Contentは指定した場所の内容を取得します。
Linuxのtail同様、パラメータ指定をしなければただ表示して終わりですが、パラメータを指定して実行することでログ監視が可能です。
Waitパラメータを指定することで待機状態になるため、新たにログが追記されるとその内容が表示されるようになります。
またTailパラメータを指定することで最初に表示する行数を制御できます。必須ではないのですが、指定しておかないとファイルの内容をすべて表示しようとするので、予め適当な行数を指定しておくのが安全でしょう。
終了する時は[Ctrl]+[C]キーを押します。
Wait指定時の挙動
上記のようにしてログ監視はできますが、Wait指定時の挙動を把握しておかないと「あれ?」と思うことがあるので、少し捕捉します。
反映タイミングに注意
Get-Contentは指定したファイルの内容を表示してくれますが、Wait指定をした際、出力に反映するのはファイルが保存されたタイミングとなります。
ログファイルであれば、通常はプログラム上から書き込まれるのであまり気にすることは無いと思いますが、書き込み途中で保存されていない状態の内容は表示されません。
出力に反映しないときに注意
実は、ファイルサイズに変更がない場合、変更内容は出力に反映されません。
例えばある行(部分)が一度削除されて異なる内容に書き換わったとしても、結果的に変更前と同じファイルサイズで保存された場合、Wait指定ではファイルの変更に気づくことが出来ず、出力に反映しないのです。
通常のログファイルであれば、中身を書き換えることは無いので実害は無いのですが、例えば設定ファイルの書き換えなど、同じ場所を変更するような処理を拾おうとした場合はうまく拾えないことがあるので注意しましょう。
出力単位に注意
基本的には取得した内容をそのまま出力しますが、必ずしも、ファイルの内容と同じ表示になるとは限りません。先述したファイル保存のタイミングにも影響されます。
上記のようなファイルをGet-Contentで出力してみます。
これは想定通りです。
次に、改行なしで追記をして上書き保存してみます。
“log”を追記してみました。
変更した部分だけが新たに出力されました。
出力時に改行を伴うため、ファイルの内容とは若干異なった表示となります。
では、更に改行して”test”を追記してみます。
改行も含めて変更した部分が出力されたため、空行が入ってしまいました。
では、”test”を削除して上書き保存してみます。
ファイルサイズが減った場合は、(なんと)対象ファイルの内容が最初から再表示されます。
一般的なログファイルであれば追記されていく一方なので、内容が減ることは無いと思いますが…。
まとめ
PowerShellのGet-Contentによるログ監視について解説しました。
稼働環境はLinuxサーバー上でも、開発はWindows環境ということはよくあると思います。
そんな時でもGet-Contentを活用することでログチェックができますので、有効に使用しましょう。