ライン

ポイント:イベントログにローテーション機能がない

ライン

 はじめに

Windows XP/2003

 Windowsログとは、マイクロソフトのシステムログともいわれていて、FreeBSDやLinuxでいうシスログに相当するものです。
個人的には満足のいくものではないものなのですが、OSがリリースされてきていても、あまり満足にいくものにはなっていないようです。
(IMEやサウンドなど、満足できていないものは多いのです)
※Windows VistaやServer 2008では、多少改善されているみたいです

 不満点として、
・イベントログの情報を他のマシンにsyslog転送のように送ることはできない(※XPまでは)
・ログのローテートすることができない
・出力される1行の出力中に平気で改行コードが含まれていたりすることがある
 など、そんなに大変そうでもないことがそのままでした。

 今回利用するツールは、マイクロソフトより提供されている eventquery.vbs という VBスクリプトです。
Windows XPやServer 2003には標準で提供されています。
 これを利用してなんとか実現できた内容について備忘録を残すことにしました。

※※本ページではこれを使った内容を備忘録としてメモを置いておくことにしました※※
 毎度でお約束みたいなものですが、念のために。本ページに書かれている内容を鵜呑みにして、利用して。発生したなど、いかなる損害も一切の責任を負いませんので自己責任において参照ください。

 イベントログの自動ローテートを実現

イベントログ

 Windows XP/Server 2003では、システムのログとしてWindows ログを出力しています。通常イベントログと呼ばれるものです。
アプリケーション、セキュリティ、システムのように分かれています。

 前日の分のイベントログをスケジュールとして自動的にログ保存用のディレクトリにたまっていくように作成することにします。
Windows XPでもWindows Server 2003でも設定方法は同様です。
 以下、スクリプトは、それぞれの出典元のものを組み合わせて動作させた内容です。

@echo off
      rem
      rem 2008-11- 9 イベントログの定期バックアップのバッチファイル
      rem [修正履歴]
      rem 2008-11- 9 初期のバージョン
      
      rem 前日日付算出
      rem 参照: http://www.atmarkit.co.jp/fwin2k/win2ktips/419batchdate/batchdate.html
      rem バッチ・ファイル中で日付をファイル名に使用する − @IT
      
set yy=%date:~0,4%
set mm=%date:~5,2%
set dd=%date:~8,2%
set /a dd=%dd%-1
set dd=00%dd%
set dd=%dd:~-2%
set /a ymod=%yy% %% 4
if %dd%==00 (
if %mm%==01 (set mm=12&& set dd=31&& set /a yy=%yy%-1)
if %mm%==02 (set mm=01&& set dd=31)
if %mm%==03 (set mm=02&& set dd=28&& if %ymod%==0 (set dd=29))
if %mm%==04 (set mm=03&& set dd=31)
if %mm%==05 (set mm=04&& set dd=30)
if %mm%==06 (set mm=05&& set dd=31)
if %mm%==07 (set mm=06&& set dd=30)
if %mm%==08 (set mm=07&& set dd=31)
if %mm%==09 (set mm=08&& set dd=31)
if %mm%==10 (set mm=09&& set dd=30)
if %mm%==11 (set mm=10&& set dd=31)
if %mm%==12 (set mm=11&& set dd=30) ) set i-DATE=%yy%%mm%%dd% rem rem イベントログのCSV出力 rem 参照: http://technet2.microsoft.com/WindowsServer/ja/library/68672494-7700-4cbf-8392-4b6ef87b87491041.mspx?mfr=true rem Eventquery.vbs - Microsoft TechNet rem Eventquery.vbs rem /v 詳細 rem /l イベントログの種類指定 rem /fo フォーマット形式指定 rem /fi 条件を指定 rem /nh ヘッダーなし rem 例 rem cscript c:\windows\system32\eventquery.vbs /v /l system /fo csv /fi "Datetime eq 11/01/2008,12:00:00AM-11/07/2008,11:59:59PM" > YYMMDD_SYSTEM.csv rem cscript は絶対パス指定が必要 rem システムログを詳細に取得 rem CSV形式で出力 rem 条件式は11/1〜11/7まで rem ファイルは、日付.csv rem 残っている問題 rem 1. 詳細に制御コード(改行など)が入っていることが良くあるので、CSVとして壊れることがある rem 2.出力された結果がソートされていないので使いにくい。MSのツールにまともなsortがない rem 3.日付で 08 09は 8 9 として処理しないとおかしくなる
cscript c:\windows\system32\eventquery.vbs /v /l system /fo csv /fi "Datetime eq %mm%/%dd%/%yy%,12:00:00AM-%mm%/%dd%/%yy%,11:59:59PM" > c:\temp\%i-DATE%_system_eventlog.csv

 上記をスケジュールとして定時実行(tasks)して、ログが作成されていることを確認。
