ねらい:マクロの「ログレベル設計」で運用を見える化する
業務マクロを長期運用すると「どこで失敗したか」「どこまで進んだか」「何が起きたか」が分からないと困ります。ログを設計する際に重要なのは「レベル分け」です。情報の粒度を揃えることで、初心者でも状況を把握でき、トラブル時の調査も速くなります。
重要ポイントの深掘り
ログは「全部出す」ではなく「必要なレベルを選んで出す」ことが肝心です。開発時は詳細、運用時は要点だけ、障害時はエラー中心。レベルを切り替えられる設計にすると、同じコードを開発・本番で安心して使えます。
ログレベルの基本設計
レベルの種類と役割
- DEBUG:開発時に使う詳細ログ。変数の値や処理の分岐を記録。
- INFO:通常運用で使う進捗や開始・終了の記録。
- WARN:想定外だが処理継続可能な事象。例:空欄をスキップ。
- ERROR:処理を止める重大なエラー。例外内容を記録。
- FATAL:システム全体を止める致命的なエラー。
深掘り:なぜレベル分けが必要か
- 情報過多を防ぐ:DEBUGを本番で出すとログが膨大になり、調査が逆に難しくなる。
- 状況に応じた切り替え:開発時は詳細、本番は要点、障害時はエラー中心。
- 調査効率を上げる:エラーだけを抽出すれば原因特定が速い。
ログ出力のテンプレート
ログ関数の設計例
' ModLog
Option Explicit
Public Enum LogLevel
DEBUG = 1
INFO = 2
WARN = 3
ERROR = 4
FATAL = 5
End Enum
Public CurrentLogLevel As LogLevel
Public Sub Log(ByVal level As LogLevel, ByVal message As String)
If level < CurrentLogLevel Then Exit Sub
Dim ws As Worksheet
On Error Resume Next
Set ws = ThisWorkbook.Worksheets("Log")
If ws Is Nothing Then
Set ws = ThisWorkbook.Worksheets.Add
ws.Name = "Log"
ws.Range("A1:D1").Value = Array("日時", "レベル", "メッセージ", "詳細")
End If
On Error GoTo 0
Dim r As Long
r = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row + 1
ws.Cells(r, 1).Value = Format(Now, "yyyy-mm-dd HH:NN:SS")
ws.Cells(r, 2).Value = level
ws.Cells(r, 3).Value = message
End Sub
VB深掘り:ログ関数の設計ポイント
- Enumでレベルを定義:数字ではなく名前で扱うと可読性が高い。
- CurrentLogLevelでフィルタ:不要なログを出さない仕組み。
- シート自動生成:Logシートがなければ作る。運用が楽になる。
実際の利用例
開始・終了・進捗をINFOで記録
Sub Run_Process()
CurrentLogLevel = INFO
Log INFO, "処理開始"
' …処理本体…
Log INFO, "処理終了"
End Sub
VB詳細な変数値をDEBUGで記録
Sub DebugExample()
CurrentLogLevel = DEBUG
Dim x As Long: x = 10
Log DEBUG, "変数x=" & x
End Sub
VBエラーをERRORで記録
Sub ErrorExample()
On Error GoTo EH
CurrentLogLevel = INFO
Dim y As Long: y = 1 / 0
Exit Sub
EH:
Log ERROR, "ゼロ除算: " & Err.Description
End Sub
VB運用での切り替え方
開発時はDEBUG
変数の値や分岐を細かく出す。バグ調査に役立つ。
本番運用はINFO
開始・終了・進捗だけを出す。ログが肥大化しない。
障害調査はERROR+WARN
エラーと警告だけを抽出。原因特定が速い。
深掘り:切り替えの仕組み
CurrentLogLevel を設定するだけで切り替え可能にしておくと、コードを変えずに運用モードを変えられる。これは「同じコードを開発・本番で安心して使える」ための重要な設計です。
例題で練習
例題1:INFOレベルで処理開始・終了を記録する
初心者はまず「処理開始」「処理終了」をログに出すだけで効果を体感できます。実行履歴が残るだけで安心感が増します。
例題2:DEBUGレベルで変数値を出してみる
変数の値をログに出すと、処理の流れが見えるようになります。バグ調査の第一歩です。
例題3:ERRORレベルで例外を記録する
意図的にゼロ除算を起こし、ログに「ゼロ除算」と出ることを確認します。エラー調査の基本が理解できます。
実務の落とし穴と対策
ログが多すぎて調査できない
対策:レベルフィルタを必ず設計し、不要なログは出さない。
ログが少なくて原因が分からない
対策:開発時はDEBUG、本番はINFO、障害時はERROR+WARNに切り替える。
ログシートが壊れる
対策:自動生成+ヘッダー行を固定。壊れても再作成できる。
スターター手順
- ステップ1:Enumでログレベルを定義する
- ステップ2:Log関数を作り、CurrentLogLevelでフィルタする
- ステップ3:処理開始・終了をINFOで記録する
- ステップ4:変数値をDEBUGで記録する
- ステップ5:例外をERRORで記録する
まとめ
マクロのログレベル設計は「情報を出す仕組み」ではなく「情報を選ぶ仕組み」です。レベル分けとフィルタを導入するだけで、開発・本番・障害調査のすべてに対応できます。初心者はまず「処理開始・終了をINFOで出す」から始め、慣れたらDEBUGやERRORを組み合わせていくと、業務マクロが一気に安心して使えるシステムになります。
