カテゴリ: C# 更新日: 2026/07/03

C#のログ出力入門!SerilogとNLogの使い方を徹底解説

C#のloggingライブラリ(Serilog・NLog)の基本と活用例
C#のloggingライブラリ(Serilog・NLog)の基本と活用例

先生と生徒の会話形式で理解しよう

生徒

「C#でプログラムを作っているのですが、実行中に裏側で何が起きているのか分からなくなることがあります。これを記録する方法はありますか?」

先生

「それは『ロギング』という技術を使うと解決できますよ。C#にはSerilogやNLogといった、便利なログ出力専用のライブラリがあるんです。」

生徒

「ロギング…初めて聞きました。難しい設定が必要なのでしょうか?」

先生

「基本さえ覚えれば簡単です。プログラムの動作履歴を日記のように保存できるので、エラーが起きた時の原因調査にも役立ちます。一緒に見ていきましょう!」

1. ログ出力(ロギング)とは何か?

1. ログ出力(ロギング)とは何か?
1. ログ出力(ロギング)とは何か?

プログラミングの世界におけるログ出力(ロギング)とは、プログラムが動いている時の様子を、テキストファイルや画面に「記録」として残すことを指します。例えるなら、飛行機の「ブラックボックス」や、学校で毎日書く「出席簿」や「日誌」のようなものです。

パソコンを触ったことがない方にとって、プログラムは魔法のように勝手に動いているように見えるかもしれません。しかし、実際には一つひとつの命令を順番に実行しています。もし途中でプログラムが止まってしまったとき、どこまで正しく動いて、どこで失敗したのかを後から確認するためにログが必要になります。デバッグ(プログラムの不具合探し)において、ログは最も重要な手がかりとなります。

2. 標準の出力とライブラリの違い

2. 標準の出力とライブラリの違い
2. 標準の出力とライブラリの違い

C#には、標準で文字を表示するConsole.WriteLineという命令があります。これも一種のログですが、本格的なアプリ開発では不十分です。なぜなら、標準の命令では「画面に表示するだけ」であり、過去の記録をファイルに保存したり、重要なエラーだけを色分けして目立たせたりすることが難しいからです。

そこで登場するのがライブラリです。ライブラリとは、便利な機能をまとめた「道具箱」のことです。C#で有名なログ用ライブラリには、Serilog(セリログ)NLog(エヌログ)があります。これらを使うことで、「1週間経ったら古いログファイルを消す」「エラーが発生したときだけメールを送る」といった高度な操作が簡単に行えるようになります。

3. ログの重要度「ログレベル」を理解しよう

3. ログの重要度「ログレベル」を理解しよう
3. ログの重要度「ログレベル」を理解しよう

ログには「重要度」というものがあります。これをログレベルと呼びます。すべての情報を同じように記録すると、情報が多すぎて本当に大切なエラーを見逃してしまうからです。一般的には以下のような段階に分かれています。

  • Information(情報):「アプリが起動しました」といった通常の動作記録。
  • Warning(警告):「少し怪しい動きですが、動作は続けています」という注意喚起。
  • Error(エラー):「計算に失敗しました」など、何らかの問題が発生した状態。
  • Fatal(致命的):「プログラムが強制終了します」という非常に深刻な状態。

このようにレベルを分けることで、後から「エラーだけを抜き出して確認する」といった効率的なチェックが可能になります。

4. Serilogの基本設定と使い方

4. Serilogの基本設定と使い方
4. Serilogの基本設定と使い方

まずは、現在非常に人気のあるSerilogから見ていきましょう。Serilogの特徴は、設定が非常にシンプルで、最新のC#プログラムと相性が良い点にあります。以下のコードは、画面(コンソール)にログを出すための最も基本的な書き方です。


using Serilog;

// ログの設定(どこに出すか、どのレベルまで出すかを決める)
Log.Logger = new LoggerConfiguration()
    .WriteTo.Console()
    .CreateLogger();

