C#でlog4netを使う方法|設定ファイルの書き方からログ出力できない原因まで徹底解説

はじめに

C#でアプリケーションを開発していると、処理の開始・終了、例外、外部APIとの通信結果、ユーザー操作、バッチ処理の実行状況などをログとして残したい場面が多くあります。そのようなときに使われる定番のログライブラリの1つがlog4netです。

log4netを使うと、C#のコード内では InfoError のようなメソッドを呼び出すだけで、ログの出力先、ログレベル、ファイル名、ローテーション方式、出力フォーマットなどを設定ファイルで柔軟に管理できます。

この記事では、C#でlog4netを導入する方法から、設定ファイルの書き方、ファイル出力、ログレベル、Appender、ログが出力できない原因と対処法、実用的な設定例までを順番に解説します。

1. C#でlog4netを使う前に知っておきたい基礎知識

1-1. log4netとは何か

log4netは、Apache Logging Servicesのプロジェクトとして提供されている.NET向けのログ出力ライブラリです。Apache公式では、log4netを「さまざまな出力先へログステートメントを出力するためのライブラリ」と説明しています。ファイル、コンソール、デバッグ出力、データベース、メール、ネットワークなど、複数の出力先に対応できる点が特徴です。

C#でlog4netを使う場合、アプリケーション側では次のようなコードを書きます。

C#
private static readonly log4net.ILog log =
log4net.LogManager.GetLogger(typeof(Program));

log.Info("アプリケーションを開始しました。");
log.Error("エラーが発生しました。", ex);

ログの出力先や形式は、C#コードではなく App.configlog4net.config などの設定ファイルで管理します。そのため、コードを変更せずにログレベルや出力先を切り替えやすい構成にできます。

1-2. C#でlog4netを使うメリット

C#でlog4netを使う主なメリットは、ログ出力の処理をアプリケーション本体から分離できることです。

たとえば、開発中はコンソールとVisual Studioの出力ウィンドウにログを出し、本番環境ではファイルに出力する、といった切り替えを設定ファイルだけで行えます。また、DEBUGINFOWARNERRORFATAL のようなログレベルを使い分けることで、必要なログだけを出力できます。

さらに、ファイルサイズや日付によるログローテーションにも対応しているため、ログファイルが肥大化してディスクを圧迫するリスクを減らせます。公式ドキュメントでも、RollingFileAppenderはサイズや時間間隔などの条件に基づいてログファイルを自動的に切り替えられるAppenderとして説明されています。

1-3. Console.WriteLineやDebug.WriteLineとの違い

Console.WriteLineDebug.WriteLine は手軽ですが、本格的なログ管理には向いていません。

Console.WriteLine は主にコンソールアプリ向けで、Windowsサービス、Webアプリ、GUIアプリでは確認しづらい場合があります。Debug.WriteLine はデバッグ時には便利ですが、本番環境での永続的なログ保存には不向きです。

一方、log4netでは次のようなことができます。

C#
log.Debug("詳細なデバッグ情報");
log.Info("通常の処理情報");
log.Warn("注意が必要な状態");
log.Error("例外が発生", ex);
log.Fatal("致命的なエラー", ex);

ログレベルごとに出力対象を制御できるため、開発中は詳細なログを出し、本番環境では INFO 以上や WARN 以上だけを出すといった運用がしやすくなります。

1-4. log4netが向いているプロジェクト

log4netは、特に次のようなC#プロジェクトに向いています。

業務アプリケーション、Windowsフォームアプリ、WPFアプリ、Windowsサービス、バッチ処理、ASP.NETアプリ、古くから運用されている.NET Frameworkアプリなどです。

既存システムでlog4netがすでに使われている場合、無理に別のログライブラリへ移行せず、設定を見直しながら使い続ける選択も現実的です。NuGet上でもlog4netは公開されており、2026年6月時点でNuGet Galleryにはlog4net 3.3.1が掲載されています。

1-5. log4netでできる主なログ出力

log4netでは、Appenderを使って出力先を切り替えます。代表的なAppenderには、ファイルへ出力する FileAppender、日付やサイズでログファイルを分割する RollingFileAppender、コンソールへ出力する ConsoleAppender、Visual Studioのデバッグ出力へ出す DebugAppender、Traceへ出力する TraceAppender などがあります。公式ドキュメントでも、Appenderはログイベントを目的の出力先へ届ける役割を持つものとして説明されています。

C# log4netの運用では、特に RollingFileAppender がよく使われます。ログをファイルに残しつつ、日付やサイズで分割できるため、開発環境でも本番環境でも扱いやすいからです。

2. C#にlog4netを導入する手順

2-1. NuGetでlog4netをインストールする

C#プロジェクトにlog4netを導入するには、NuGetからパッケージを追加します。

Visual Studioの「パッケージマネージャーコンソール」を使う場合は、次のコマンドを実行します。

PowerShell
Install-Package log4net

.NET CLIを使う場合は、プロジェクトフォルダで次のコマンドを実行します。

Bash
dotnet add package log4net

インストール後、C#コードで次の名前空間を使えるようになります。

