本文へスキップ
BecomeCoder

C#実践コース · 第6章 代表的なNuGetパッケージとその使い方 · レッスン32

log4net ― ロギングNuGetの定番と選択肢(ローカル実施)

ローカル実施

導入

ログの考え方(ログレベル)とlog4netの設定はログ出力の回で詳しく扱いました。ここでは**「ロギングという分野で、どのNuGetを選ぶか」**という実務の視点で整理します。log4net / Serilog / NLogは同じ問題を解く代表的な選択肢で、考え方は共通です。

図解

flowchart TB
    CODE["log.Info(...) / logger.Information(...)"]
    subgraph LIBS["ロギングNuGetの代表格(設定で出力先・書式・レベルを制御)"]
        L4N["log4net<br/>老舗・設定ファイル中心"]
        SER["Serilog<br/>構造化ログが得意"]
        NLG["NLog<br/>高速・設定が柔軟"]
    end
    CODE --> LIBS
    LIBS --> OUT["コンソール / ファイル / DB / クラウド"]

進め方

  1. スターター116-log4net-nuget/starter.zipを展開し、Log4netNugetLesson.slnを開く(log4netlog4net.configが設定済み)
  2. Program.csのTODOを埋め、コンソールとapp.logの両方に出ることを確認する
  3. ログ出力の回で扱った設定ファイル(Appender/Layout)を見返すと理解が深まる
コンソール出力とapp.logファイルに、日時・レベル付きのログがlog4netで出力された様子
コードは共通、出力先や書式は設定で切り替えられる

学ぶこと

using log4net;

// クラスごとにロガーを取得するのが定石
private static readonly ILog log = LogManager.GetLogger(typeof(Program));

log.Info("処理を開始しました");
log.Warn("リトライします");
log.Error("外部APIの呼び出しに失敗", exception);
// 参考:Serilog なら「構造化ログ」— 値を名前付きで残せる(後から検索しやすい)
//   Log.Information("注文 {OrderId} を {Amount} 円で確定", orderId, amount);
  • log4net:設定ファイル中心の老舗。既存の.NET Frameworkプロジェクトで特に多い
  • Serilog{OrderId}のように構造化ログを残せ、JSONで出力してログ基盤に流すのが得意。新規で人気
  • NLog:高速で設定が柔軟。用途に応じて選ぶ
  • 共通する要点:コードはGetLogger+レベル別メソッド、出力先や書式は設定で切り替える(コードを変えずに運用を変えられる)

期待される出力

2026-07-15 10:00:00 [INFO] 処理を開始しました
2026-07-15 10:00:00 [WARN] リトライします
(同じ内容が app.log にも書き込まれる)

まとめ

  • ロギングの代表NuGetはlog4net / Serilog / NLog。問題は同じで考え方も共通
  • どれも「コードはロガー取得+レベル別出力、運用は設定ファイル」で切り替える
  • 新規で構造化ログが欲しければSerilogが有力候補

次回: オブジェクト間のコピーを自動化するAutoMapperです。

テンプレート構成(教材制作用メモ)

116-log4net-nuget/
├── starter.zip   # log4net導入済み / log4net.config / Program.cs(TODO入り)
└── solution/    # 模範解答(スターターと重複しないNuGet観点の課題)