【実務・中級編】【ログローテーション】日付・サイズ指定に対応したVBScript専用のロギングモジュール自作手法 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

VBScriptで「ログの肥大化」を終わらせる:プロフェッショナルなローテーション設計術

業務自動化の現場において、VBScriptは「枯れた技術」として過小評価されがちだ。しかし、真のエンジニアは知っている。OS標準で動作し、追加インストール不要で、メモリ消費が極めて少ないVBScriptこそ、長期稼働するバックグラウンドタスクの「心臓部」に最適であることを。

だが、未熟な設計が引き起こす最大の悲劇が「ログファイルの無限肥大化」だ。ディスクを圧迫し、テキストエディタで開こうとしてOSがフリーズする――そんな「事故」は、エンジニアの恥である。

今日は、VBScriptで堅牢かつ保守性の高いログローテーションモジュールを構築する、プロフェッショナルなアプローチを伝授する。

1. なぜ「手抜きロガー」は失敗するのか

多くの初心者は、ログを単に `Scripting.FileSystemObject` の `OpenTextFile(…, 8)` で追記し続ける。これがなぜ危険か?

  • ディスクフルによるシステム停止: ログのサイズ管理がなされていないため、気づけば数GBのゴミが蓄積される。
  • ファイルロックの排他制御: 大規模ログを書き込んでいる最中に他プロセスがアクセスすると、アクセス拒否(800A0046)が発生する。
  • 運用性の欠如: 日付とサイズに基づくアーカイブがないため、障害発生時の切り分け(grep)が困難になる。

プロダクション環境では、「書き込み時のサイズ判定」「日付変更時の動的ファイル名生成」を、ロガー内部で完結させる必要がある。

2. 堅牢なロギングクラスの設計

以下のコードは、単なる関数ではない。「ログのライフサイクルを制御するクラス」だ。これをスクリプトの冒頭で初期化し、利用することで、メインロジックの可読性を劇的に向上させる。

‘ Loggerクラス定義
Class Logger
Private fso, logFile, logPath, maxBytes, currentLogName

‘ 初期化:ログディレクトリ、最大サイズ(バイト)、ファイル名プレフィックス
Public Sub Initialize(folderPath, maxFileBytes, prefix)
Set fso = CreateObject(“Scripting.FileSystemObject”)
If Not fso.FolderExists(folderPath) Then fso.CreateFolder(folderPath)

logPath = folderPath
maxBytes = maxFileBytes
currentLogName = prefix
RotateLog ‘ 初期化時にローテーションを確認
End Sub

‘ ログ書き込みメソッド
Public Sub WriteLog(msg)
RotateLog ‘ 書き込み前にサイズ・日付をチェック

Dim ts
Set ts = fso.OpenTextFile(GetFullPath(), 8, True)
ts.WriteLine Now & ” | ” & msg
ts.Close
End Sub

‘ 内部処理:ローテーションロジック
Private Sub RotateLog()
Dim path, file
path = GetFullPath()

If fso.FileExists(path) Then
Set file = fso.GetFile(path)
‘ サイズ超過または日付が変わっていたらリネーム
If file.Size > maxBytes Then
fso.MoveFile path, path & “.” & Replace(Replace(Replace(Now, “/”, “”), ” “, “_”), “:”, “”) & “.old”
End If
End If
End Sub

Private Function GetFullPath()
GetFullPath = logPath & “\” & currentLogName & “_” & Year(Date) & Right(“0” & Month(Date), 2) & Right(“0” & Day(Date), 2) & “.log”
End Function
End Class

‘ — 利用例 —
Dim myLog
Set myLog = New Logger
‘ ログフォルダ, 最大サイズ(1MB), ファイル名
myLog.Initialize “C:\Logs”, 1024 1024, “AutomationTask”

myLog.WriteLog “処理を開始します。”

3. この設計が「現場で選ばれる」理由

1. メモリ効率を意識した「追記型」

`ReadAll` で全ログを読み込んでから編集するような愚行はしていない。VBScriptの弱点であるメモリ管理を考慮し、必要な時だけファイルを開き、直ちに閉じる(Close)設計にしている。これにより、長時間稼働させてもメモリリークは発生しない。

2. ファイル名の正規化

`GetFullPath` 関数内で日付を連結しているため、ログファイルは自動的に「毎日切り替わる」仕様になっている。もしサイズ制限に達すれば、タイムスタンプを付与して退避させるため、ログが上書きされることもない。

3. 疎結合なモジュール設計

この `Logger` クラスは、どのスクリプトにコピーしてもそのまま動く。業務ロジックとログ出力ロジックを分離することは、将来的な保守性を担保する上での「エンジニアの倫理」である。

4. プロの運用アドバイス

  • 排他制御の限界を知る: VBScriptは高度なスレッドロックを持たない。もし高頻度でログを出力するマルチプロセス環境なら、ログ書き込みを「別の単一プロセス(キューイング)」に任せる設計を検討すべきだ。
  • パスの指定: ネットワークドライブへのログ出力は避けること。ネットワークの瞬断は `FileSystemObject` のエラーを誘発し、スクリプト全体の停止を招く。必ずローカルディスクに出力し、別プロセスでアーカイブを転送する仕組みにすること。

最後に

「動けばいい」コードは、半年後の自分を苦しめる。
今回紹介したような、構造化されたロギングモジュールを使いこなすことで、あなたの自動化ツールは「使い捨てのスクリプト」から「信頼に足るシステム」へと昇華する。

ログは、システムの鼓動そのものだ。その鼓動を正確に管理できるエンジニアこそが、現場を支配できるのである。

タイトルとURLをコピーしました