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

Log4Net を利用してログを記録する

More than 5 years have passed since last update.

C#.NET で Log4Net を利用してログを記録する設定のメモ。

方針

  1. ログを %Appdata%\[会社名]\[製品名]\log\ の下に保存したい

    [会社名]=Rohinomiya
    [製品名]=SampleLog4Net

  2. ログを以下のように3つに分けたい

    1. インフォログ(1つのファイルに出力/INFO~WARNレベルのログを保存)
    2. エラーログ(日付別にファイルを作成/ERROR~FATALのログを保存)
    3. トレースログ(日付別にファイルを作成/TRACE~FATALのログを保存)

参考:ログレベル

  • Fatal システム停止するような致命的な障害
  • Error システム停止はしないが、問題となる障害
  • Warn 障害ではない注意警告
  • Info 操作ログなどの情報
  • Debug 開発用のデバッグメッセージ
  • trace 詳細なデバッグの出力

設定手順

  1. Log4Net公式サイトからLog4Net.dllをダウンロードし、C#プロジェクトの参照設定に追加
  2. AssemblyInfo.cs に追記: Log4Netの設定ファイルを読み込む
  3. Log4Netの設定ファイルを記述する(Log4net.Config.xml) 出力フォルダにコピーする=TRUE
  4. Program.cs にて、Loggerオブジェクトを生成すれば、あとはログを吐くだけ

AssemblyInfo.cs に追記

AssemblyInfo.cs
// read Log4Net Configuration file
[assembly: log4net.Config.XmlConfigurator(ConfigFile=@"Log4net.Config.xml", Watch=true)]

Log4net.Config.xml

Log4net.Config.xml
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <log4net>

        <!-- 通常ログ:単一ファイル出力 -->
        <appender name="InfoLogDailyAppender" type="log4net.Appender.FileAppender">
            <File value="${APPDATA}\\Rohinomiya\\SampleLog4Net\\Logs\\Info.log" />

            <AppendToFile value="true" />

            <filter type="log4net.Filter.LevelRangeFilter">
                <param name="LevelMax" value="WARN" />
                <param name="LevelMin" value="INFO" />
            </filter>

            <layout type="log4net.Layout.PatternLayout">
                <ConversionPattern value="%date [%thread] [%-5level] %logger - %message%n" />
            </layout>
        </appender>

        <!-- エラーログ:分割ファイル出力 -->
        <appender name="ErrorLogDailyAppender" type="log4net.Appender.RollingFileAppender">
            <!-- ファイル名は日付ごと -->
            <param name="File" value="${APPDATA}\\Rohinomiya\\SampleLog4Net\\Logs\\Error_" />
            <param name="DatePattern" value='yyyyMMdd".log"' />
            <param name="RollingStyle" value="date" />
            <param name="StaticLogFileName" value="false" />

            <param name="AppendToFile" value="true" />

            <filter type="log4net.Filter.LevelRangeFilter">
                <param name="LevelMax" value="FATAL" />
                <param name="LevelMin" value="ERROR" />
            </filter>

            <param name="MaximumFileSize" value="10MB" />
            <param name="MaxSizeRollBackups" value="10" />

            <layout type="log4net.Layout.PatternLayout">
                <ConversionPattern value="%date [%thread] [%-5level] %logger %file(%line) %class %method - %message%n" />
            </layout>
        </appender>

        <!-- デバッグ用:分割ファイル出力 -->
        <appender name="DebugLogDailyAppender" type="log4net.Appender.RollingFileAppender">

            <!-- ファイル名は日付ごと -->
            <param name="File" value="${APPDATA}\\Rohinomiya\\SampleLog4Net\\Logs\\Trace_" />
            <param name="DatePattern" value='yyyyMMdd".log"' />
            <param name="RollingStyle" value="date" />
            <param name="StaticLogFileName" value="false" />

            <param name="AppendToFile" value="true" />

            <filter type="log4net.Filter.LevelRangeFilter">
                <!-- <param name="LevelMax" value="FATAL" /> -->
                <param name="LevelMin" value="TRACE" />
            </filter>

            <param name="MaximumFileSize" value="10MB" />
            <param name="MaxSizeRollBackups" value="10" />

            <layout type="log4net.Layout.PatternLayout">
                <ConversionPattern value="%date [%thread] [%-5level] %logger %file(%line) %class %method - %message%n" />
            </layout>
        </appender>

        <root>
            <!-- TRACE以上のログを記録 -->
            <level value="TRACE" />
            <!-- 使用する Appender -->
            <appender-ref ref="InfoLogDailyAppender" />
            <appender-ref ref="ErrorLogDailyAppender" />
            <appender-ref ref="DebugLogDailyAppender" />
        </root>

    </log4net>
</configuration>

Program.cs

program.cs
public static void Main(string[] args)
{
    ILog logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

    logger.Debug("開発中のデバッグ/トレースに使用する");
    logger.Info("情報(操作履歴等)");
    logger.Warn("注意/警告(障害の一歩手前)");
    logger.Error("システムが停止するまではいかない障害が発生");
    logger.Fatal("システムが停止する致命的な障害が発生");
}

実行結果

info.log
2012-07-28 17:48:32,443 [1] [INFO ] SampleLog4Net.Program - 情報(操作履歴等)
2012-07-28 17:48:32,445 [1] [WARN ] SampleLog4Net.Program - 注意/警告(障害の一歩手前)
Error_20120728.log
2012-07-28 17:48:32,445 [1] [ERROR] SampleLog4Net.Program c:\\develop\SampleLog4Net\SampleLog4Net\Program.cs(26) SampleLog4Net.Program Main - システムが停止するまではいかない障害が発生
2012-07-28 17:48:32,446 [1] [FATAL] SampleLog4Net.Program c:\\develop\SampleLog4Net\SampleLog4Net\Program.cs(28) SampleLog4Net.Program Main - システムが停止する致命的な障害が発生
Trace_20120728.log
2012-07-28 17:48:32,420 [1] [DEBUG] SampleLog4Net.Program c:\develop\SampleLog4Net\SampleLog4Net\Program.cs(20) SampleLog4Net.Program Main - 開発中のデバッグ/トレースに使用する
2012-07-28 17:48:32,443 [1] [INFO ] SampleLog4Net.Program c:\develop\SampleLog4Net\SampleLog4Net\Program.cs(22) SampleLog4Net.Program Main - 情報(操作履歴等)
2012-07-28 17:48:32,445 [1] [WARN ] SampleLog4Net.Program c:\develop\SampleLog4Net\SampleLog4Net\Program.cs(24) SampleLog4Net.Program Main - 注意/警告(障害の一歩手前)
2012-07-28 17:48:32,445 [1] [ERROR] SampleLog4Net.Program c:\develop\SampleLog4Net\SampleLog4Net\Program.cs(26) SampleLog4Net.Program Main - システムが停止するまではいかない障害が発生
2012-07-28 17:48:32,446 [1] [FATAL] SampleLog4Net.Program c:\develop\SampleLog4Net\SampleLog4Net\Program.cs(28) SampleLog4Net.Program Main - システムが停止する致命的な障害が発生
2012-07-28 17:48:32,448 [1] [DEBUG] SampleLog4Net.Program c:\develop\SampleLog4Net\SampleLog4Net\Program.cs(34) SampleLog4Net.Program Main - D:\Users\fukuda\AppData\Local

参考

rohinomiya
VIM / C#.net / AutoHotKey / Ruby / VB.net Windowsから最近Macに乗り換え、色々と戸惑うばかり。
http://rohinomiya.posterous.com/
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
ユーザーは見つかりませんでした