導入
Log4netは、.NETで長く使われてきた代表的なログライブラリです。「どのレベルを・どこへ(コンソール/ファイル)・どんな書式で出すか」を設定ファイルで制御できるのが強みです。NuGetと設定ファイルを使うため、ローカルで実施します。
図解
flowchart LR
CODE["log.Info(...) / log.Error(...)"] --> L4N["Log4net"]
CFG["log4net.config<br/>レベル・出力先・書式"] -.->|制御| L4N
L4N --> C["コンソール Appender"]
L4N --> F["ファイル Appender<br/>app.log"]
進め方
- スターター
108-log4net/starter.zipを展開し、Log4netLesson.slnをVisual Studioで開く log4netパッケージとlog4net.configが設定済みProgram.csのTODOを埋める- コンソール出力と、生成される
app.logファイルの両方を確認する - 詰まったらエラー一覧: NuGetエラーへ
学ぶこと(コードと設定)
コード側(ログを出す):
using log4net;
// クラスごとにロガーを取得するのが定石
private static readonly ILog log = LogManager.GetLogger(typeof(Program));
log.Info("アプリケーションを開始しました");
log.Warn("設定ファイルが見つからず既定値を使用");
log.Error("データベース接続に失敗", exception);
設定側(log4net.config):
<log4net>
<!-- コンソールへ出す Appender -->
<appender name="Console" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%level] %message%newline" />
</layout>
</appender>
<!-- ファイルへ出す Appender -->
<appender name="File" type="log4net.Appender.FileAppender">
<file value="app.log" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%level] %message%newline" />
</layout>
</appender>
<root>
<level value="INFO" /> <!-- INFO以上だけ出す -->
<appender-ref ref="Console" />
<appender-ref ref="File" />
</root>
</log4net>
LogManager.GetLogger(...)でロガーを取得し、Info/Warn/Error/Fatalでレベル別に出力- Appenderが「出力先」(コンソール・ファイル・DB等)、Layoutが「書式」を決める
<level value="INFO" />で出力する最低レベルを設定(前レッスンの閾値フィルタそのもの)- コードを一切変えず、設定ファイルだけで出力先・レベル・書式を切り替えられるのが最大の利点
期待される出力
2026-07-12 10:00:00 [INFO] アプリケーションを開始しました
2026-07-12 10:00:00 [WARN] 設定ファイルが見つからず既定値を使用
(同じ内容が app.log にも書き込まれる)
まとめ
- Log4netはAppender(出力先)とLayout(書式)を設定ファイルで制御する
LogManager.GetLogger+Info/Warn/Error/Fatalでレベル別に記録- コードを変えず設定だけで出力を切り替えられる(Serilog/NLogも考え方は同じ)
テンプレート構成(教材制作用メモ)
108-log4net/
├── starter.zip # log4net導入済みプロジェクト / log4net.config / Program.cs(TODO入り)
└── solution/ # 模範解答