C#.NET で Log4Net を利用してログを記録する設定のメモ。
方針
-
ログを %Appdata%\[会社名]\[製品名]\log\ の下に保存したい
[会社名]=Rohinomiya
[製品名]=SampleLog4Net -
ログを以下のように3つに分けたい
- インフォログ(1つのファイルに出力/INFO~WARNレベルのログを保存)
- エラーログ(日付別にファイルを作成/ERROR~FATALのログを保存)
- トレースログ(日付別にファイルを作成/TRACE~FATALのログを保存)
参考:ログレベル
- Fatal システム停止するような致命的な障害
- Error システム停止はしないが、問題となる障害
- Warn 障害ではない注意警告
- Info 操作ログなどの情報
- Debug 開発用のデバッグメッセージ
- trace 詳細なデバッグの出力
設定手順
- Log4Net公式サイトからLog4Net.dllをダウンロードし、C#プロジェクトの参照設定に追加
- AssemblyInfo.cs に追記: Log4Netの設定ファイルを読み込む
- Log4Netの設定ファイルを記述する(Log4net.Config.xml) 出力フォルダにコピーする=TRUE
- Program.cs にて、Loggerオブジェクトを生成すれば、あとはログを吐くだけ
AssemblyInfo.cs に追記
// read Log4Net Configuration file
[assembly: log4net.Config.XmlConfigurator(ConfigFile=@"Log4net.Config.xml", Watch=true)]
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
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("システムが停止する致命的な障害が発生");
}
実行結果
2012-07-28 17:48:32,443 [1] [INFO ] SampleLog4Net.Program - 情報(操作履歴等)
2012-07-28 17:48:32,445 [1] [WARN ] SampleLog4Net.Program - 注意/警告(障害の一歩手前)
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,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
参考
- C# how to specify the appData file path in the app.config file - Stack Overflow
- 特殊ディレクトリのパスを取得する: .NET Tips: C#, VB.NET
- 【Visual Studio C#】[Log4Netを使用する]|No Title
- log4net - MLEXP Wiki
- logging - How to specify common application data folder for log4net? - Stack Overflow
- 【ハウツー】レッツ! Windows 7 - ユーザーインタフェース編(9) (2) 使用頻度の高いフォルダーを環境変数に登録する | パソコン | マイナビニュース
- オープンソースのロギング・サービス「log4net」を使う - @IT
- log4net でログレベル毎に出力先を指定する - 記憶は削除の方向で
↓↓↓↓↓↓
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のテーブル構造も・・・です。