C#
using log4net;
using log4net.Config;

2-2. Visual Studioでパッケージを追加する方法

Visual Studioの画面から追加する場合は、対象プロジェクトを右クリックし、「NuGet パッケージの管理」を選択します。

「参照」タブで log4net を検索し、Apache log4netのパッケージを選択してインストールします。インストール後、プロジェクトの依存関係にlog4netが追加されていれば準備完了です。

2-3. .NET Frameworkと.NET Core/.NET 6以降での違い

.NET Frameworkでは、App.configWeb.config にlog4net設定を直接書く構成がよく使われます。一方、.NET Core、.NET 5、.NET 6以降では、log4net.config のような独立した設定ファイルを作成し、起動時に明示的に読み込む方法が分かりやすいです。

NuGet Galleryの情報では、log4netは net462netstandard2.0 をターゲットにしており、.NET 6、.NET 8、.NET 9、.NET 10などの互換ターゲットも表示されています。既存の.NET Frameworkアプリだけでなく、.NET 6以降のC#アプリでも利用しやすいライブラリです。

2-4. log4netを使うために必要なファイル構成

基本的なファイル構成は次のようになります。

SampleApp
├─ Program.cs
├─ log4net.config
└─ SampleApp.csproj

.NET Frameworkの場合は、次のような構成もあります。

SampleApp
├─ Program.cs
├─ App.config
└─ Properties
└─ AssemblyInfo.cs

初心者には、log4net.config を別ファイルとして作成し、Program.cs で明示的に読み込む方法がおすすめです。設定ファイルの場所が分かりやすく、ログが出ないときにも原因を切り分けやすくなります。

2-5. 最初に作るサンプルプロジェクトの前提

この記事では、次のようなC#コンソールアプリを前提に説明します。

C#
using System;
using System.IO;
using System.Reflection;
using log4net;
using log4net.Config;

class Program
{
private static readonly ILog log = LogManager.GetLogger(typeof(Program));

static void Main(string[] args)
{
var repository = LogManager.GetRepository(Assembly.GetEntryAssembly());
XmlConfigurator.Configure(repository, new FileInfo("log4net.config"));

log.Info("アプリケーションを開始しました。");

try
{
throw new InvalidOperationException("サンプル例外です。");
}
catch (Exception ex)
{
log.Error("例外が発生しました。", ex);
}

log.Info("アプリケーションを終了しました。");
}
}

このコードでは、log4net.config を読み込み、InfoError のログを出力しています。

3. C#でlog4netを使ってログを出力する基本実装

3-1. ILogを使ってロガーを取得する

log4netでは、ILog インターフェースを使ってロガーを取得します。

C#
private static readonly ILog log =
LogManager.GetLogger(typeof(Program));

typeof(Program) を指定すると、ログの出力元として Program クラス名が記録されます。クラスごとにロガーを持たせることで、どのクラスから出たログなのかを追跡しやすくなります。

3-2. Debug・Info・Warn・Error・Fatalでログを出力する

log4netでは、重要度に応じてログレベルを使い分けます。

C#
log.Debug("デバッグ用の詳細情報です。");
log.Info("通常の処理ログです。");
log.Warn("警告ログです。");
log.Error("エラーログです。");
log.Fatal("致命的なエラーログです。");

一般的には、開発時の詳細情報には Debug、通常の処理記録には Info、注意が必要な状態には Warn、例外や処理失敗には Error、アプリケーション継続が難しい重大障害には Fatal を使います。

3-3. Program.csやFormアプリで初期化する方法

コンソールアプリや.NET 6以降のアプリでは、Program.cs の起動直後に設定ファイルを読み込みます。

C#
using System.IO;
using System.Reflection;
using log4net;
using log4net.Config;

var repository = LogManager.GetRepository(Assembly.GetEntryAssembly());
XmlConfigurator.Configure(repository, new FileInfo("log4net.config"));

Windowsフォームアプリの場合は、Application.Run の前に初期化します。

C#
[STAThread]
static void Main()
{
var repository = LogManager.GetRepository(Assembly.GetEntryAssembly());
XmlConfigurator.Configure(repository, new FileInfo("log4net.config"));

Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainForm());
}

log4netは、ログ出力前に設定が読み込まれていないと期待どおりに動きません。初期化処理はアプリケーションの起動直後に置くのが基本です。

3-4. クラスごとにロガーを分ける書き方

各クラスに次のようなロガーを定義します。

C#
public class OrderService
{
private static readonly ILog log =
LogManager.GetLogger(typeof(OrderService));

public void CreateOrder()
{
log.Info("注文作成処理を開始しました。");
}
}

このようにしておくと、PatternLayout%logger にクラス名や名前空間が出力されます。障害調査時に「どのクラスのどの処理で問題が起きたのか」を追いやすくなります。

3-5. 例外情報をログに出力する方法

例外をログに出すときは、メッセージだけでなく例外オブジェクトも渡します。

C#
try
{
Execute();
}
catch (Exception ex)
{
log.Error("処理中に例外が発生しました。", ex);
}

