こんにちは。システム開発の現場で「なぜエラーが起きたのか分からない」という闇に頭を抱えた経験はありませんか?
`Debug.WriteLine` や `MsgBox` でデバッグしているうちは、まだ「趣味のプログラミング」です。プロのエンジニアが作る業務アプリケーションにおいて、ログは「システムが発する魂の叫び」を記録するブラックボックス。これがなければ、本番環境での障害は迷宮入りです。
今日は、VB.NETでプロレベルの自動ログ出力基盤を構築する極意を伝授します。
—
1. なぜ「自作ログ」ではダメなのか?
初学者が陥る罠の一つが、`StreamWriter` を使って自力でテキストファイルにログを書き込むこと。これには以下の「死の罠」が潜んでいます。
- 排他制御の欠如: 複数プロセスが同時に書き込もうとすると例外が発生する。
- ファイルサイズの爆発: ログファイルが数ギガバイトになり、サーバーを圧迫する。
- 検索性の低さ: ログがただの文字列の羅列で、後から「エラー発生時のデータ」を抽出できない。
これらを解決するために、業界標準の NLog を導入します。
—
2. NLog導入:プロの基盤を作る
まずは、Visual Studioの「NuGet パッケージマネージャー」から `NLog` をインストールしてください。これだけで、高度なログ制御が手に入ります。
構成ファイル `NLog.config` の設計
ログの出力先やルールはコードに書かず、設定ファイル(XML)に分離します。これが変更に強い設計の第一歩です。
—
3. 実践:VB.NETでのログ出力コード
それでは、アプリケーション側での呼び出し方です。ここで重要なのは、「ログを記録するクラスを静的(Shared)に保持する」というライフサイクルの管理です。
Imports NLog
Public Module LoggerService
‘ アプリケーション全体で使い回すための唯一のインスタンス
Private ReadOnly logger As Logger = LogManager.GetCurrentClassLogger()
Public Sub LogInfo(message As String)
logger.Info(message)
End Sub
Public Sub LogError(message As String, ex As Exception)
‘ エラー時はExceptionオブジェクトを渡すことで、スタックトレースを詳細に記録
logger.Error(ex, message)
End Sub
End Module
現場でそのまま使う例(Try-Catchと組み合わせる)
Public Sub ProcessData()
Try
LoggerService.LogInfo(“データ処理を開始しました。”)
‘ ここに業務ロジックを書く
Dim result = 10 / 0 ‘ わざと例外を発生させる
Catch ex As Exception
‘ どこで何が起きたのかを完璧に記録する
LoggerService.LogError(“データ処理中に致命的なエラーが発生しました。”, ex)
Throw ‘ 必要に応じて例外を再スロー
End Try
End Sub
—
4. 陥りやすいエラーと「先輩の知恵」
VB.NETを扱う上で、以下の点には特に注意してください。
- インスタンスの生成コスト: `LogManager.GetCurrentClassLogger()` をメソッド内で毎回呼ぶのはNGです。メモリの無駄であり、パフォーマンスを劣化させます。必ずクラスの先頭で定義してください。
- ログの出力レベル: 開発中は `Debug` レベルも出しますが、本番環境では `Info` 以上に絞るのが定石です。`NLog.config` を書き換えるだけで、コードを一切触らずにログ量を制御できるのがこの設計の最大の強みです。
- パフォーマンスへの配慮: ログ出力はディスクへの書き込みを伴う「重い処理」です。頻繁にループする処理の中でログを書きすぎると、システム全体の速度が低下します。「ここぞというポイント(処理の開始・終了・例外発生)」に絞って記録しましょう。
—
最後に:ログは「未来の自分への手紙」
システム開発において、最もコストがかかるのは「障害発生時の原因調査」です。今日導入したNLogは、未来のあなたが深夜に障害対応をする際、間違いなくあなたを救う最大の武器になります。
「マクロの記録」から一歩進んで、このようなプロ仕様の構造化ログを組み込めるようになれば、あなたはもう初心者ではありません。自信を持って、堅牢なアプリケーションを構築してください。
ここをクリアすれば、VB.NETの基本はバッチリです。次は「非同期処理(Async/Await)によるUIレスポンス向上」の世界へ進んでみましょう。応援していますよ!
