【WPF】log4netでログ出力をする方法を試す
おはようございます。
早速 log4net を使ってログ出力を試してみました。
プログラムは前回のものを使用します。
【WPF】SQLite から Linq でデータを取得してDataGrid に表示してみる
スポンサーリンク
Nuget によりパッケージをダウンロード
前回と同様、 Nuget でパッケージを入手、インストールします。
ソリューションエクスプローラーからプロジェクトを選択、右クリックし
「Nuget パッケージの管理」を選択します。
Nuget パッケージ管理画面が表示されるので、
検索窓に「log4net」を入力し、「log4net」を選択、インストールボタンをクリックします。
変更の確認ダイアログが表示されるので、
「OK」ボタンをクリックします。
出力ビューに「終了」が出力されればOKです。
アセンブリ設定ファイルの修正
次のファイルに記述を追加します。
App.config に log の出力設定を記述する方法と、
別ファイルに記述する方法があるようですが、今回は別ファイルとします。
AccemblyInfo.cs
1 2 3 | // log4net を利用するための設定 // [assembly:log4net.Config.XmlConfigurator(ConfigFile="../../log4net.config",Watch=true)] |
設定ファイルの追加
log4net.config を新規作成
log4net.config
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | <?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> |
検索ボタンクリック時にログを出力
次の記述を追加します。
1 2 3 4 | usinglog4net; ILog logger=LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); logger.Info("MainWindows 検索ボタンクリック"); |
MainWindow.xaml.cs(クリックイベントのみ抜粋)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | usinglog4net; /// <summary> /// 検索ボタンクリックイベント. /// /// </summary> /// <param name="sender"></param> /// <param name="e"></param> privatevoidsearch_button_Click(objectsender,RoutedEventArgse) { ILog logger=LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); logger.Info("MainWindows 検索ボタンクリック"); using(varconn=newSQLiteConnection("Data Source=SampleDb.sqlite")) { conn.Open(); // 猫データマスタを取得してコンボボックスに設定する using(DataContext con=newDataContext(conn)) { StringsearchName=this.search_name.Text; StringsearchKind=(this.search_kind.SelectedValue asKind).KindCd; // データを取得 Table<Cat>tblCat=con.GetTable<Cat>(); // サンプルなので適当に組み立てる IQueryable<Cat>result; if(searchKind==""){ // 名前は前方一致のため常に条件していしても問題なし result=fromxintblCat wherex.Name.StartsWith(searchName) orderbyx.No selectx; } else { result=fromxintblCat wherex.Name.StartsWith(searchName)& x.Kind == searchKind orderby x.No select x; } this.dataGrid.ItemsSource=result.ToList(); } conn.Close(); } } |
ログを出力してみる
アプリケーションをデバッグ起動します。
検索ボタンをクリックします。
コンソール出力にログが出力されるのを確認します。
実行ディレクトリ>log>yyyymmdd.log が出力されていることを確認します。
ひとまずここまで。
まとめ
Javaで log4j を使っていたので、割とすんなりいきました。
それにしても便利ですね。
次回(未定)はリソースの外部ファイル化に戻ると思います。
ではでは。
ディスカッション
コメント一覧
まだ、コメントがありません