開発したアプリケーションをリリースした後に、不具合が発生した時に「何が問題なのか」を特定するのに欠かせないのは、ログですよね。
ログ情報があれば、どの処理が原因で発生しているか分かりますし、問題解決までのスピードもグーンと上がります。
アプリケーション開発を行う上で、ログが出力される様に設計しておくことは、とても大切なことなのです。
このサイトでは「NLog」というライブラリーを使って、C#で開発したアプリケーションからログを出力する方法についてご紹介します。
この記事の手順で設定すれば10分程度で準備でき、すぐにログを出力することができるでしょう。
それではやってみましょう。

オススメの参考書
C#の使い方が丁寧に解説しており、「基礎からしっかりと学びたい」という初心者の方にオススメの一冊です。サンプルコードも記載してあり、各章の最後に復習問題があるので理解度を確認しながら読み進めることができます。新しい C# のバージョンにも対応している書籍です。
NLogをインストールする

NLog を導入するために、Nuget からパッケージをインストールします。
今回導入する環境は以下になります。
- OS:Windows 10 Home
- 開発環境:Visual Studio 2019
- 言語:C#
- 開発プラットフォーム:WPF
Visual Studio を起動して、ログを出力したいプロジェクトを開きます。次の手順でインストールをします。
NLogがサポートしているプラットフォームは多く、C#でよく開発される.NETやUWP、Xamarinなどにも対応しています。
サポートしているプラットフォーム
- .NET 5
- .NET Core 1, 2 and 3
- .NET Standard 1.3+ and 2.0+;
- .NET Framework 3.5, 4, 4.5, 4.6, 4.7 & 4.8
- .NET Framework 4 client profile
- Xamarin Android, Xamarin iOs
- UWP
- Windows Phone 8
- Silverlight 4 and 5
- Mono 4
インストールが完了したら、参照にNLogが追加されていることを確認しましょう。参照に追加されていればインストール成功です。
NLogの初期設定をする

次に NLog でログを出力するための初期設定を行います。
ソリューションエクスプローラーから、MainWindow.xaml.cs を選択してファイルを開きます。NLog の初期設定を追加していきましょう。
使用する名前空間をusigディレクティブで指定をします。プログラムの先頭に3つの名前空間を指定します。
//参照先を追加
using NLog;
using NLog.Config;
using NLog.Targets;
NLogを初期設定するための関数を追加します。
// ログを出力するロガー定義
static public Logger logger = LogManager.GetCurrentClassLogger();
// NLogを使う為の初期設定
public static void InitializeLogger()
{
// LoggingConfigurationを生成
var config = new LoggingConfiguration();
// FileTargetを生成し LoggingConfigurationに設定
var fileTarget = new FileTarget();
config.AddTarget("file", fileTarget);
// fileTargetのプロパティを設定
fileTarget.Name = "f";
fileTarget.FileName = "${basedir}/Logs/${shortdate}.log";
fileTarget.Layout = "${longdate} [${uppercase:${level}}] ${message}";
// LoggingRuleを定義
var rule1 = new LoggingRule("*", LogLevel.Debug, fileTarget);
config.LoggingRules.Add(rule1);
// 設定を有効化
LogManager.Configuration = config;
}
InitializeLogger()
は、アプリケーションがあるフォルダの階層に自動で「Logs」フォルダを作成します。このフォルダの中に日付毎にファイルを作成し、アプリケーションのログ情報をファイルに記録します。
ログを出力するサンプル
NLogを使用したサンプルコードをみていきましょう。
//参照先を追加
using NLog;
using NLog.Config;
using NLog.Targets;
using System.Windows;
namespace NLogSample
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
// NLogの初期化処理
InitializeLogger();
// ログ出力
logger.Info("NLogを使ってみた!");
}
// ログを出力する変数定義
static public Logger logger = LogManager.GetCurrentClassLogger();
// NLogを使う為の初期設定
public static void InitializeLogger()
{
// LoggingConfigurationを生成
var config = new LoggingConfiguration();
// FileTargetを生成し LoggingConfigurationに設定
var fileTarget = new FileTarget();
config.AddTarget("file", fileTarget);
// fileTargetのプロパティを設定
fileTarget.Name = "f";
fileTarget.FileName = "${basedir}/Logs/${shortdate}.log";
fileTarget.Layout = "${longdate} [${uppercase:${level}}] ${message}";
// LoggingRuleを定義
var rule1 = new LoggingRule("*", LogLevel.Debug, fileTarget);
config.LoggingRules.Add(rule1);
// 設定を有効化
LogManager.Configuration = config;
}
}
}
サンプルを見れば分かりますが、ログを出力する方法はとても簡単です。先程追加したロガーのログレベルを指定し、第1引数にログとして出力させたいメッセージを渡すだけです。
プログラムを実行して、ログが出力されていることを確認しましょう。Logsフォルダの中にあるテキストファイルを開きます。

テキストファイルに下のように記録されていれば、成功です。

ログレベルは6種類ある
ログレベルにログ情報を区別します。例外が発生した時は、エラーとしてログに残したり、一時的な障害が発生した時は、警告としてログに残すことができます。6種類のログレベルがあるので、使い分けてログの情報量を増やしましょう。
- Debug:デバック中のログを出力するときに使用します。※開発中のみ有効です。
- Trace:より詳細なデータを出力するときに使用します。※開発中のみ有効です。
- Info:メッセージを出力したいときに使用します。
- Warn:一時的な障害に関する警告メッセージを出力したいときに使用します。
- Error:例外情報を出力するときに使用します。
- Fatal:非常に重大なエラーメッセージを出力するときに使用します。
//各ログレベルの出力サンプル
logger.Trace("Trace message");
logger.Debug("Debug message");
logger.Info("Informational message");
logger.Warn("Warning message");
logger.Error("Error message");
logger.Fatal("Fatal error message");

指定したログレベルによって以下の様にログが記録されます。
例外が発生したときにエラーレベルでログを出力させたいときは次の様に記載します。
// 例外が発生した時の情報を出力する
try
{
//例外が発生する処理を意図的に記載
var str = new string[] { "" };
str[1] = "";
}
catch (Exception ex)
{
logger.Error(ex);
}
まとめ

NLogを使ってログを出力する方法について紹介しました。
ログを残すことで問題が発生したときに素早く問題に対する対処が行えるので、まだログを出力する機能を実装していない方はNLogを活用しましょう。



以上、最後まで読んでいただきありがとうござました。