故郷を離れて三十数年、関東で暮らす永遠の少年のどーってことない日記
xxSEARCHxx
プロフィール

ST☆FF

Author:ST☆FF
HTTといえばインテルの Hyper-Threading Technology!・・・ではなく、放課後ティータイムのことだと思います。

最近の記事
最近のコメント
最近のトラックバック
月別アーカイブ
カテゴリー
ブロとも申請フォーム
ブログ内検索
RSSフィード
リンク

最近の記事


スポンサーサイト 

--/--/-- --:--/--
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

CATEGORY:スポンサー広告 | CM(-) | TB(-) |

log4netをapp.config設定なしで使う 

2015/04/10 22:05/Fri
久しぶりのプログラムネタで、今日は「log4net」について少々。

オープンソースのロギング・サービスである「log4net」は、御承知の通り、本当に便利で、また奥が深いツールです。
ただ、これを使うにはアプリケーション構成ファイルに環境定義を記述する必要があり、ちょっとした使用にあたっては意外に手間のかかるイメージがあります。
今回は思い切って、アプリケーション構成ファイルの編集なしに、コードだけでお手軽にlog4netを使う方法を模索してみました。同一スレッド内で処理毎に別ファイルにログを吐きたい場合に応用出来る方法です。

大袈裟なものはないのですが、強いてメリットをあげると

1)アプリケーション構成ファイルを編集する必要がない。
2)対象のログファイル名を動的に生成して何本でも動的に切り替えることが出来る。

こんなところです。

説明する程のものではありませんので、早速コードを掲載しましょう。
' Formスレッドで使用するLogger
Private _logger As log4net.ILog = log4net.LogManager.GetLogger( _
System.Reflection.MethodBase.GetCurrentMethod().DeclaringType)

'''
''' ログファイル切り替えサンプル
'''

''' VisualStudio2008
Private Sub MultiAppenderTest()

' 共通レイアウト
Const layout As String = _
"%-5level %date{yyyy/MM/dd_HH:mm:ss,fff} [%thread] %logger - %message%newline"
Const LOOPS As Integer = 500

' Appender作成
' ファイルサイズで世代管理するAppender
Dim appender1 = New log4net.Appender.RollingFileAppender() With { _
.Name = "RollingFileAppender1", _
.File = "D:\ap\log4net_log\MultiLog\appender1.log", _
.AppendToFile = True, _
.RollingStyle = log4net.Appender.RollingFileAppender.RollingMode.Size, _
.MaxSizeRollBackups = 5, _
.MaximumFileSize = "12KB", _
.StaticLogFileName = True, _
.Layout = New log4net.Layout.PatternLayout(layout) _
}

' 日付時刻フォルダで世代管理するAppender
Dim appender2 = New log4net.Appender.RollingFileAppender() With { _
.Name = "RollingFileAppender2", _
.File = "D:\ap\log4net_log\MultiLog/", _
.DatePattern = "yyyyMMdd-HHmm'/appender2.log'", _
.AppendToFile = True, _
.RollingStyle = log4net.Appender.RollingFileAppender.RollingMode.Date, _
.StaticLogFileName = False, _
.Layout = New log4net.Layout.PatternLayout(layout) _
}
' appender2にシンプルなフィルタをかけてみる(Infoのみ出力)
Dim lrf = New log4net.Filter.LevelRangeFilter()
lrf.LevelMin = log4net.Core.Level.Info
lrf.LevelMax = log4net.Core.Level.Info
appender2.AddFilter(lrf)

' 現在のLoggerに全Appenderを登録
Dim currentLogger = DirectCast(_logger.Logger, log4net.Repository.Hierarchy.Logger)
With currentLogger
.Level = log4net.Core.Level.All
.AddAppender(appender1)
.AddAppender(appender2)
End With

' 登録後に任意のAppenderを有効化する
For Each apdr as log4net.Appender.FileAppender In currentLogger.Repository.GetAppenders()
' 名称で識別
If apdr.Name.Equals("RollingFileAppender1") Then ' または"RollingFileAppender2"
apdr.ActivateOptions()
Exit For
End If
Next

' 設定完了通知(出力許可)
_logger.Logger.Repository.Configured = True

' ログ出力
Dim title As String = "/" + LOOPS.ToString + "]" + " log4net test"
For i As Integer = 1 To LOOPS
Threading.Thread.Sleep(50)
Me.Text = i.ToString("[000") + title
_logger.InfoFormat("INFO情報出力-loop:{0}", i.ToString("000"))
_logger.WarnFormat("WARN情報出力-loop:{0}", i.ToString("000"))
Application.DoEvents()
Next

' ファイルClose
_logger.Logger.Repository.Shutdown()

MessageBox.Show("終了.")

End Sub
End Class

出力の形式としては最も需要の多いと思われる、ログローテートを2種類取り上げました。
ひとつはファイルサイズでのローテート、もう一つは日付フォルダでのローテートです。
日付でのローテートはファイル名に日付文字を埋め込むのが一般的ですが、今回は捻ってファイル名は固定にして、代わりに日付文字を使ったサブフォルダでのローテートを取り上げています。
サンプルでは日付フォルダでのローテートを短時間でシミュレートするため、DatePatternを1分単位でローテートするように設定してあります。

試し方は簡単で、テストフォームにコマンドボタンをひとつ配置し、そのクリックイベントハンドラに MultiAppenderTest() と記述するだけです。
出力ログファイルを変更して試すには、57行目の比較対象アペンダ名を書き換えて実行します。


スポンサーサイト

CATEGORY:仕事関係 | CM(0) | TB(0) |
xx HOME xx
トラックバックURL
→http://3335.blog106.fc2.com/tb.php/273-a4c99f95

コメントの投稿














xx HOME xx

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。