VBScriptを掌握せよ:FSOとRegExpで紐解く「ログ解析」の極意
こんにちは。システム自動化の現場でVBScriptと長く付き合ってきたエンジニアです。
「マクロの記録」で生成されたコードの継ぎ接ぎから卒業したいと願う皆さんへ。今日は、現場で即戦力となる「FSO(FileSystemObject)によるログ解析」という実務の壁を一緒に突破しましょう。
ログファイルという「巨大な情報の海」から、必要なデータを抽出し、時間帯別に集計する。このプロセスを理解すれば、VBScriptの基本は完全にあなたのものになります。
—
1. なぜ「FSO」なのか? その本質を理解する
VBScriptでファイルを扱う際、`Scripting.FileSystemObject`(通称FSO)は避けて通れません。なぜなら、OSのファイルシステムを直接操作するための「最も直感的で、かつ強力なインターフェース」だからです。
- FSOの利点: OSの制約をラップしてくれているため、パスの結合やファイルの存在確認が驚くほど簡単になります。
- 注意点: 大容量ファイルを開くときは、メモリを食いつぶさないよう「必要な分だけ一行ずつ読み込む」のがプロの流儀です。
2. ログ解析のアーキテクチャ
今回のアプローチは以下の3ステップです。
1. FSOでストリームを開く: ファイル全体をメモリに読み込まず、一行ずつ取得する(メモリ節約)。
2. RegExp(正規表現)で抽出: ログの行からタイムスタンプを切り出す。
3. Dictionaryで集計: キーに時間(例: “10時台”)、値にカウント数を保持する。
—
3. 実践コード:時間帯別エラー集計バッチ
このコードは、ログの各行から「HH:MM:SS」形式を探し出し、何時台にエラーが多いかをカウントするスクリプトです。
Option Explicit
‘ メイン処理
Dim fso, ts, regEx, matches
Dim filePath, line, timeStr, hourPart
Dim statsDict
‘ 集計用の辞書オブジェクトを作成
Set statsDict = CreateObject(“Scripting.Dictionary”)
Set fso = CreateObject(“Scripting.FileSystemObject”)
Set regEx = New RegExp
‘ 正規表現の設定(HH:MM:SS を抽出)
regEx.Pattern = “(\d{2}):\d{2}:\d{2}”
regEx.Global = True
filePath = “C:\logs\server.log”
‘ ファイル読み込み(ForReading = 1)
Set ts = fso.OpenTextFile(filePath, 1)
Do Until ts.AtEndOfStream
line = ts.ReadLine
‘ 正規表現でマッチング
If regEx.Test(line) Then
Set matches = regEx.Execute(line)
‘ 抽出した時間から「時」だけを取り出す
hourPart = matches(0).SubMatches(0) & “時”
‘ 辞書でカウントアップ
If Not statsDict.Exists(hourPart) Then
statsDict.Add hourPart, 1
Else
statsDict(hourPart) = statsDict(hourPart) + 1
End If
End If
Loop
ts.Close
‘ 結果の表示
Dim key
For Each key In statsDict.Keys
WScript.Echo key & ” のエラー件数: ” & statsDict(key)
Next
‘ オブジェクトの解放(メモリ管理の基本)
Set ts = Nothing
Set fso = Nothing
Set regEx = Nothing
—
4. 現場で陥りやすい「罠」と対策
① エンコーディングの壁
FSOの `OpenTextFile` は、標準でANSI(Shift-JISなど)を想定しています。最近のUTF-8形式のログを読み込むと文字化けが発生します。その場合は、`ADODB.Stream` オブジェクトを使うのが解決策です。これは一歩上のテクニックですが、覚えておいて損はありません。
② メモリの寿命(ライフサイクル)
VBScriptでは、大きなオブジェクト(特にFSOやRegExp)を使い終わった後に `Set object = Nothing` とすることは、単なる行儀の問題ではなく、安定稼働のための必須要件です。メモリリークを防ぐため、常に「使い終わったら捨てる」習慣をつけましょう。
③ 正規表現の重さ
`RegExp` は強力ですが、ループのたびに `New RegExp` するのは避けましょう。上記コードのように、ループの外で一度インスタンス化して使い回すのがパフォーマンスを最大化するコツです。
—
最後に:エンジニアとして成長するために
今回紹介した「FSO + RegExp + Dictionary」の組み合わせは、自動化エンジニアにとっての「三種の神器」です。これさえあれば、どんな複雑なログ解析も、まずは手元で動くツールに変えることができます。
「プログラムを動かす」段階から、「効率を意識して設計する」段階へ。
このコードをベースに、出力先をCSVにするか、あるいはメール通知を追加するか。あなたの現場の課題に合わせてカスタマイズしてみてください。
ここをクリアしたあなたは、もう初心者ではありません。自信を持って、次の自動化の海へ飛び込んでいきましょう!
