2019-02-04に更新

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

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

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

WPFでSQLiteを使ってデータを 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) &amp; x.Kind == searchKind
                                 orderby x.No
                                 select x;

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

                }

                conn.Close();
            }

        }

 
ログを出力してみる
アプリケーションをデバッグ起動します。

サンプルアプリ起動

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

コンソール出力

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

ログファイルの出力

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

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

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

ではでは。

 

Originally published at www.doraxdora.com

doraxdora

IT関係の仕事をしています/1985年生まれの東京在住/便利なサービスやツール漁りや料理などが好き/2017年~ブログやってます/自分でサービスとか作ってリリースしたい/何かありましたらお気軽にDMどうぞ

Crieitは個人で開発中です。 興味がある方は是非記事の投稿をお願いします! どんな軽い内容でも嬉しいです。
なぜCrieitを作ろうと思ったか

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください!

ボードとは?

関連記事

コメント