// ログを出力してみる
Log.Information("プログラムが開始されました");
Log.Warning("注意!データが空かもしれません");
Log.Error("エラーが発生しました");

// 最後にログを正しく閉じる
Log.CloseAndFlush();

実行結果は以下のようになります。


[20:13:46 INF] プログラムが開始されました
[20:13:46 WRN] 注意!データが空かもしれません
[20:13:46 ERR] エラーが発生しました

このコードでは、WriteTo.Console()という命令を使って、パソコンの黒い画面(コンソール)に結果を表示するように指示しています。初心者の方でも、これだけでログの第一歩を踏み出すことができます。

5. ファイルにログを保存する方法

5. ファイルにログを保存する方法
5. ファイルにログを保存する方法

画面に表示するだけでなく、ファイルとして保存するのが実務では一般的です。これを「シンク(Sink)」と呼びます。Serilogでは保存先を簡単に追加できます。次の例では、日付けごとに新しいファイルを作って保存する設定を紹介します。


using Serilog;

Log.Logger = new LoggerConfiguration()
    .WriteTo.File("logs/myapp.txt", rollingInterval: RollingInterval.Day)
    .CreateLogger();

Log.Information("このメッセージはファイルに保存されます。");

Log.CloseAndFlush();

ここで使っているrollingInterval: RollingInterval.Dayという指定は、とても便利です。これは「毎日新しいログファイルを作ってください」という意味です。一つのファイルが巨大になりすぎて、メモ帳で開けなくなるのを防いでくれます。プログラムが動いているフォルダの中に「logs」という名前の入れ物が自動で作られ、その中にテキストファイルが出来上がります。

6. NLogの基本と設定ファイルの役割

6. NLogの基本と設定ファイルの役割
6. NLogの基本と設定ファイルの役割

次に、古くから多くのシステムで使われているNLogについて解説します。NLogの特徴は、プログラム本体の中に設定を書くのではなく、nlog.configという専用の設定ファイル(XML形式)にルールを書く点にあります。これにより、プログラムを書き換えなくても、設定ファイルを書き換えるだけでログの出し方を変えられるというメリットがあります。

設定ファイル(nlog.config)のイメージは以下のようになります。


<nlog>
  <targets>
    <target name="logconsole" type="Console" />
  </targets>
  <rules>
    <logger name="*" minlevel="Info" writeTo="logconsole" />
  </rules>
</nlog>

そして、プログラム側では以下のように呼び出します。


using NLog;

// ログを扱うためのインスタンス(実体)を作る
var logger = LogManager.GetCurrentClassLogger();

logger.Info("NLogを使って情報を出力します");
logger.Error("不具合が発生しました");

XML(エックスエムエル)という形式は、最初は少し難しく感じるかもしれませんが、「どこに(targets)」「どんなルールで(rules)」出すかを整理して書くためのルールだと考えてください。

7. 構造化ロギングのメリット

7. 構造化ロギングのメリット
7. 構造化ロギングのメリット

Serilogの最大の特徴に構造化ロギングがあります。これは、単なる文章としてログを残すのではなく、データとして残す方法です。例えば、「ユーザーAがログインした」というログを残す際、従来は一つの長い文章でしたが、構造化すると「ユーザー名」という項目と「動作」という項目を分けて記録できます。


var user = "田中さん";
var count = 5;

// 文章の中に変数を埋め込む(構造化)
Log.Information("{User}さんが{Count}回目のログインをしました", user, count);

このように書くと、後から「田中さんに関するログだけを検索する」といった作業が非常に高速に行えます。大規模なシステムになればなるほど、この構造化という考え方が威力を発揮します。データの型を意識した記録ができるのは、C#のような厳格な言語において非常に相性が良い機能です。

8. どちらのライブラリを選ぶべきか?

8. どちらのライブラリを選ぶべきか?
8. どちらのライブラリを選ぶべきか?

初心者の方が「結局どっちを使えばいいの?」と迷ったときは、まずはSerilogをおすすめします。理由は、設定がC#のコードだけで完結しやすく、直感的に理解できるからです。また、最近のWeb開発(ASP.NET Coreなど)では標準的に使われることが多いため、学習したことが無駄になりにくいです。

一方で、昔からある大規模な業務システムに関わる場合は、NLogに触れる機会が多いでしょう。設定ファイルで細かく制御できるため、複雑な運用ルールが決まっている環境では根強い人気があります。どちらを使っても「ログを取る」という目的は同じですので、まずは一つの方法を完璧にマスターすることを目指しましょう。

9. 実践!エラー処理とログの組み合わせ

9. 実践!エラー処理とログの組み合わせ
9. 実践!エラー処理とログの組み合わせ

最後に、実際のプログラミングでログがどのように使われるか、エラー処理(例外処理)との組み合わせ例を見てみましょう。プログラムが予期せぬ理由で止まってしまったときに、その理由をログに書き出す例です。


using System;
using Serilog;

Log.Logger = new LoggerConfiguration().WriteTo.Console().CreateLogger();

try
{
    int a = 10;
    int b = 0;
    // 0で割り算をするとエラー(例外)が発生する
    int result = a / b;
}
catch (Exception ex)
{
    // 起きたエラーの内容をログに記録する
    Log.Error(ex, "計算中にエラーが発生しました!");
}
finally
{
    Log.CloseAndFlush();
}

実行結果は以下のようになります。


[20:13:46 ERR] 計算中にエラーが発生しました!
System.DivideByZeroException: 零で除算しようとしました。

このようにtry-catchという仕組みとログを組み合わせることで、たとえアプリが止まっても「なぜ止まったのか」が明確になります。これができるようになると、初心者から一歩進んだ「プロらしい」プログラムに近づくことができます。ログを制する者は、システム開発を制すると言っても過言ではありません。

まとめ

まとめ
まとめ

ログ出力とロギングの基本を総復習

今回はCにおけるログ出力の基本としてロギングの考え方とSerilogおよびNLogの使い方について学びました。ログ出力とはプログラムの実行状況やエラー情報を記録する仕組みであり、デバッグや運用保守において欠かせない重要な技術です。 プログラムは見た目では正常に動いているように見えても内部ではさまざまな処理が行われています。その処理の流れを記録することで、問題発生時の原因特定が容易になります。特に業務システムやWebアプリケーションではログの有無が開発効率や障害対応のスピードに大きく影響します。 ログ出力を正しく理解することは単なる補助機能ではなく、安定したシステム開発を行うための基礎スキルと言えます。

SerilogとNLogの違いと使い分け

Cで利用される代表的なログライブラリにはSerilogとNLogがあります。Serilogはコードベースで直感的に設定できるため、初心者でも扱いやすく、最近の開発環境では非常に人気があります。 一方NLogはXML形式の設定ファイルでログの出力先やルールを管理するため、運用中の設定変更が柔軟に行える点が特徴です。大規模な業務システムではこの柔軟性が重要になります。 どちらのライブラリもログレベルの管理やファイル出力、コンソール出力といった基本機能を備えており、用途や開発環境に応じて使い分けることが重要です。

ログレベルと効率的なログ管理

ログには重要度を表すログレベルがあり、InformationやWarningやErrorといった段階で分類されます。この分類により必要な情報だけを抽出しやすくなり、障害発生時の調査が効率化されます。 例えば通常の動作はInformationで記録し、異常な状態はWarningやErrorで記録することで、後からエラーだけを確認するといった運用が可能になります。 ログレベルの使い分けはシステムの可観測性を高めるために非常に重要な考え方です。

サンプルプログラムで理解を深める


using System;
using Serilog;

