またまた狭い話だが。
Webサーバー上の CGIファイルを ローカルでテストするための環境 xampp で Apacheというサーバーアプリを実行しているが、php/perl などのスクリプトがエラーを吐くと Apacheのエラーログにその内容が記録される。しかしこのエラーログはデフォルトではずっと消えないで追加されていくので、いつの間にか 数百MB以上に膨れてしまう。エラーログも流石に 数百MBになると、テキストエディタで開くのに若干の時間がかかって嬉しくないし、新しいエラーは最後に追加されるのでスクロールするのが面倒だ。
Web情報では Apacheの標準で httpd.confファイルの ErrorLog "logs/error.log" に替えて
ErrorLog "| bin/rotatelogs.exe logs/error_%Y%m0.log 86400"などとすれば定期的にローテートして小さなサイズのまま運用できるとなっているが、何故か書いてあるとおりには動作せず、Apacheが起動できなくなったり新しいエラーの記録が追加されなかったり。Apacheのバージョンや環境による違いなのか? 深追いするとケガをしそうだ。
そこで一計を案じて、例えば Windowsにログオンしたとき、エラーログが 100行以上だったら最後の 100行を残して残りは捨ててしまうような PowerShellスクリプトを考えてみた。
$filePath = "C:\xampp\Apache\logs\error.log"
$readstr = Get-Content $filePath -Tail 100
$readstr | Out-File $filePath
このスクリプトを .ps1という拡張子で保存し、それを Windowsのタスクスケジューラでログオン時に新規タスクを実行するように 「操作」タブの「プログラムの開始」を
%Systemroot%\System32\WindowsPowerShell\v1.0\powershell.exe引数を
-ExcecutionPolicy RemoteSigned <.ps1スクリプトのパス>などとしたら上記のようにわずか 3行で目的は達せられた。 2行目と 3行めをいきなりパイブでつなぐことも可能かな?と思ったが、読み込みと書き出しが同時ではダメだろうと思いつつも、試してみた限りやはり 出力ファイルは 0byteで空だった。パイプでは読み込みつつ同じファイルに書き出すことになるので、一旦メモリに読み込んでから処理する必要があるということだろう。PowerShellで「読み書きモード」で検索してみたが見つけられなかったので上記のまま運用中。但し、このままだとスクリプトを実行したとき、PowerShellの青い実行ウインドウが開いたままになりカッコ悪い。
その後 機能拡張して本格運用