ボス級社内SEのお役立ち技術情報

社内SEのシステム開発について。メインプログラム言語C#

【VisualStudio2017 (C#)】log4net(ver 2.0.4)を使用してログを出力する

これまでプログラム中のログは自作(簡単なテキスト出力)してきました。

log4netは、大変便利との噂を聞いたので導入してみました。

 

環境

OS:Windows10 64bit

開発環境:VisualStudio2017

プログラム言語:C#

ライブラリ:log4net  ver 2.0.4

 

Nugetよりlog4netをインストールする

Nugetパッケージマネージャを起動する。

f:id:HLSE:20190205200819j:plain

 

log4netを検索しインストールする

「参照」を開きlog4netを入力してENTERを押す

f:id:HLSE:20190205201300j:plain

検索で表示されたlog4netを選択し、インストールするプロジェクト先にチェックを入れる(右側の赤アンダーバー)

f:id:HLSE:20190205201437j:plain

インストールボタンを押すと数秒でインストールが完了します。

f:id:HLSE:20190110162523j:plain

 

log4netの設定

設定値の保存場所を設定する

以下コードをAssemblyInfo.csの最終行に追加します。

[assembly: log4net.Config.XmlConfigurator(Watch=true)]

f:id:HLSE:20190110155339j:plain

using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
 
// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。
// アセンブリに関連付けられている情報を変更するには、
// これらの属性値を変更してください。
[assemblyAssemblyTitle("DbConnector")]
[assemblyAssemblyDescription("")]
[assemblyAssemblyConfiguration("")]
[assemblyAssemblyCompany("")]
[assemblyAssemblyProduct("DbConnector")]
[assemblyAssemblyCopyright("Copyright ©  2019")]
[assemblyAssemblyTrademark("")]
[assemblyAssemblyCulture("")]
 
// ComVisible を false に設定すると、このアセンブリ内の型は COM コンポーネントから
// 参照できなくなります。COM からこのアセンブリ内の型にアクセスする必要がある場合は、
// その型の ComVisible 属性を true に設定してください。
[assemblyComVisible(false)]
 
// このプロジェクトが COM に公開される場合、次の GUID が typelib の ID になります

[assemblyGuid("bbc6b514-4489-405c-b2b9-375350c0d2a6")] // アセンブリのバージョン情報は次の 4 つの値で構成されています: // //      メジャー バージョン //      マイナー バージョン //      ビルド番号 //      Revision // // すべての値を指定するか、次を使用してビルド番号とリビジョン番号を既定に設定できます // 既定値にすることができます: // [assembly: AssemblyVersion("1.0.*")] [assemblyAssemblyVersion("1.0.0.0")] [assemblyAssemblyFileVersion("1.0.0.0")] [assembly: log4net.Config.XmlConfigurator(Watch = true)] ←ここに追加
出力するログ設定

App.configにlog4netの設定を追加します。

f:id:HLSE:20190110162737j:plain

<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
  </configSections>
 
 
 <
log4net>     <!-- Appender -->     <appender name="AllAppender" type="log4net.Appender.RollingFileAppender" >       <!-- ログ・ファイル名の先頭部分 -->       <param name="File" value=".\log\all.log" />       <!-- ファイル名の日付部分 -->       <param name="DatePattern" value='yyyyMMdd".log"' />       <!-- Size:MaximumFileSize で指定したサイズに達した場合に切換 -->       <param name="RollingStyle" value="Size" />       <!-- ログ・ファイル名が固定ではないので“false”を指定 -->       <param name="StaticLogFileName" value="false" />       <!-- 追加で書き込みをする -->       <appendToFile value="true" />       <!-- 全てのログ・レベルとする -->       <filter type="log4net.Filter.LevelRangeFilter">         <param name="LevelMax" value="FATAL" />         <param name="LevelMin" value="DEBUG" />       </filter>       <!-- rollingStyle がSizeまたはCompositeの時の最大ファイルサイズ -->       <param name="MaximumFileSize" value="10MB" />       <!-- ファイルを切替えるマックス数。無限はマイナス-->       <param name="MaxSizeRollBackups" value="12" />       <!-- ログの書式 -->       <layout type="log4net.Layout.PatternLayout">         <conversionPattern value="%d  [スレッド=%t] [%-5level] (メソッド名=%M %L行目) - %m%n"/>       </layout>     </appender>          <root>       <!-- すべてのログを出力したい場合 -->       <level value="All" />       <!-- どのログ出力先を使用するか -->       <appender-ref ref="AllAppender" />     </root>   </log4net>
 ・
 ・
 ・
</configuration>
指定クラスでログを出力

まず赤文字を加えます。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace DbConnector
{
    public partial class Form1 : Form
    {
        public static log4net.ILog logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);         public Form1()         {             InitializeComponent();         }         private void sqlServerBt_Click(object sender, EventArgs e)         {             try             {                 SQLSERVER s = new SQLSERVER();                 s.Open("localhost,1433""AdventureWorks20167""sqlserver""sqlserver");                 DataTable dt = s.ExecuteQuery(@"select * from Person.Person");                 showDgv.DataSource = dt;             }             catch (Exception ex)             {                 logger.Error(ex.HResult + Environment.NewLine);             }         }     } }

 

出力したい個所に「logger.Error(出力したい文字列)」を追加します。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace DbConnector
{
    public partial class Form1 : Form
    {
        public static log4net.ILog logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
 
        public Form1()
        {
            InitializeComponent();
        }
 
        private void sqlServerBt_Click(object sender, EventArgs e)
        {
            try
            {
                SQLSERVER s = new SQLSERVER();
                s.Open("localhost,1433""AdventureWorks20167""sqlserver""sqlserver");
                DataTable dt = s.ExecuteQuery(@"select * from Person.Person");
                showDgv.DataSource = dt;
            }
            catch (Exception ex)
            {
                logger.Error(ex.HResult + Environment.NewLine);
            }
        }
    }
}

 

このloggerのメソッドは以下種類があります。

logger.Fatal
logger.Error
logger.Warn
logger.Info
logger.Debug

 

以上でexeファイルと同じディレクトリにlogフォルダが作成されファイルが作成されます。

 

実戦で役立つ C#プログラミングのイディオム/定石&パターン

実戦で役立つ C#プログラミングのイディオム/定石&パターン