2019-02-04に更新

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

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

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

WPFでSQLiteを使ってデータを DataGrid に表示してみる

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はβバージョンで開発中です。進捗は公式Twitterアカウントをフォローして確認してください。 興味がある方は是非記事の投稿もお願いします! どんな軽い内容でも嬉しいです。
なぜCrieitを作ろうと思ったか

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

関連記事

コメント