次のように ex.Message だけを出力すると、スタックトレースが残らず、原因調査が難しくなります。

C#
log.Error(ex.Message);

例外ログでは、メッセージ、例外型、スタックトレース、関連する処理IDや入力値の概要を残すと、後から調査しやすくなります。ただし、個人情報やパスワードなどの機密情報は出力しないように注意が必要です。

4. log4netの設定ファイルの書き方

4-1. App.configにlog4net設定を書く方法

.NET Frameworkでは、App.config にlog4net設定を書く方法があります。log4net公式ドキュメントでも、設定ファイルを使う方法が推奨されており、.config ファイルに設定を書く場合は configSections でlog4netセクションを定義する必要があります。

XML
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net"
type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>

<log4net>
<appender name="FileAppender" type="log4net.Appender.FileAppender">
<file value="logs/app.log" />
<appendToFile value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date %-5level %logger - %message%newline%exception" />
</layout>
</appender>

<root>
<level value="INFO" />
<appender-ref ref="FileAppender" />
</root>
</log4net>
</configuration>

この場合は、起動時に次のように設定を読み込みます。

C#
XmlConfigurator.Configure();

4-2. log4net.configを別ファイルで作成する方法

log4net.config を別ファイルにすると、ログ設定だけを独立して管理できます。

XML
<?xml version="1.0" encoding="utf-8" ?>
<log4net>
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="logs/app.log" />
<appendToFile value="true" />
<rollingStyle value="Date" />
<datePattern value="'.'yyyyMMdd'.log'" />
<staticLogFileName value="false" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger - %message%newline%exception" />
</layout>
</appender>

<root>
<level value="INFO" />
<appender-ref ref="RollingFileAppender" />
</root>
</log4net>

この設定では、logs/app.log.20260607.log のように日付付きのログファイルを出力できます。

4-3. AssemblyInfo.csでXmlConfiguratorを設定する方法

.NET Frameworkのプロジェクトでは、AssemblyInfo.cs に次の属性を追加する方法もあります。

C#
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]

ただし、属性を書いただけでは必ず設定が読み込まれるわけではありません。公式ドキュメントでも、属性は受動的な情報であり、log4netに属性を処理させるには LogManager.GetLogger などの呼び出しが必要だと説明されています。

確実に読み込ませたい場合は、Program.cs で明示的に XmlConfigurator.Configure を呼び出す方法が分かりやすいです。

4-4. Program.csで明示的に設定ファイルを読み込む方法

Program.cslog4net.config を直接読み込む場合は、次のように書きます。

C#
using System.IO;
using System.Reflection;
using log4net;
using log4net.Config;

var repository = LogManager.GetRepository(Assembly.GetEntryAssembly());
XmlConfigurator.Configure(repository, new FileInfo("log4net.config"));

設定ファイルの変更を監視したい場合は、次のようにします。

C#
XmlConfigurator.ConfigureAndWatch(repository, new FileInfo("log4net.config"));

この方法は、.NET Framework、.NET Core、.NET 6以降でも考え方が分かりやすく、ログが出ないときの調査もしやすい書き方です。

4-5. configuration・log4net・root・loggerの基本構造

log4net設定の基本構造は、次の4つを理解すると分かりやすくなります。

configuration は、App.configWeb.config 全体のルート要素です。log4net.config を単独ファイルにする場合は通常不要です。

log4net は、log4net設定全体を囲む要素です。

root は、すべてのロガーに対する基本設定です。

logger は、特定のクラス名や名前空間ごとに設定を分けたいときに使います。

XML
<log4net>
<appender name="FileAppender" type="log4net.Appender.FileAppender">
...
</appender>

<root>
<level value="INFO" />
<appender-ref ref="FileAppender" />
</root>

<logger name="SampleApp.Services">
<level value="DEBUG" />
</logger>
</log4net>

まずは root だけで設定し、必要になったら logger を追加するのがおすすめです。

4-6. 設定ファイルを出力先フォルダにコピーする設定

log4net.config は、ビルド後の実行フォルダにコピーされていないと読み込めません。Visual Studioでは、log4net.config を選択してプロパティを開き、次のように設定します。

ビルドアクション: Content
出力ディレクトリにコピー: 新しい場合はコピーする

.NET SDK形式の .csproj では、次のように書くこともできます。

XML
<ItemGroup>
<None Update="log4net.config">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>

ログが出力されない原因として非常に多いのが、このコピー設定の漏れです。

4-7. Watch=trueで設定変更を自動反映する方法

Watch=trueConfigureAndWatch を使うと、設定ファイルの変更を監視できます。公式ドキュメントでも、Watchtrue にすると設定ファイルの変更を監視し、変更時に自動的に再読み込みすると説明されています。

AssemblyInfo.csで指定する場合は次のように書きます。

C#
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]

Program.csで指定する場合は次のように書きます。

C#
XmlConfigurator.ConfigureAndWatch(repository, new FileInfo("log4net.config"));

本番環境では、設定変更の反映タイミングを管理したい場合もあるため、自動監視を使うかどうかは運用方針に合わせて判断します。

