SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

log4netでデバッグや障害解析に役立つログを出力する

.NET環境における効果的なログ出力


  • X ポスト
  • このエントリーをはてなブックマークに追加

使用方法(設定ファイル)

 プログラムに記述したFatalDebugなどのログ出力メッセージを、どのようにして出力するかについては、構成ファイルと呼ばれるXMLファイルに記述します。構成ファイルはexe名(dll名)+.configからという名称で作成します(Visual Studio上は「App.config」という名前にて管理されます)。

ログの出力先「アペンダ(Appender)」の設定

 log4netでは、アペンダ(ログ出力用クラス)を選択することによって、ログの出力先(ファイル・メール等)を変更することができます。以下の例では、ファイルに出力するため「log4net.Appender.FileAppender」を「App.config」の<appender>タグで指定しています。

「App.config」 抜粋
<appender name="FileAppender" type="log4net.Appender.FileAppender">
    <param name="File" value="Fileサンプル.log" />
    <param name="AppendToFile" value="true" />
     (中略)
</appender>

 これで「Fileサンプル.log」というファイルにログが出力されるようになります。

代表的なアペンダについて

 なお、FileAppender以外にも様々なアペンダがありますので、代表的なアペンダについて紹介します。

ADONetAppender

 データベースに保存できるため、複数のAPサーバが存在する場合などには情報を一元管理できるというメリットがあります。しかし、データベースに接続できないときは、SMTPAppenderなどと組み合わせて障害通知を行う必要があります。

ConsoleAppender

 コンソールに出力を行う標準的なアペンダです。

EventLogAppender

 イベントビューアというWindowsに付属のイベントログ監視画面にアプリケーションログを出力します。ただしローカルのPCにしかイベントを出力することができません。

FileAppender

 ファイルにログを出力します。シンプルですがファイルサイズが大きくなりすぎる可能性があるため、RollingFileAppenderを使用することを推奨します。

NetSendAppender

 Messengerサービスにて動作するNetSendコマンドを用いて、障害をダイレクトにユーザ通知することができます。

RollingFileAppender

 ファイルにログを出力します。ファイルサイズや時刻によって自動的にログファイルの分割(切替)を行うことができるので、利用されることの多いアペンダです。

SMTPAppender

 メール送信を行います。TOに複数の指定はできますが、CCBCCの指定は行えません。

UdpAppender

 UDP(User Datagram Protocol)にてログ出力を行います。UDPの受け先としては、log4jのログビューアである「Chainsaw」等が指定できます。

 なお、今回はWindowsアプリケーションのため紹介していませんが、ASPで使用可能なASPNetTraceAppenderというアペンダも存在します。また、アペンダによって設定できるパラメータが異なりますので、詳細についてはサンプルソースやlog4netのマニュアルをご覧ください。

レイアウト(Layout)の設定

 log4netではプログラムに記述したメッセージだけではなく、日時・レベルといった付加情報も合わせて出力することができます。この機能のことをレイアウトと呼びます。

「App.config」 抜粋
<appender name="FileAppender" type="log4net.Appender.FileAppender">
     (中略)
    <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern"
         value="%d [%t] %-5p %c - %m%n" />
    </layout>
</appender>

 この例では、<layout>タグでパターンレイアウト「log4net.Layout.PatternLayout」を指定し「ConversionPattern」にて出力内容を定義しています。上記の設定の出力例は以下のようになります。

2005-04-25 04:51:33,453 [2096] FATAL Log4netSample.frmLog4netSample
 - log4netによるログ出力例~Fatal(致命的障害)
2005-04-25 04:51:33,453 [2096] ERROR Log4netSample.frmLog4netSample
 - log4netによるログ出力例~Error(障害)
2005-04-25 04:51:33,468 [2096] WARN  Log4netSample.frmLog4netSample
 - log4netによるログ出力例~Warn(警告)
2005-04-25 04:51:33,468 [2096] INFO  Log4netSample.frmLog4netSample
 - log4netによるログ出力例~Info(情報)
