【WPF】log4netでログ出力をする方法を試す

2017年6月10日C#,開発

おはようございます。

早速 log4net を使ってログ出力を試してみました。

プログラムは前回のものを使用します。

【WPF】SQLite から Linq でデータを取得してDataGrid に表示してみる

スポンサーリンク

Nuget によりパッケージをダウンロード

前回と同様、 Nuget でパッケージを入手、インストールします。

プロジェクトのコンテキストメニュー

ソリューションエクスプローラーからプロジェクトを選択、右クリックし
「Nuget パッケージの管理」を選択します。

Nuget パッケージ管理画面

Nuget パッケージ管理画面が表示されるので、
検索窓に「log4net」を入力し、「log4net」を選択、インストールボタンをクリックします。

確認画面

変更の確認ダイアログが表示されるので、
「OK」ボタンをクリックします。

出力ビュー

出力ビューに「終了」が出力されればOKです。

アセンブリ設定ファイルの修正

プロジェクトのプロパティ

次のファイルに記述を追加します。

App.config に log の出力設定を記述する方法と、
別ファイルに記述する方法があるようですが、今回は別ファイルとします。

AccemblyInfo.cs

// log4net を利用するための設定
//
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "../../log4net.config", Watch = true)]

設定ファイルの追加

log4net.config を新規作成

新しい項目の追加
アプリケーション構成ファイルの作成

log4net.config

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

  <appSettings>
    <!-- log4net 内部のデバッグメッセージを出力 -->
    <add key="log4net.Internal.Debug" value="true" />
  </appSettings>

  <log4net>
    <!-- コンソール出力用のアペンダ -->
    <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
      <!-- 出力文字列のフォーマット -->
      <layout type="log4net.Layout.PatternLayout">
        <!--^「日付、スレッド、レベル、logger名、メッセージ」が出力^-->
        <!--^「%-5p」というのは5文字以下の場合、右側に空白を入れる設定^-->
        <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" />
      </layout>
    </appender>

    <!-- ファイル出力用のアペンダ(日付でローテーション) -->
    <appender name="DailyFileAppender"
      type="log4net.Appender.RollingFileAppender">
      <!-- ログファイルの切替 { サイズ: Size, 日付: Date } -->
      <param name="RollingStyle" value="Date" />
      <!-- ファイル名 -->
      <param name="File" value="log/" />
      <!-- ファイル名に付加する日付パターン -->
      <param name="DatePattern" value='yyyyMMdd".log"' />
      <!-- ファイル名の固定 -->
      <param name="StaticLogFileName" value="false" />
      <!-- ファイル書き込み { 追記: true, 上書き: false } -->
      <param name="AppendToFile" value="true" />
      <!-- 出力文字列のフォーマット -->
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%-5level %date{yyyy/MM/dd HH:mm:ss, fff} [%thread] %logger - %message%newline" />
      </layout>
    </appender>

    <!-- デフォルトの出力設定 -->
    <root>
      <level value="ALL" />
      <appender-ref ref="ConsoleAppender" />
      <appender-ref ref="DailyFileAppender" />
    </root>
  </log4net>
</configuration>

検索ボタンクリック時にログを出力

次の記述を追加します。

using log4net;

ILog logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
logger.Info("MainWindows 検索ボタンクリック");

 

MainWindow.xaml.cs(クリックイベントのみ抜粋)

using log4net; 

        /// <summary>
        /// 検索ボタンクリックイベント.
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void search_button_Click(object sender, RoutedEventArgs e)
        {
            ILog logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
            logger.Info("MainWindows 検索ボタンクリック");

            using (var conn = new SQLiteConnection("Data Source=SampleDb.sqlite"))
            {
                conn.Open();

                // 猫データマスタを取得してコンボボックスに設定する
                using (DataContext con = new DataContext(conn))
                {
                    String searchName = this.search_name.Text;
                    String searchKind = (this.search_kind.SelectedValue as Kind).KindCd;

                    // データを取得
                    Table<Cat> tblCat = con.GetTable<Cat>();

                    // サンプルなので適当に組み立てる
                    IQueryable<Cat> result;
                    if (searchKind == "") {
                        // 名前は前方一致のため常に条件していしても問題なし
                        result = from x in tblCat
                                 where x.Name.StartsWith(searchName)
                                 orderby x.No
                                 select x;
                    }
                    else
                    {
                        result = from x in tblCat
                                 where x.Name.StartsWith(searchName) & x.Kind == searchKind
                                 orderby x.No
                                 select x;

                    }
                    this.dataGrid.ItemsSource = result.ToList();

                }

                conn.Close();
            }

        }

 

ログを出力してみる

アプリケーションをデバッグ起動します。

サンプルアプリ起動

検索ボタンをクリックします。

コンソール出力

コンソール出力にログが出力されるのを確認します。

ログファイルの出力

実行ディレクトリ>log>yyyymmdd.log が出力されていることを確認します。

ひとまずここまで。

まとめ

Javaで log4j を使っていたので、割とすんなりいきました。
それにしても便利ですね。

次回(未定)はリソースの外部ファイル化に戻ると思います。

ではでは。

 

スポンサーリンク


関連するコンテンツ

2017年6月10日C#,開発C#,log4net,WPF,プログラミング

Posted by doradora