【実務・中級編】実務中級者向け:VB.NETアプリケーションの自動ログ出力基盤:NLogやlog4netを導入し、業務エラーの解析を容易にする構造化ログの設計 – Visual Basic (VB / VB.NET)解析バイブル

スポンサーリンク

ログは「記録」ではなく「武器」である。VB.NETにおける構造化ログ基盤の極意

多くのVB.NET開発者が、いまだに`System.Diagnostics.Trace`でコンソールやファイルに文字列を垂れ流している。あるいは、自作の`WriteLog`関数をモジュールに書き、テキストファイルへ追記するだけの「死んだログ」を運用している。

断言しよう。その設計では、本番環境で発生する「再現性のないバグ」を解決することは不可能だ。

本稿では、レガシーなログ出力から脱却し、NLogを用いた構造化ログ基盤を構築するための思考法と実装コードを伝授する。

1. なぜ「自作ログ関数」が地獄への入り口なのか

多くの開発者が自作のログ関数を作る理由は「手軽だから」だ。しかし、以下の問題に直面したことはないか?

  • 排他制御の欠如: 複数スレッドから同時書き込みが発生した際、ファイルロックで例外が発生し、肝心のエラーログが残らない。
  • 検索性の欠如: ログがただのテキストの羅列であり、後から特定のユーザーやエラーIDで絞り込むのに膨大な時間がかかる。
  • パフォーマンス低下: 同期的にファイルI/Oを行うことで、アプリケーションの応答速度を殺している。

NLogは、これらの問題を「設定」だけで解決できるプロフェッショナルな道具だ。

2. NLogによる構造化ログの設計

構造化ログとは、ログを「文字列」ではなく「データ(JSON等)」として扱うことだ。これにより、ELKスタックやAzure Monitorなどのツールで瞬時に分析が可能になる。

NuGetでの導入

プロジェクトのパッケージマネージャーコンソールで以下を実行せよ。

Install-Package NLog

構造化ログの設定 (`NLog.config`)

アプリの直下に`NLog.config`を配置する。ここで重要なのは「レイアウト」の定義だ。

















3. 実践:保守性の高いログ出力クラスの実装

ビジネスロジックの層で、いちいち`NLog`のインスタンスを生成してはいけない。シングルトンパターンを適用したロガーラッパーを介するのが、大規模開発の鉄則だ。

Imports NLog

Public NotInheritable Class LoggerProvider
‘ スレッドセーフなシングルトン
Private Shared ReadOnly _logger As Logger = LogManager.GetCurrentClassLogger()

Private Sub New()
End Sub

‘ 構造化ログを意識したインターフェース
Public Shared Sub LogError(message As String, ex As Exception, ParamArray properties As Object())
‘ 構造化データとしてプロパティを付与する
_logger.Error(ex, $”[Context: {String.Join(“,”, properties)}] {message}”)
End Sub

Public Shared Sub LogInfo(message As String)
_logger.Info(message)
End Sub
End Class

呼び出し側のコード

Try
‘ 重大な業務処理
Dim result = ExecuteBusinessLogic()
Catch ex As Exception
‘ ユーザーID等のコンテキスト情報を埋め込んで記録する
LoggerProvider.LogError(“業務処理で予期せぬ例外発生”, ex, “UserID: 12345”, “Module: OrderSystem”)
Throw ‘ ログを吐いた後は例外を再スローし、呼出元へ制御を返すのが鉄則
End Try

4. 伝説的エンジニアからの「極限の知見」

最後に、現場で生き残るための3つの鉄則を授ける。

1. ログは「非同期」で書け:
ファイルI/Oは本質的に遅い。NLogの `AsyncTargetWrapper` を使用し、メイン処理のボトルネックにならないよう設計せよ。
2. 例外は「握りつぶすな、再スローせよ」:
`Catch` ブロックでログを出力した後、何もしない(あるいは `Return` する)のは悪手だ。呼び出し元のスタックトレースが途切れ、バグの根本原因が永久に見えなくなる。
3. 機密情報を絶対に出力するな:
パスワードや個人情報がログファイルに紛れ込むと、それはセキュリティインシデントだ。構造化ログであれば、特定のフィールドをフィルタリングする設定も容易である。

結論

ログは、プログラムが「死の間際」に書き残す遺言だ。その遺言が読みづらければ、開発者は原因を特定できず、ただ途方に暮れることになる。

「動けばいい」コードから「解析できる」コードへ。今日からNLogを導入し、あなたのアプリケーションを、真に運用可能な「プロダクション品質」へと引き上げてほしい。

質問があればいつでも受け付ける。ただし、安易なコード改善を求める前に、まず今のコードがなぜその設計なのか、論理的に語れるよう準備しておくことだ。

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