VBScriptを掌握せよ:FSOによる「読み解かれるためのログ設計」極意
業務自動化の現場において、VBScriptは今なお強力な武器だ。だが、多くの現場で散見されるのは、ただ情報を垂れ流すだけの「ゴミ溜めのようなログファイル」である。
君たちが自動化ツールを作る目的は、単にタスクを終わらせることではない。「何が起きたかを瞬時に把握し、トラブルを未然に防ぐ」ことにある。今回は、FSO(File System Object)の `FileExists` と `WriteBlankLines` を使い、ログの視認性を劇的に向上させる「プロの作法」を伝授する。
—
1. なぜ「ログの整形」にこだわる必要があるのか
初心者はログを「記録」としか捉えないが、熟練者はログを「デバッグツール」と捉える。
乱雑なログは、障害発生時に解析コストを増大させる。逆に、適切な見出しと適度な余白があるログは、そのファイルを開いた瞬間に状況の良し悪しを直感的に理解させる力を持つ。
ここで重要なのが `WriteBlankLines` だ。単なる改行コード(`vbCrLf`)の挿入とは違う。FSOのメソッドとして提供されているこの機能を使いこなし、ログに「呼吸」をさせるのだ。
—
2. 堅牢なログ出力のアーキテクチャ
単に追記するだけでは、ファイルロックや文字化けのリスクを無視することになる。プロダクション環境で耐えうるコードには、以下の3つの鉄則がある。
1. 存在確認の徹底: `FileExists` でファイルの有無を判定し、新規作成か追記かを動的に切り替える。
2. 排他制御の考慮: 短時間で大量の書き込みが発生する場合、FSOの `OpenTextFile` 時に適切な定数(ForAppending)を使い、ストリームを即座に解放する。
3. 視認性の構造化: 処理の開始と終了に明確な区切りを入れ、ログの「塊」を作る。
—
3. 実装コード:メンテナンス性を極めたロギング・モジュール
このコードは、そのまま君の自動化ツールに組み込んで使える完成度を持っている。
‘ — ログ出力用共通プロシージャ —
Sub WriteLog(strLogPath, strMessage)
Dim fso, ts, blnExists
Set fso = CreateObject(“Scripting.FileSystemObject”)
blnExists = fso.FileExists(strLogPath)
‘ ForAppending(8)で開く。なければ新規作成(True)
Set ts = fso.OpenTextFile(strLogPath, 8, True)
‘ ファイルが存在しなければヘッダーを出力(初回起動時)
If Not blnExists Then
ts.WriteLine “=== ログ開始: ” & Now & ” ===”
ts.WriteBlankLines 1
End If
‘ メッセージの書き込み
ts.WriteLine “[” & Now & “] ” & strMessage
‘ 処理の区切りとして空行を挿入(必要に応じて調整)
‘ WriteBlankLinesは視覚的なセパレーターとして機能する
If InStr(strMessage, “終了”) > 0 Then
ts.WriteBlankLines 1
ts.WriteLine “——————————————”
ts.WriteBlankLines 1
End If
ts.Close
Set ts = Nothing
Set fso = Nothing
End Sub
‘ — 使用例 —
Dim logFile : logFile = “C:\Logs\ProcessLog.txt”
Call WriteLog(logFile, “業務処理を開始します。”)
‘ … ここにメイン処理が入る …
Call WriteLog(logFile, “業務処理が正常に終了しました。”)
—
4. プロの視点:なぜこの実装なのか
`FileExists` を経由する理由
「とりあえず追記モードで開けばいいだろう」という発想は甘い。ファイルが新規作成されたタイミングでヘッダー(運用ルールやバージョン情報)を書き込む設計にしておけば、後からログを遡る際、そのログがいつから始まったものか一目で判別できる。
`WriteBlankLines` の戦略的活用
ログを詰め込みすぎると、人間は読む気を失う。`WriteBlankLines` を使い、論理的な処理の区切りに空行を挿入することで、「どの処理がどれくらいの時間をかけて実行されたのか」というコンテキストが視覚的に浮き彫りになる。これが保守効率を左右する。
オブジェクトの解放
`Set ts = Nothing` を忘れるエンジニアが多いが、VBScriptのメモリ管理を甘く見てはいけない。特にループ処理の中でログを書き出す場合、この解放漏れがメモリリークを引き起こし、長時間の自動運転を止める最大の要因となる。
—
結びに:君のコードは「誰」のためにあるか
自動化ツールは、君が寝ている間も働く。そのツールが吐き出すログは、君の代わりに状況を報告する「分身」だ。
読みやすく、かつ堅牢に設計されたログは、君のエンジニアとしての価値を雄弁に物語る。
次は、このログファイルをデータベースと突き合わせて異常検知を行う仕組みへ発展させてほしい。VBScriptの可能性は、君の設計思想ひとつで無限に広がる。
さあ、コードを磨け。現場の課題は、君のその一行で解決できるはずだ。