class Program
{
    static void Main()
    {
        Log.Logger = new LoggerConfiguration()
            .WriteTo.Console()
            .CreateLogger();

        Log.Information("処理開始");
        Log.Warning("注意が必要な状態です");
        Log.Error("エラーが発生しました");

        try
        {
            int a = 10;
            int b = 0;
            int result = a / b;
        }
        catch (Exception ex)
        {
            Log.Error(ex, "例外が発生しました");
        }

        Log.CloseAndFlush();
    }
}

実行結果


INF 処理開始
WRN 注意が必要な状態です
ERR エラーが発生しました
ERR 例外が発生しました

構造化ロギングの重要性

Serilogの特徴である構造化ロギングは単なる文字列ではなくデータとしてログを記録する仕組みです。ユーザー名や回数などの情報を分離して記録できるため、後から検索や分析がしやすくなります。 大規模なシステムではログの量が膨大になるため、このような構造化されたデータとして扱えることが大きなメリットになります。 ログを単なる記録ではなく分析対象として扱うことで、システム改善にも役立てることができます。

実務でのログ活用とポイント

実務ではログは障害対応や監視、パフォーマンス分析に活用されます。ログが適切に出力されていないと、問題が発生した際に原因を特定することが難しくなります。 そのため開発段階からログ設計を意識することが重要です。どのタイミングでどのレベルのログを出すかを事前に決めておくことで、運用がスムーズになります。 またログファイルの肥大化を防ぐために日付単位で分割するなどの運用も重要なポイントです。

理解を深めるための学習方法

ログ出力の理解を深めるためには実際にプログラムに組み込んで試すことが最も効果的です。処理の開始や終了、エラー発生箇所などにログを仕込むことで、プログラムの流れを視覚的に把握できるようになります。 またログレベルを変えて出力内容を確認することで、それぞれの役割を体感的に理解できます。実践を通じてログの重要性を実感することが上達への近道です。

先生と生徒の振り返り会話

生徒

ログ出力を使うとプログラムの動きが見えるようになりました

先生

その通りですログはプログラムの状態を知るための重要な手段です

生徒

SerilogとNLogの違いも理解できました

先生

用途によって使い分けることが大切です

生徒

ログレベルを分ける理由も納得できました

先生

必要な情報だけを効率よく確認するための仕組みです

生徒

エラー調査にも役立ちそうですね

先生

はいログを活用できれば問題解決のスピードが大きく向上します

カテゴリの一覧へ
新着記事
New1
C#
C#のLINQでWhere・Select・OrderByを使う方法を完全解説!初心者でもわかる基本操作
New2
C#
C#プログラムの実行方法まとめ!Visual Studio・コマンドライン・.NET CLIの使い方
New3
Azure
Azure DDoS ProtectionとAzure WAFの違いとは?アプリレイヤーまで守る最強の防御策を徹底解説
New4
C#
C#でHello Worldを表示する方法を完全ガイド!初心者でも1行から始められる入門講座
人気記事
No.1
Java&Spring記事人気No1
C#
C#のWPFとは?XAMLでGUI開発を基礎から完全解説!初心者向けの入門ガイド
No.2
Java&Spring記事人気No2
Azure
Azure SQL Database購入モデル比較!vCoreとDTUの違いと選び方を初心者向けに解説
No.3
Java&Spring記事人気No3
Azure
Azure ExpressRouteとBGPプロトコルを徹底解説!ルート広報の仕組みとルーティング設計の基本
No.4
Java&Spring記事人気No4
C#
C#の文字列を数値に変換する方法(int.Parse・TryParse)をわかりやすく解説!
No.5
Java&Spring記事人気No5
C#
C#のforeachループを完全ガイド!初心者でもわかるコレクション操作の基本
No.6
Java&Spring記事人気No6
C#
C#の日付型(DateTime)と基本的な使い方を解説|初心者向け入門ガイド
No.7
Java&Spring記事人気No7
C#
C#のpartialクラスとは?初心者でも理解できるクラス分割の基本
No.8
Java&Spring記事人気No8
C#
C#のラムダ式の書き方と構文を初心者向けに完全解説