5. log4netのAppender設定を理解する

5-1. Appenderとは何か

Appenderとは、ログをどこに出力するかを決める部品です。C#コードから log.Infolog.Error を呼び出すと、log4netは設定されたAppenderにログイベントを渡します。

たとえば、ファイルに出したいなら FileAppender、ローテーションしたいなら RollingFileAppender、コンソールに出したいなら ConsoleAppender を使います。

5-2. FileAppenderでファイルにログを出力する

単純に1つのファイルへログを追記する場合は、FileAppender を使います。

XML
<appender name="FileAppender" type="log4net.Appender.FileAppender">
<file value="logs/app.log" />
<appendToFile value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date %-5level %logger - %message%newline%exception" />
</layout>
</appender>

<root>
<level value="INFO" />
<appender-ref ref="FileAppender" />
</root>

appendToFiletrue にすると、既存ファイルに追記します。false にすると起動時に上書きされるため、通常は true を指定します。

5-3. RollingFileAppenderで日付・サイズごとにログを分割する

本番環境では、RollingFileAppender を使うことが多いです。公式ドキュメントでも、RollingFileAppenderはファイルサイズや時間間隔などの条件でログファイルを切り替えられるAppenderとして説明されています。

日付ごとに分割する例です。

XML
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="logs/app.log" />
<appendToFile value="true" />
<rollingStyle value="Date" />
<datePattern value="'.'yyyyMMdd'.log'" />
<staticLogFileName value="false" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger - %message%newline%exception" />
</layout>
</appender>

サイズごとに分割する例です。

XML
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="logs/app.log" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="10MB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger - %message%newline%exception" />
</layout>
</appender>

maximumFileSize で1ファイルあたりの最大サイズを指定し、maxSizeRollBackups でバックアップ数を指定します。

5-4. ConsoleAppenderでコンソールにログを出力する

コンソールアプリで画面にもログを出したい場合は、ConsoleAppender を使います。

XML
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date %-5level %logger - %message%newline" />
</layout>
</appender>

root に追加すると、ファイルとコンソールの両方に出力できます。

XML
<root>
<level value="DEBUG" />
<appender-ref ref="ConsoleAppender" />
<appender-ref ref="RollingFileAppender" />
</root>

5-5. DebugAppenderやTraceAppenderでVisual Studioに出力する

Visual Studioの出力ウィンドウでログを確認したい場合は、DebugAppenderTraceAppender を使います。公式ドキュメントでは、DebugAppenderは.NETデバッガーへ、TraceAppenderは.NETのTraceシステムへログイベントを書き込むAppenderとして紹介されています。

XML
<appender name="DebugAppender" type="log4net.Appender.DebugAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date %-5level %logger - %message%newline" />
</layout>
</appender>

開発中の動作確認には便利ですが、本番環境の障害調査用ログとしてはファイル出力も併用するのが一般的です。

5-6. 複数のAppenderに同時出力する方法

複数のAppenderへ同時に出力したい場合は、root に複数の appender-ref を指定します。

XML
<root>
<level value="INFO" />
<appender-ref ref="ConsoleAppender" />
<appender-ref ref="RollingFileAppender" />
</root>

これで、同じログがコンソールとファイルの両方に出力されます。公式ドキュメントでも、1つのloggerに複数のAppenderを設定できることが説明されています。

5-7. 本番環境でよく使うAppender設定例

本番環境では、次のような構成が使いやすいです。

XML
<log4net>
<appender name="InfoFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="logs/app.log" />
<appendToFile value="true" />
<rollingStyle value="Composite" />
<datePattern value="'.'yyyyMMdd'.log'" />
<maximumFileSize value="10MB" />
<maxSizeRollBackups value="30" />
<staticLogFileName value="false" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger - %message%newline%exception" />
</layout>
</appender>

<root>
<level value="INFO" />
<appender-ref ref="InfoFileAppender" />
</root>
</log4net>

Composite を使うと、日付とサイズの両方を条件にローテーションできます。ログ量が多い業務アプリやバッチ処理では、日付だけでなくサイズ制限も入れておくと安全です。

6. ログレベルと出力フォーマットの設定方法

6-1. log4netのログレベル一覧

log4netでよく使うログレベルは、重要度の低い順に次のとおりです。

DEBUG
INFO
WARN
ERROR
FATAL

root のレベルを INFO にすると、INFOWARNERRORFATAL が出力され、DEBUG は出力されません。

XML
<root>
<level value="INFO" />
<appender-ref ref="RollingFileAppender" />
</root>

6-2. rootレベルで出力対象を制御する

すべてのログに共通する出力レベルは root で指定します。

XML
<root>
<level value="WARN" />
<appender-ref ref="RollingFileAppender" />
</root>

この設定では、WarnErrorFatal は出力されますが、DebugInfo は出力されません。

ログが出力されないときは、まず rootlevel を確認してください。C#コードで log.Debug を呼んでいても、設定が INFO 以上になっていれば DEBUG ログは出ません。

6-3. loggerごとにログレベルを分ける