問題がなければ出力するディレクトリを正式なものと差し変えます。

 DOS窓より、

schtasks /create /sc DATE /MO 1 /TN EVENTLOG_BACKUP /ST 00:01 /TR c:\eventlog_everydaysave.bat

などのように登録して実施。(tasksに加わっています)

SCHTASKS /Query

でも確認することができます。
 以下の章の内容も加える場合には、同バッチファイルの最後に1行を追加して実行されるようにする必要があります。

イベントログのバックアップとクリア

 イベントログの中身がずっと残りっぱなしの状態で、ローテートしないままなのも残念なので、バックアップ後にクリアするようなスクリプトを探して組み合わせてみました。出典元は、中に記述してあります。

' イベントログをバックアップし、完了後にクリアするスクリプト
' 参考ページ
' http://www.wisesoft.co.uk/Scripts/vbscript_backup_and_clear_an_event_log.aspx

 strComputer = "."
 Set objWMIService = GetObject("winmgmts:" _
   & "{impersonationLevel=impersonate,(Backup)}!\\" & _
       strComputer & "\root\cimv2")

' 日付編集
 Dim nowDate,monthString,dayString,BackupFileName,strMessage
 nowDate = Date
 monthString = Month(nowDate)
 IF Len(monthString)<2 THEN
  monthString = "0" & monthString
 END IF
 dayString = Day(nowDate)
 IF Len(dayString)<2 THEN
  dayString = "0" & dayString
 END IF

' イベントログ書き込み用
' Constants for type of event log entry
' 参考 http://www.wisesoft.co.uk/scripts/vbscript_write_to_the_event_log.aspx
 const EVENTLOG_SUCCESS = 0
 const EVENTLOG_ERROR = 1
 const EVENTLOG_WARNING = 2
 const EVENTLOG_INFORMATION = 4
 const EVENTLOG_AUDIT_SUCCESS = 8
 const EVENTLOG_AUDIT_FAILURE = 16

 set objShell = CreateObject("WScript.Shell")

' アプリケーション
 Set colLogFiles = objWMIService.ExecQuery _
   ("Select * from Win32_NTEventLogFile where LogFileName='Application'")
 BackupFileName = "c:\\backup_log\\application_" & Year(nowDate) & monthString & dayString & ".evt"
 For Each objLogfile in colLogFiles

 errBackupLog = objLogFile.BackupEventLog(BackupFileName)
 If errBackupLog <> 0 Then
     Wscript.Echo "The Application event log could not be backed up.(Application)"
 Else
     objLogFile.ClearEventLog()
     strMessage = "clearebentlog: バックアップを実行しました(Application)"
     objShell.LogEvent EVENTLOG_INFORMATION, strMessage
 End If
 Next


' セキュリティ
 Set colLogFiles = objWMIService.ExecQuery _
   ("Select * from Win32_NTEventLogFile where LogFileName='Security'")
 BackupFileName = "c:\\backup_log\\security_" & Year(nowDate) & monthString & dayString & ".evt"
 For Each objLogfile in colLogFiles

 errBackupLog = objLogFile.BackupEventLog(BackupFileName)
 If errBackupLog <> 0 Then
     Wscript.Echo "The Application event log could not be backed up.(Security)"
 Else
     objLogFile.ClearEventLog()
     strMessage = "clearebentlog: バックアップを実行しました(Security)"
     objShell.LogEvent EVENTLOG_INFORMATION, strMessage
 End If
 Next

' システム
 Set colLogFiles = objWMIService.ExecQuery _
   ("Select * from Win32_NTEventLogFile where LogFileName='System'")
      BackupFileName = "c:\\backup_log\\system_" & Year(nowDate)
      & monthString & dayString & ".evt"
 For Each objLogfile in colLogFiles

 errBackupLog = objLogFile.BackupEventLog(BackupFileName)
 If errBackupLog <> 0 Then
     Wscript.Echo "The Application event log could not be backed up.(System)"
 Else
     objLogFile.ClearEventLog()
     strMessage = "clearebentlog: バックアップを実行しました(System)"
     objShell.LogEvent EVENTLOG_INFORMATION, strMessage
 End If
      Next

このスクリプトを cleareventlog.vbs として c:\windows に置く場合、上記の章の最後に

cscript c:\windows\cleareventlog.vbs

のように加えることで、バックアップとクリアを実施できるようになります。
上記では、リテラルに c:\backup_log という ディレクトリが前提になっている形で書かれていますが、それぞれの環境に合わせて修正して使ってください。

【改訂履歴】作成:2008/10/23
2009/06/12 … Namazu検索の窓を追加

【参考リンク】

デル株式会社

Copyright © 1996,1997-2006,2007- by F.Kimura,