LoginSignup
34
50

More than 3 years have passed since last update.

【C#, log4net】log4netを使う

Last updated at Posted at 2019-11-06

やり方をよく忘れるので記録。健忘症どころじゃない。
今回はロガーの初期化(設定読み込み)とロガーインスタンス取得に的を絞るため、設定ファイルの詳細については書かない。

環境

・IDEはVisual Studio 2017を使用

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

ソリューションエクスプローラでプロジェクトを右クリックし「NuGetパッケージの管理」を選択する。NuGetからlog4netを検索してインストールする。
 ※この時の最新版は2.0.8でした。
image.png

2. プロジェクトにlog4netの設定ファイルを追加する

今回はプロジェクト直下に配置する。
ソリューションエクスプローラでプロジェクトを右クリックして「追加」→「新しい項目」を選択し、開いたダイアログで「アプリケーション構成ファイル」を選択log4net.configという名前でファイルを追加する。
image.png

3. log4netの設定ファイル(log4net.config)の中身を記述する

設定の書き方は下記のサイトが参考になる↓
 ・オープンソースのロギング・サービス「log4net」を使う
 ・[log4net] log4netの設定
 初めてロガーを使う方は、最初はサイトの設定ファイルを丸コピして動作確認し、それから独自の設定に変えるようにしたほうがベターだと思われる。
 

4. log4net.configのプロパティを変更する

image.png
ソリューションエクスプローラでlog4net.configをクリックしてプロパティを表示させ、下記のように変更する。
 ・「ビルドアクション」:なし
 ・「出力ディレクトリにコピー」:新しい場合はコピーする
 2つ目の設定をしないと「エラーはでないのにログが全然吐かれない!」という事態が起きるので注意。

5. AssemblyInfoにlog4netを初期化するコードを記述する

 ・AssemblyInfo.csファイルを開く(居場所は下の画像を参照)
image.png

AssemblyInfo.csに下記の初期化コードを追記する
 ※ConfigFile = にはlog4netの設定ファイルの相対パスを指定している。今回設定ファイルはプロジェクト直下にあるためファイル名の頭に何もくっつけてない。

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

ちなみに初期化は任意のクラスでできる。クラスのフィールドに下記のようにして書けばそこに制御が移った時に初期化が行われる。
ただこの場合はロガーを使用する前に初期化が済んだ状態になるよう、処理の順序に気を付ける。

XXXXX.cs
log4net.Config.XmlConfigurator.Configure(new System.IO.FileInfo("log4net.config"));

 

6. ロガーインスタンスを取得する

ロガーを使用するクラスのフィールドに下記のコードを書く。

XXXXX.cs
private static readonly log4net.ILog _logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

GetLoggerメソッドでロガーインスタンスを取得するが、そのときに自身の型(正確に言えばこのメソッドの呼び出し元が宣言されているクラス)を渡し、自身がどこのクラスかを教えている。

7. ロガーインスタンスを使ってログ出力する

ログレベルに応じたメソッドを用い、出力したい文字列を引数に渡す。
try-catch句で使えば第2引数にExceptionオブジェクトを渡してスタックトレースを出力する事も可能。

下記はサンプル

XXXXX.cs
            _logger.Debug("デバッグ用");
            _logger.Info("インフォメーション用");
            _logger.Warn("警告用");
            _logger.Error("エラー用");

            int result = 50;
            _logger.Debug($"結果は{result}です。");

            try
            {
                 hogeFile.Close();
            }
            catch (Exception e)
            {
                _logger.Warn("例外が発生しました。", e);
            }

 

自身がはまった時に確認したポイント

低レベルなことではまってますがご参考までに。
・出力したいログと設定ファイル(log4net.config)のログレベルの設定はマッチしているか?
 自身が出力したいレベルより高いレベルを設定していないかな・・・
・log4net.configファイルのプロパティ「出力ディレクトリにコピー」は「コピーしない」になっていないか?

その他注意点

ロガーインスタンスを取得するコードはフィールドの一番上に書く。
というのも、ログ出力は色々なタイミングで行うであろうものなので、その準備はクラス初期化時の最初に終わらせた方が良い。

log4netについて参考にさせて頂いたサイト

・log4netの処理について深堀したいときに参考にさせて頂いた
 きなこもち.net

34
50
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
34
50