2005-04-25 04:51:33,468 [2096] DEBUG Log4netSample.frmLog4netSample
 - log4netによるログ出力例~Degug(デバッグ・トレース用)

 設定したパターン「"%d [%t] %-5p %c - %m%n"」の通りに「日付、スレッド、レベル、logger名、メッセージ」が出力されていることがわかります。なお「%-5p」というのは5文字以下の場合、右側に空白を入れる設定です。そのためWARNINFOといった4文字のレベルのメッセージが表示されてもレイアウトが崩れなくなります(「%5p」というようにマイナスを指定しない場合は左側に空白が入ります)。PatternLayoutで指定できるパターンを表に整理しておきますので、出力したいメッセージに応じてConversionPatternを設定すると良いでしょう。

表2 PatternLayoutで指定できるパターン
パターン説明
%cログ出力が行われたlogger名を出力。
%Cクラスを出力。
%d日時を出力。「%d{yyyy/mm/dd HH:mm:ss}」といった詳細指定も可能。
%Fファイル名を出力。
%lソース名や行といった呼び出し位置を出力。
%L行番号を出力。
%mメッセージを出力。
%Mメソッド名を出力。
%n改行文字を出力。
%pログのレベル(Fatal/Errorなど)を出力。
%tログを生成したスレッドを出力。
%xスレッドのNDC(ネスト化診断コンテキスト) を出力。スレッド固有の情報(セッションIDなど)を埋め込むことができます。
高負荷のパターン
 %C、%F、%l、%L、%Mの場合は処理負荷が高くなるため必要な時以外は使用しないように注意してください。

 なお、レイアウトには「SimpleLayout(レベルとメッセージを表示)」や「XmlLayout(Xml形式の出力)」など、幾つかの種類がありますが、たいていの場合、ログの整形が簡単なパターンレイアウトが採用されます。

出力対象「logger」の設定

 log4netではloggerの階層によってログの出力を制御することができます。

 Log4netSample
    ├ MyTeam
    │ └ MyProgram
    └ OtherTeam

 今回のサンプルの名前空間は下記のようになっています。そのため、自分のチームはWarnレベル、他チーム分はFatal、自分の担当プログラムはDebugレベルで出力するといったことが可能になります。

「App.config」 抜粋
<!-- 担当チームのログはWARN以上を出力。Fileにも出力 -->
<logger name="Log4netSample.MyTeam">
    <level value="WARN" />
    <appender-ref ref="FileAppender" /> 
</logger>

<!-- 他チームのログはFATAL以上を出力 -->
<logger name="Log4netSample.OtherTeam">
    <level value="FATAL" />
</logger>
        
<!-- 担当プログラムのログはDEBUG以上を出力 -->
<logger name="Log4netSample.MyTeam.MyProgram">
    <level value="DEBUG" />
</logger>

 このように<logger>タグを用いloggerの階層ごとにレベルとアペンダを設定することができます。レベルの指定には<level>タグを指定し、アペンダの指定には<appender-ref>タグが使用できます。またアペンダは複数指定できるため、一つのログメッセージを複数の出力先に送信することも可能です。

 なお、loggerの階層はloggerのインスタンスを取得するGetLoggerメソッドの引数で指定します。今回のサンプルでは「System.Reflection.MethodBase.GetCurrentMethod().DeclaringType」を呼び出しているためクラスの完全修飾クラス名とloggerの階層が一致しています。

Rootの設定

 最後に全体のデフォルトとなる設定を行います。

「App.config」 抜粋
<root>
    <level value="ERROR" />
    <appender-ref ref="ConsoleAppender" />
</root>

 ログ出力のデフォルト設定は「Root(logger階層の最上位の意味)」と呼ばれ、「App.config」の<root>タグにて指定します。今回の例では、レベルをErrorに設定し、コンソール出力用のアペンダを指定しています。

次のページ
設定方針について

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
特集記事連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 青木 淳夫(アオキ アツオ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/71 2007/11/14 14:33

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング