VBScriptを「使い捨て」から「堅牢な運用基盤」へ:ログローテーション・モジュールの極意
こんにちは。自動化の現場でVBScriptと長年戦い続けてきたエンジニアです。
VBScriptは、今やレガシーな言語と思われがちです。しかし、Windows環境であれば「追加インストールなしで即座に動く」という唯一無二の武器を持っています。多くの人が「とりあえず動くコード」を書いて終わらせてしまう中、「長期運用に耐えうる堅牢なアーキテクチャ」を組み込めるかどうか。それが、ただのスクリプトキディと、真の自動化エンジニアの境界線です。
今回は、長期運用ツールの最大の敵である「ログファイルの肥大化」を撲滅する、VBScript専用のログローテーション・モジュールを一緒に作り上げましょう。
—
なぜ「ログローテーション」が必要なのか?
VBScriptで単純に `File.WriteLine` を繰り返すと、半年後には数GBのログファイルが誕生し、サーバーのディスク容量を圧迫してシステムが停止します。
今回目指すのは、以下の要件を満たすクラス構造です。
1. 日付によるローテーション:日付が変わったら新しいファイルを作成する。
2. サイズによるローテーション:ファイルが一定サイズ(例: 5MB)を超えたらリネームして退避する。
—
ロギングクラスの設計と実装
VBScriptには「クラス」という概念があります。これを使うことで、メインロジックを汚さずに「ログ書き込み」という機能をモジュール化できます。
‘ Logger.vbs – 堅牢なログ出力モジュール
Class Logger
Private fso, logFile, logPath, maxSize
‘ 初期化処理
Private Sub Class_Initialize
Set fso = CreateObject(“Scripting.FileSystemObject”)
maxSize = 5 1024 1024 ‘ 5MB制限
End Sub
‘ ログ出力のメインメソッド
Public Sub WriteLog(strMessage)
Dim filePath, fullPath
filePath = “app_” & Replace(Date, “/”, “”) & “.log”
‘ サイズチェックとローテーション処理
If fso.FileExists(filePath) Then
If fso.GetFile(filePath).Size > maxSize Then
‘ 現在のファイルを「日時_通し番号」でリネーム退避
fso.MoveFile filePath, “app_” & Replace(Date, “/”, “”) & “_” & Timer & “.log”
End If
End If
‘ ファイル書き込み(追記モード)
Set logFile = fso.OpenTextFile(filePath, 8, True)
logFile.WriteLine Now & ” : ” & strMessage
logFile.Close
End Sub
Private Sub Class_Terminate
Set fso = Nothing
End Sub
End Class
‘ — 利用サンプル —
Dim logger
Set logger = New Logger
logger.WriteLog “処理を開始します。”
—
コードの「魂」を解説する
1. `Scripting.FileSystemObject` のライフサイクル
VBScriptで最も重要なのは、FSO(FileSystemObject)の扱いです。頻繁に `CreateObject` を繰り返すとメモリリークの原因になります。今回の設計では、クラスの `Initialize` で一度だけインスタンス化し、`Terminate` で確実に破棄する設計にしています。これが「メモリを食わないスクリプト」の鉄則です。
2. ファイル書き込みモード「8」の意味
`fso.OpenTextFile` の第2引数に「8」を指定すると、「追記モード(Append)」になります。これを使わないと、毎回ファイルが上書きされてしまい、過去のログが消えてしまいます。初心者が見落としがちな重要ポイントです。
3. なぜ「日付」と「サイズ」の両方を見るのか?
単なる日付管理だけだと、その日に大量のデータが流れた瞬間にファイルが巨大化します。逆にサイズ管理だけだと、いつのログか分からなくなります。「日付でフォルダ分け、サイズで世代管理」が、現場で最もトラブルが少ない構成です。
—
陥りやすいエラーと対策
1. 「書き込み権限がありません」エラー
バッチファイル等で実行する場合、スクリプトが作成されたフォルダに書き込み権限がないことがほとんどです。実行するユーザーに、該当フォルダのフルコントロール権限を与えてください。
2. 「ファイルが使用中です」エラー
他のプロセスがログを掴んでいると発生します。`logFile.Close` を確実に実行し、ファイルへのロックを最小限にするのがポイントです。
—
まとめ:ここをクリアすれば「脱・初心者」
VBScriptを単なる「タスク自動化ツール」から「管理可能なシステム」へ昇格させるには、こうした「副作用をコントロールする仕組み」が不可欠です。
- クラス化する(再利用性を高める)
- リソースを解放する(メモリリークを防ぐ)
- 運用を想定した設計にする(ログ管理で詰まない)
この3点さえ押さえておけば、VBScriptはどんなに巨大な運用環境でも頼もしい相棒になります。ぜひ、あなたの現場のツールにこの「ロギングクラス」を組み込んでみてください。
「動けばいい」コードから「守れる」コードへ。あなたの自動化エンジニアとしての第一歩は、ここから始まります。応援していますよ!
