Help us understand the problem. What is going on with this article?

log4netを使用してC#.Net(WindowsForm)にログ出力機能を仕込む

More than 1 year has passed since last update.

log4netとは

Apacheが開発しているログ出力用のコンポーネントライブラリです。
数年ぶりに".net"を触ったのでいろいろ調べたのですがまだこのlog4netが主流のようですね。

復習がてら基本的な使い方を記述していきます。
新規のWindowsFormプロジェクトにlog4netを使用したログを仕込む所までやっていこうと思います。

前提

自分の環境は以下の通り。

  • windows 10
  • C#を使用
  • IDEはVisualStudio2017を使用
  • .net framework のverは4.6

VB.Netでも適宜読み替えて頂ければ参考にはなるかと思います。

使い方

1. dllをDLする

nugetから直接インストールもできますが、ここではApache公式からDLすることとします。

https://logging.apache.org/log4net/download_log4net.cgi
Binariesのlog4net-2.0.8-bin-newkey.zipをDLします。

2. 任意の場所に置き解凍する

自分はプロジェクト直下のbinフォルダ配下に解凍しました。

3. dllの参照設定を追加する

VisualStudioの参照マネージャーからdllを追加します。
dllは解凍したディレクトリ内のbinの配下にあります。

.\log4net-2.0.8\bin

各種環境用のdllが用意されていますので自分の環境に合わせてdllを参照してください。
自分の場合は下記を追加しました。

.\log4net-2.0.8\bin\net\4.5\release\log4net.dll

※ .net frameworkのverは4.6を使用していますが、log4netの方が4.5までしかなかったので4.5を選択しました。

4. AssemblyInfo.csに設定を追記する。

AssemblyInfo.csに下記設定を追記します。

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

Watchを定義することで、設定を変更した際再ロードされるかどうかを設定することができます。

他には設定ファイルとして、どのファイルを参照するか指定することもできるようです。
デフォルトではapp.config(web.config)を参照するようになっています。
今回はapp.configに直接log4net関連の設定を記述していくこととします。

5. app.configにlog4netの設定を記述する。

自分は大体下記のような感じで記述しました。

app.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <log4net>
        <appender name="tryLogAppender" type="log4net.Appender.RollingFileAppender" >
            <File value=".\log\" />
            <DatePattern value='yyyyMMdd".log"' />
            <StaticLogFileName value="false" />
            <RollingStyle value="date" />
            <AppendToFile value="true" />
            <MaximumFileSize value="100MB" />
            <MaxSizeRollBackups value="30" />
            <layout type="log4net.Layout.PatternLayout">
                <ConversionPattern value="%date [%thread] [%-5level] (%method) - %message%n" />
            </layout>
        </appender>
        <filter type="log4net.Filter.LevelRangeFilter">
            <LevelMax value="FATAL" />
            <LevelMin value="DEBUG" />
        </filter>
        <root>
            <level value="Debug" />
            <appender-ref ref="tryLogAppender" />
        </root>        
    </log4net>
</configuration>

<root>
どの<appender>を使用するかを指定します。

<appender>
ログの出力内容を定義している要素です。

出力先は今回は相対パスで書いています。
この相対パスは実行ファイルからみての相対パスになります。

xmlの各要素については、下記サイトが参考になりました。
https://tomosoft.jp/design/?p=3123

6. ログを仕込む

ここまででlog4netの準備は完了です。
あとは実際のソースコード上でlogを出力させていくだけです。

ログを仕込みたいクラスでlog4netのインスタンスを取得します。

Form1.cs
    public partial class Form1 : Form
    {

        private static log4net.ILog logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

ログを呼び出したい場所に下記のような形でログを仕込みます。
button1はForm上に単純にbuttonを置いただけです。

Form1.cs
        public Form1()
        {
            InitializeComponent();
            logger.Fatal("log1");
            logger.Error("log2");
            logger.Warn("log3");
            logger.Info("log4");
            logger.Debug("log5");
        }

        private void button1_Click(object sender, EventArgs e)
        {
            logger.Debug("ボタンが押されたよ");
        }

ここらへん、ラッパークラスなどを作って独自で管理・拡張しているプロジェクトなどよく見るイメージです。
今回は一番シンプルな形で仕込んでいます。

7. 実行してみる

デバッグを開始してbutton1をバンバン連打してみました。

\bin\Debug\logsにlogファイルが出力されました。
logファイルには下記のように出力されています。

20181030.log
2018-10-30 17:53:45,280 [1] [FATAL] (.ctor) - log1
2018-10-30 17:53:45,306 [1] [ERROR] (.ctor) - log2
2018-10-30 17:53:45,307 [1] [WARN ] (.ctor) - log3
2018-10-30 17:53:45,308 [1] [INFO ] (.ctor) - log4
2018-10-30 17:53:45,309 [1] [DEBUG] (.ctor) - log5
2018-10-30 17:53:46,549 [1] [DEBUG] (button1_Click) - ボタンが押されたよ
2018-10-30 17:53:46,692 [1] [DEBUG] (button1_Click) - ボタンが押されたよ
2018-10-30 17:53:46,812 [1] [DEBUG] (button1_Click) - ボタンが押されたよ
2018-10-30 17:53:46,965 [1] [DEBUG] (button1_Click) - ボタンが押されたよ
2018-10-30 17:53:47,076 [1] [DEBUG] (button1_Click) - ボタンが押されたよ
2018-10-30 17:53:47,212 [1] [DEBUG] (button1_Click) - ボタンが押されたよ
2018-10-30 17:53:47,484 [1] [DEBUG] (button1_Click) - ボタンが押されたよ

めでたし。めでたし。

おわり

ログ出力を実装できるようになったのは良いんですが、ログって設計が難しいんですよね。
設計レベルのお話に関しては下記記事が大変参考になりました。おすすめです。
https://qiita.com/nanasess/items/350e59b29cceb2f122b3

monomonomoe
SQLの予約語は全部小文字で書きたいマン。最近一周回ってPHPすこすこになってきました。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした