早速 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) & x.Kind == searchKind
orderby x.No
select x;
}
this.dataGrid.ItemsSource = result.ToList();
}
conn.Close();
}
}
ログを出力してみる
アプリケーションをデバッグ起動します。
検索ボタンをクリックします。
コンソール出力にログが出力されるのを確認します。
実行ディレクトリ>log>yyyymmdd.log が出力されていることを確認します。
ひとまずここまで。
まとめ
Javaで log4j を使っていたので、割とすんなりいきました。
それにしても便利ですね。
次回(未定)はリソースの外部ファイル化に戻ると思います。
ではでは。
Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。
また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!
こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?
コメント