特定の名前空間やクラスだけログレベルを変えたい場合は、logger を使います。

XML
<logger name="SampleApp.Services">
<level value="DEBUG" />
</logger>

<root>
<level value="INFO" />
<appender-ref ref="RollingFileAppender" />
</root>

この例では、通常は INFO 以上を出力しつつ、SampleApp.Services 配下だけ DEBUG も出力できます。障害調査中に特定機能だけ詳細ログを増やしたい場合に便利です。

6-4. PatternLayoutでログの出力形式を設定する

PatternLayout を使うと、ログの出力形式を自由に設定できます。公式ドキュメントでは、PatternLayoutはユーザー定義のパターンに基づいて人間が読みやすいログメッセージを生成するLayoutとして説明されています。

XML
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger - %message%newline%exception" />
</layout>

よく使うパターンは次のとおりです。

%date       日時
%thread スレッド
%-5level ログレベル
%logger ロガー名
%message メッセージ
%newline 改行
%exception 例外情報

6-5. 日時・レベル・クラス名・メッセージ・例外情報を出力する

実用的なログフォーマットは、次のような形です。

XML
<conversionPattern value="%date [%thread] %-5level %logger - %message%newline%exception" />

出力例は次のようになります。

2026-06-07 10:15:23,456 [1] INFO  SampleApp.Program - アプリケーションを開始しました。
2026-06-07 10:15:24,123 [1] ERROR SampleApp.Program - 例外が発生しました。
System.InvalidOperationException: サンプル例外です。
at SampleApp.Program.Main(String[] args)

日時、ログレベル、クラス名、メッセージ、例外情報がそろっていると、ログだけで状況を把握しやすくなります。

6-6. 開発環境と本番環境でログレベルを切り替える考え方

開発環境では、原因調査をしやすくするために DEBUG まで出力することがあります。

XML
<level value="DEBUG" />

一方、本番環境ではログ量が増えすぎないように、通常は INFO または WARN 以上にします。

XML
<level value="INFO" />

アクセス数が多いWebアプリやバッチ処理では、DEBUG ログを大量に出すとディスク容量やパフォーマンスに影響する場合があります。本番環境では、必要な情報だけを残す設計が重要です。

7. C#でlog4netのログが出力できない原因と対処法

7-1. 設定ファイルが読み込まれていない

C# log4netで最も多いトラブルは、設定ファイルが読み込まれていないことです。

log4net.config を使う場合は、起動時に次の処理が必要です。

C#
var repository = LogManager.GetRepository(Assembly.GetEntryAssembly());
XmlConfigurator.Configure(repository, new FileInfo("log4net.config"));

まずは、実行フォルダに log4net.config が存在するかを確認してください。

7-2. log4net.configがビルド後のフォルダにコピーされていない

log4net.config がプロジェクト内にあっても、ビルド後の bin フォルダにコピーされていなければ読み込まれません。

Visual Studioで次の設定を確認します。

ビルドアクション: Content
出力ディレクトリにコピー: 新しい場合はコピーする

または .csproj に次の設定を追加します。

XML
<ItemGroup>
<None Update="log4net.config">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>

7-3. XmlConfigurator.Configureを呼び出していない

ILog を定義しただけでは、設定ファイルは読み込まれません。次のいずれかの初期化処理が必要です。

C#
XmlConfigurator.Configure();

または、

C#
XmlConfigurator.Configure(repository, new FileInfo("log4net.config"));

.NET 6以降では、設定ファイルを明示的に指定する後者の方法が分かりやすいです。

7-4. AssemblyInfo.csの設定が反映されていない

AssemblyInfo.cs に次のように書いているのにログが出ない場合があります。

C#
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]

この場合は、属性が処理される前にログ出力しようとしている可能性があります。公式ドキュメントでも、属性は受動的な情報であり、log4netに読み取らせるためにはlog4netを呼び出す必要があると説明されています。

確実に動かしたい場合は、Program.csXmlConfigurator.Configure を明示的に呼び出してください。

7-5. ファイル出力先のパスが間違っている

次の設定では、実行フォルダを基準に logs/app.log が作成されます。

XML
<file value="logs/app.log" />

開発中に想定しているプロジェクトフォルダではなく、実際には bin/Debug/net8.0/logs/app.log のような場所に出力されることがあります。

ログが見つからない場合は、アプリケーションの実行フォルダを確認してください。

C#
Console.WriteLine(AppDomain.CurrentDomain.BaseDirectory);

7-6. ログ出力先フォルダへの書き込み権限がない

Windowsサービス、IIS、タスクスケジューラ、社内サーバー上のアプリでは、実行ユーザーにログフォルダへの書き込み権限がないことがあります。

たとえば、次のような場所は権限エラーになりやすいです。

C:\Program Files\
C:\Windows\
他ユーザーのデスクトップ

本番環境では、アプリケーション専用のログフォルダを作成し、実行ユーザーに書き込み権限を付与してください。

7-7. ログレベルの設定で出力対象外になっている

C#コードで次のように書いていても、

C#
log.Debug("デバッグログです。");

設定ファイルが次のようになっていれば、Debug は出力されません。

