イベント ログを自動アーカイブする設定を行うと、アーカイブされたイベント ログのファイルがだんだん溜まっていく状態になるので、アーカイブ ファイルが作成されてから一定期間経過後に自動的に削除するように設定してみました。その方法を忘れないうちに φ(..)メモメモ
まずは、自動アーカイブを行う設定方法。
@IT の「イベント・ログを自動アーカイブで長期間保存する」を参照。
UNIX 系だとローテート設定しておけば、一定期間でログファイルの切り替えが行われ、バックアップ ファイルの数は一定数で抑えられるが、イベントログの自動アーカイブ機能は、切り替えのトリガーはファイル容量のみで、アーカイブ ファイルは無限に増える。
なお、トリガーがファイル容量を超えた時点となっているため、容量制限の設定時に既存ファイルの容量が制限値を超えている場合には、アーカイブ機能が起動しない。また、新たな容量制限の設定値は、再起動後に読み込まれるので注意。
次に、一定期間経過後のアーカイブ ファイルの自動削除の方法。
一定期間経過後のアーカイブ ファイルを削除するスクリプトを作成し、タスク スケジューラで自動実行させる。
スクリプトは「イベントログのアーカイブと削除」が参考になるが、実行結果をイベント ログに出すようにしたいので、変更を行った。
なお、PowerShell のスクリプト ファイルの編集は、Windows PowerShell ISE を利用するのが楽。
#requires -version 2.0
function RemoveFiles([string]$strPath, [int]$intTerm)
{
$dt = (Get-Date).AddDays($intTerm * -1)
try {
$processed = 0;
foreach ($file in Get-ChildItem $strPath |
Where-Object { $_.LastWriteTime.CompareTo($dt) -lt 0 }) {
#Write-Output $file
$file.Delete()
$processed++
}
WriteLog "Information" ($processed, " 個のアーカイブ ファイルを削除しました。")
} catch [UnauthorizedAccessException] {
WriteLog "Error" "管理者権限が無いため、ファイルを削除できませんでした。"
}
}
function WriteLog([string]$category, [string]$message)
{
Write-Eventlog -LogName Application -Source RmEvtLog -EventId 1 -EntryType $category -Message $message
}
WriteLog "Information" "RmEvtLog Start."
RemoveFiles "C:\Windows\System32\winevt\Logs\Archive-*.evtx" 90
WriteLog "Information" "RmEvtLog End."
経過日数は90日にしている。
このスクリプトを C:\bin\PSScript\RmEvtLog.ps1 として保存。
イベント ログにメッセージを書き出すようにしているので、イベント ソースの登録が必要になる。存在しないイベント ソースを指定して書き出すと、当該ログに次に様なメッセージが付加されてしまう。
ソース "「イベント ソースの名称」" からのイベント ID 「指定したID」 の説明が見つかりません。このイベントを発生させるコンポーネントがローカル コンピューターにインストールされていないか、インストールが壊れています。ローカル コンピューターにコンポーネントをインストールするか、コンポーネントを修復してください。 イベントが別のコンピューターから発生している場合、イベントと共に表示情報を保存する必要があります。 イベントには次の情報が含まれています:
イベント ソースは次のコマンド レットを実行することで作成できる(イベント ソースの作成・削除を行うには、PowerShell を管理者権限で実行しておく必要がある)。
New-EventLog -LogName 「イベント ログ名」 -Source 「イベントソース名」
C:\bin\PSScript\RmEvtLog.ps1 の実行に必要なイベント ソースの作成を行うコマンドは次のとおり。
New-EventLog -LogName Application -Source RmEvtLog
ちなみに、イベント ソースの削除は次のコマンド レットを実行することで行える。
Remove-EventLog -LogName 「イベント ログ名」 -Source 「イベントソース名」
最後に、タスク スケジューラへの登録。
コントロールパネルの管理ツールからタスク スケジューラを起動。
左側のコンソール ツリーに表示されている「タスク スケジューラ ライブラリ」を選択し、操作ウィンドウの「タスクの作成」をクリック。
「全般」タブ
名前: イベントログ アーカイブの削除
説明: 一定期間が経過したイベントログのアーカイブ ファイルを削除します。C:\bin\PSScript\RmEvtLog.ps1 を起動します。
セキュリティ オプション: [ユーザーがログインしているかどうかにかかわらず実行する] 及び [最上位の特権で実行する]
「トリガー」タブ
新規ボタンをクリックし、タスクの開始: [スタートアップ時]を選択
「操作」タブ
新規ボタンをクリックし、設定のプログラム/スクリプト: %SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe、引数の追加: -c C:\bin\PSScript\RmEvtLog.ps1
を設定して作成。
これで、システムの起動時にスクリプトが実行され、イベント ビューアーで Windows ログのアプリケーションを見ることで実行状況を確認することができる。