背景:
阅读新闻

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

  作者: 今日评论: [字体: ]

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

参考



↓↓↓↓↓↓

http://forums.asp.net/t/1663086.aspx?Log4Net+Configuration+in+Web+Config

Re: Log4Net Configuration in Web.Config

Apr 23, 2014 08:44 AM|LINK

Step1:- First download the latest version of Log4net open source library and add reference to the bin folder in the application

step 2:- in Global.asax, add the following code

 void Application_Start(object sender, EventArgs e)
    {
        log4net.Config.XmlConfigurator.Configure();
       
    }

step 3:- you have a table in the database for error Logs and insert the values by using the commandtext values....

step 4: Add the following code in the web.config file:-

<log4net>
    <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
      <bufferSize value="1000" />
      <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.330044.0000, Culture=neutral, PublicKeyToken=bLIKKKK77a5c561934e089" />
     
      <connectionString value="Data Source=.;Initial Catalog=abc;integrated security=false;Persist Security Info=True;User ID=sa;Password=sa@123"/>
      
     

      <commandText value="INSERT INTO ErrorLogstables ([Date],[function],[Level],[Loggerfield],[Message],[Exception]) VALUES (@log_date, @functionname, @log_level, @logger, @message, @exception)" />
      <parameter>
        <parameterName value="@log_date" />
        <dbType value="DateTime" />
        <layout type="log4net.Layout.RawTimeStampLayout" />
      </parameter>
      <parameter>
        <parameterName value="@functionmame" />
        <dbType value="String" />
        <size value="255" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%thread" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@log_level" />
        <dbType value="String" />
        <size value="50" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%level" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@logger" />
        <dbType value="String" />
        <size value="255" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%logger" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@message" />
        <dbType value="String" />
        <size value="4000" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%message" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@exception" />
        <dbType value="String" />
        <size value="2000" />
        <layout type="log4net.Layout.ExceptionLayout" />
      </parameter>
    </appender>
   
    <root>
      <!--<level value="All"/>-->
      <!--<level value="DEBUG"/>-->
      <level value="ERROR"/>
      <appender-ref ref="AdoNetAppender"/>
    </root>
  </log4net>


Loggers may be assigned levels. Levels are instances of the log4net.Core.Level class. The following levels are defined in order of increasing priority:

  • ALL
  • DEBUG
  • INFO
  • WARN
  • ERROR
  • FATAL
  • OFF



※ 尚、log4net.config や、AssemblyInfo.cs に記載しなくても、プログラムのコード中
  で、すべて設定できます。

  たとえば・・・

Public Function OpenLog4netDB(ByVal Server As String, ByVal DbName As String, Optional ByVal bSecurity As Boolean = True, Optional ByVal User As String = "", Optional ByVal Pass As String = "", Optional ByVal Timeout As Integer = 5) As Boolean

Dim h As Hierarchy = CType(LogManager.GetRepository, Hierarchy)

h.LoggerFactory.CreateLogger("logger")

Dim logger As Logger

logger = h.GetLogger("logger", h.LoggerFactory)

Dim layout As log4net.Layout.PatternLayout = New log4net.Layout.PatternLayout

layout.ConversionPattern = "%d %-5p - %m%n"
layout.ActivateOptions()

Dim Para As AdoNetAppenderParameter
Dim appender As AdoNetAppender = New AdoNetAppender

With appender
.Name = "Database"
.ConnectionType = "System.Data.SqlClient.SqlConnection"
.ConnectionString = GetDBConnectString(Server, DbName, bSecurity, User, Pass, Timeout)
.CommandType = CommandType.Text
.CommandText = "INSERT INTO LOG_DATA ([Date],[Level],[Message]) VALUES (@log_date, @log_level, @message)"
.Layout = layout
.Threshold = Core.Level.All
.BufferSize = 100

Para = New AdoNetAppenderParameter
With Para
.ParameterName = "@log_date"
.DbType = DbType.DateTime
.Layout = New Layout.RawTimeStampLayout
appender.AddParameter(Para)
End With

Para = New AdoNetAppenderParameter
With Para
.ParameterName = "@log_level"
.DbType = DbType.String
.Size = 50
.Layout = New Layout.Layout2RawLayoutAdapter(New Layout.PatternLayout("%p"))
appender.AddParameter(Para)
End With

Para = New AdoNetAppenderParameter
With Para
.ParameterName = "@message"
.DbType = DbType.String
.Size = 4000
.Layout = New Layout.Layout2RawLayoutAdapter(New Layout.PatternLayout("%m"))
appender.AddParameter(Para)
End With

.ActivateOptions()
End With

logger.AddAppender(appender)
logger.Level = Level.All

BasicConfigurator.Configure(h, appender)

log4 = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType)

bOpen = True

Return bOpen

End Function

Public Function Close() As Boolean

If bOpen Then
log4net.LogManager.Shutdown()
End If

bOpen = False

Return True

End Function

Private Function GetDBConnectString(ByVal Server As String, ByVal DbName As String, ByVal bSecurity As Boolean, ByVal User As String, ByVal Pass As String, ByVal Timeout As Integer) As String

Dim AdoSQL As SqlConnectionStringBuilder

AdoSQL = New SqlConnectionStringBuilder

With AdoSQL
.DataSource = Server
.InitialCatalog = DbName
.IntegratedSecurity = bSecurity
.Password = Pass
.UserID = User
.ConnectTimeout = Timeout
End With

Return AdoSQL.ToString

End Function

  あくまで参考です。ご自身の環境用に変更しないと動作しないでしょう。
  ログを保存するDBのテーブル構造も・・・です。


来源:http://qiita.com/rohinomiya/items/2b86c4e8d5afd5c2fb39
录入日期:[2016/07/01 11:30:00]
收藏 推荐 打印 | 录入:mikebai | 阅读:
文章评论      
正在加载评论列表...
评论表单加载中...