XML
<root>
<level value="INFO" />
</root>

DEBUG ログを確認したい場合は、一時的に次のように変更します。

XML
<level value="DEBUG" />

7-8. Appenderのnameやrefの指定が一致していない

Appenderの nameappender-refref が一致していないと、ログは出力されません。

間違った例です。

XML
<appender name="FileAppender" type="log4net.Appender.FileAppender">
...
</appender>

<root>
<level value="INFO" />
<appender-ref ref="RollingFileAppender" />
</root>

正しい例です。

XML
<appender name="FileAppender" type="log4net.Appender.FileAppender">
...
</appender>

<root>
<level value="INFO" />
<appender-ref ref="FileAppender" />
</root>

7-9. Releaseビルドや実行環境でだけ出力されない

Debugビルドでは出るのにReleaseビルドでは出ない場合、次の点を確認します。

log4net.config がRelease出力フォルダにコピーされているか、実行ユーザーにログフォルダへの権限があるか、相対パスの基準が想定どおりか、ログレベルが本番用に変更されていないかを確認してください。

特にWindowsサービスやタスクスケジューラでは、カレントディレクトリが想定と異なる場合があります。相対パスでうまくいかない場合は、絶対パスやアプリケーションベースディレクトリを基準にしたパスを検討します。

7-10. 例外が出ずにログが出力されないときの確認方法

log4netは、設定ミスがあってもアプリケーション本体を止めないように動作することがあります。そのため、例外が出ないのにログだけ出ないという状況が起こります。

確認する順番は次のとおりです。

  1. log4net.config が実行フォルダにあるか

  2. XmlConfigurator.Configure を呼んでいるか

  3. rootappender-ref があるか

  4. Appenderの nameref が一致しているか

  5. ログレベルが出力対象になっているか

  6. ログフォルダに書き込み権限があるか

  7. ファイルパスが想定どおりか

この順番で確認すると、多くの原因を切り分けられます。

7-11. log4netの内部デバッグログを有効にして原因を調べる

log4net自体の設定読み込み状況を確認したい場合は、内部デバッグを有効にします。

App.config の場合は、次のように設定できます。

XML
<configuration>
<appSettings>
<add key="log4net.Internal.Debug" value="true" />
</appSettings>
</configuration>

コードで有効にする場合は、起動直後に次のように書きます。

C#
log4net.Util.LogLog.InternalDebugging = true;

内部デバッグを有効にすると、設定ファイルの読み込み失敗、Appenderの設定ミス、パスの問題などを調べやすくなります。本番環境では必要な調査が終わったら無効にしてください。

8. log4netの実用的な設定例

8-1. 日付ごとにログファイルを分ける設定例

日付ごとにログファイルを分ける設定です。

XML
<appender name="DailyRollingFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="logs/app.log" />
<appendToFile value="true" />
<rollingStyle value="Date" />
<datePattern value="'.'yyyyMMdd'.log'" />
<staticLogFileName value="false" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger - %message%newline%exception" />
</layout>
</appender>

<root>
<level value="INFO" />
<appender-ref ref="DailyRollingFileAppender" />
</root>

日次でログを確認したい業務アプリやバッチ処理に向いています。

8-2. ファイルサイズごとにローテーションする設定例

ファイルサイズが一定量を超えたらローテーションする設定です。

XML
<appender name="SizeRollingFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="logs/app.log" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maximumFileSize value="10MB" />
<maxSizeRollBackups value="20" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger - %message%newline%exception" />
</layout>
</appender>

<root>
<level value="INFO" />
<appender-ref ref="SizeRollingFileAppender" />
</root>

ログ量が多いアプリでは、サイズ制限を必ず設定しておくと安全です。

8-3. Error以上だけ別ファイルに出力する設定例

通常ログとは別に、ERROR 以上だけを専用ファイルへ出力する設定です。

XML
<appender name="ErrorFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="logs/error.log" />
<appendToFile value="true" />
<rollingStyle value="Date" />
<datePattern value="'.'yyyyMMdd'.log'" />
<staticLogFileName value="false" />

<filter type="log4net.Filter.LevelRangeFilter">
<levelMin value="ERROR" />
<levelMax value="FATAL" />
</filter>
<filter type="log4net.Filter.DenyAllFilter" />

<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger - %message%newline%exception" />
</layout>
</appender>

<root>
<level value="INFO" />
<appender-ref ref="DailyRollingFileAppender" />
<appender-ref ref="ErrorFileAppender" />
</root>

通常ログを追うよりも、エラーだけを素早く確認したい運用で便利です。

8-4. クラスや名前空間ごとに出力先を分ける設定例

特定の名前空間だけ別ファイルに出力する例です。

XML
<appender name="ServiceFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="logs/service.log" />
<appendToFile value="true" />
<rollingStyle value="Date" />
<datePattern value="'.'yyyyMMdd'.log'" />
<staticLogFileName value="false" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date %-5level %logger - %message%newline%exception" />
</layout>
</appender>

<logger name="SampleApp.Services" additivity="false">
<level value="DEBUG" />
<appender-ref ref="ServiceFileAppender" />
</logger>

additivity="false" を指定すると、親ロガーやrootへの伝播を止められます。特定機能のログを分離したい場合に使います。

8-5. 相対パスと絶対パスを使い分ける設定例

相対パスの例です。

XML
<file value="logs/app.log" />

これは実行フォルダを基準にします。開発環境では扱いやすいですが、Windowsサービスやタスクスケジューラでは想定外の場所になることがあります。

絶対パスの例です。

XML
<file value="C:\Logs\SampleApp\app.log" />

本番環境では、ログ出力先を明確にするために絶対パスを使うこともあります。ただし、環境ごとにパスが変わる場合は、設定ファイルを環境別に管理する必要があります。

8-6. Windowsサービスやバッチ処理で使う設定例

Windowsサービスやバッチ処理では、実行ユーザーと作業ディレクトリに注意します。

XML
<appender name="BatchFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="C:\Logs\BatchApp\batch.log" />
<appendToFile value="true" />
<rollingStyle value="Composite" />
<datePattern value="'.'yyyyMMdd'.log'" />
<maximumFileSize value="20MB" />
<maxSizeRollBackups value="30" />
<staticLogFileName value="false" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger - %message%newline%exception" />
</layout>
</appender>

Windowsサービスでは、LocalSystemNetworkService、専用サービスアカウントなど、実行ユーザーによって書き込み権限が変わります。ログフォルダには、実行ユーザーの書き込み権限を付与してください。

8-7. ASP.NETやWebアプリで使う場合の注意点

ASP.NETやWebアプリでlog4netを使う場合は、アプリケーション起動時に設定を読み込む必要があります。

ASP.NET Frameworkでは、Global.asaxApplication_Start で初期化する構成があります。

C#
protected void Application_Start()
{
log4net.Config.XmlConfigurator.Configure();
}

ASP.NET Coreや.NET 6以降のWebアプリでは、Program.cs の早い段階で log4net.config を読み込む方法が分かりやすいです。

Webアプリでは、複数リクエストが同時に処理されるため、ログにはリクエストID、ユーザーIDの代替識別子、処理名などを含めると調査しやすくなります。ただし、個人情報や認証情報をそのままログに出すのは避けてください。

9. log4netを安全に運用するためのベストプラクティス

9-1. ログに出力すべき情報と出力すべきでない情報

ログに出力すべき情報は、障害調査や処理追跡に必要な情報です。

たとえば、処理開始・終了、処理対象のID、外部APIの呼び出し結果、例外情報、リトライ回数、処理時間などです。

一方、出力すべきでない情報もあります。パスワード、アクセストークン、クレジットカード番号、マイナンバー、秘密鍵、接続文字列、個人を直接特定できる情報などはログに残さないようにします。

9-2. 個人情報や機密情報をログに残さない

ログは、開発者、運用担当者、監視システム、バックアップ先など、複数の場所で参照される可能性があります。そのため、通常のデータベースよりも管理範囲が広がりやすいです。

メールアドレスや電話番号などをどうしても調査用に残す場合は、マスク処理を検討します。

taro@example.com

t***@example.com

また、リクエストボディを丸ごとログに出す実装は危険です。必要な項目だけを選んで出力してください。

9-3. ログファイルの肥大化を防ぐ

ログファイルが肥大化すると、ディスク容量を圧迫し、アプリケーションやサーバー全体に影響する場合があります。

RollingFileAppender を使い、次のような制限を設定しましょう。

XML
<maximumFileSize value="10MB" />
<maxSizeRollBackups value="30" />

ログ量が多いシステムでは、日付ローテーションだけでなくサイズローテーションも併用するのがおすすめです。

9-4. ログ保存期間とバックアップ数を設計する

ログは「とりあえず残す」のではなく、保存期間を決めて運用します。

たとえば、通常ログは30日、エラーログは90日、監査ログは1年など、用途によって保存期間を分けます。log4netの maxSizeRollBackups だけで要件を満たせない場合は、別途ログ削除バッチやログ管理基盤を用意します。

9-5. 例外発生時に原因調査しやすいログを書く

例外発生時には、次の情報を意識してログに残します。

C#
log.Error($"注文登録に失敗しました。OrderId={orderId}", ex);

ただし、ログメッセージに大量のデータを詰め込むのは避けます。調査に必要な識別子を残し、詳細データはデータベースや管理画面で確認できるようにするとバランスが良くなります。

9-6. 本番環境でDEBUGログを出しすぎない

本番環境で DEBUG ログを常時出すと、ログ量が急増し、パフォーマンスやディスク容量に影響する場合があります。

本番環境では通常 INFO 以上、アクセス数が多いシステムでは WARN 以上を基本にし、障害調査時だけ特定のloggerを DEBUG にする運用が現実的です。

9-7. チーム開発で設定ファイルを管理するポイント

チーム開発では、log4net.config の管理ルールを決めておくことが重要です。

開発環境用、本番環境用、検証環境用でログレベルや出力先が異なる場合は、環境ごとに設定ファイルを分けます。

