【入門編】【実務中級者向け】FSOで読み込んだログのタイムスタンプ解析と正規表現による時間帯別集計バッチ – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

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にするか、あるいはメール通知を追加するか。あなたの現場の課題に合わせてカスタマイズしてみてください。

ここをクリアしたあなたは、もう初心者ではありません。自信を持って、次の自動化の海へ飛び込んでいきましょう!

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