log4net.Development.config
log4net.Staging.config
log4net.Production.config

また、個人のローカルパスを設定ファイルに直接書くと、他の開発者の環境で動かなくなります。相対パスや環境別設定を活用してください。

10. C# log4netに関するよくある質問

10-1. log4netは現在も使えるのか

はい、log4netは現在も利用できます。NuGet Galleryでは、2026年6月時点でlog4net 3.3.1が掲載されており、Apache Logging Servicesの公式サイトでもドキュメントが公開されています。既存のC#プロジェクトや.NET Frameworkアプリでは、今でも現実的な選択肢です。

ただし、新規開発ではNLogやSerilog、Microsoft.Extensions.Loggingなども候補になります。既存資産、チームの知識、ログ基盤との連携、構造化ログの必要性を考えて選ぶとよいでしょう。

10-2. log4netとNLog・Serilogの違いは何か

log4netは歴史が長く、既存の.NET Frameworkアプリで多く使われてきたログライブラリです。XML設定でAppenderやLayoutを細かく制御できます。

NLogも設定ファイルによる柔軟な出力先制御が得意です。Serilogは構造化ログとの相性が良く、ログを検索・分析基盤へ送る用途でよく使われます。

既存プロジェクトでlog4netが使われているなら、設定を整備して継続利用する価値があります。一方、新規のクラウドネイティブなWebアプリでは、構造化ログを前提にSerilogなどを検討してもよいでしょう。

10-3. App.configとlog4net.configはどちらを使うべきか

.NET Frameworkアプリで設定を1つにまとめたい場合は、App.config に書く方法があります。

一方、ログ設定を独立して管理したい場合や、.NET 6以降のアプリでは、log4net.config を別ファイルにする方法が分かりやすいです。

初心者には、次の構成がおすすめです。

Program.csで log4net.config を明示的に読み込む

この方法は、設定ファイルの場所や読み込みタイミングを把握しやすく、ログが出ないときの調査もしやすいです。

10-4. 設定ファイルなしでlog4netを使えるか

簡単な用途であれば、コードだけで初期化することもできます。

C#
log4net.Config.BasicConfigurator.Configure();

ただし、実務では設定ファイルを使う方法が一般的です。公式ドキュメントでも、log4netの推奨設定方法は設定ファイルを使う方法として説明されています。

設定ファイルを使えば、コードを変更せずにログレベル、出力先、ファイル名、フォーマットを変更できます。

10-5. ログファイル名に日付を入れるにはどうすればよいか

RollingFileAppenderrollingStyleDate にし、datePattern を指定します。

XML
<rollingStyle value="Date" />
<datePattern value="'.'yyyyMMdd'.log'" />
<staticLogFileName value="false" />

完全な例です。

XML
<appender name="DailyRollingFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="logs/app.log" />
<appendToFile value="true" />
<rollingStyle value="Date" />
<datePattern value="'.'yyyyMMdd'.log'" />
<staticLogFileName value="false" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date %-5level %logger - %message%newline%exception" />
</layout>
</appender>

10-6. 複数プロジェクトで同じlog4net設定を共有できるか

共有できます。共通の log4net.config を用意し、各プロジェクトで同じ設定ファイルを出力フォルダへコピーするようにします。

ただし、プロジェクトごとにログファイル名やログレベルを変えたい場合は、完全に同じ設定を共有するより、共通部分をベースにして環境別・アプリ別に分ける方が運用しやすいです。

複数アプリが同じログファイルへ同時に書き込む構成は、ロックやログの混在に注意が必要です。基本的には、アプリごとにログファイルを分けることをおすすめします。

10-7. ログが途中から出力されなくなる原因は何か

ログが途中から出力されなくなる場合、よくある原因は次のとおりです。

ログファイルの出力先ディスクがいっぱいになっている、ログフォルダの権限が変更された、ログファイルが別プロセスにロックされている、ローテーション設定に問題がある、アプリケーションが例外で停止している、設定ファイルが変更されて出力レベルが変わった、などです。

まずは、ディスク容量、ログフォルダの権限、アプリケーションの稼働状態、log4netの内部デバッグログを確認してください。

まとめ

C#でlog4netを使うと、アプリケーションのログ出力を柔軟に管理できます。ILog を使ってロガーを取得し、DebugInfoWarnErrorFatal を使い分けることで、処理状況や例外情報を分かりやすく記録できます。

導入時のポイントは、NuGetでlog4netを追加し、log4net.config を作成し、アプリケーション起動時に XmlConfigurator.Configure で設定ファイルを読み込むことです。

ログが出力されない場合は、設定ファイルのコピー漏れ、初期化処理の不足、ログレベル、Appenderの nameref の不一致、出力先フォルダの権限、パスの誤りを順番に確認してください。

実務では、RollingFileAppender を使って日付やサイズでログをローテーションし、例外情報を適切に残しつつ、個人情報や機密情報を出力しない運用が重要です。C# log4netを正しく設定すれば、開発中のデバッグから本番環境の障害調査まで、安定したログ基盤として活用できます。