DOBON.NET DOBON.NETプログラミング掲示板過去ログ

log4netの出力先を分ける方法について

環境/言語:[XP VB2005]
分類:[.NET]

お世話になります。

log4netで複数のファイルにログを出力する場合、
Appenderを複数書く(AlogAppender,BlogAppender)のように
設定するのは調べましたが、
実際のコーディングでどのようにすれば
AlogAppenderのファイル出力先、BlogAppenderのファイル出力先に
出力されるようになるのかがわかりません。

 Private Shared log As ILog = LogManager.GetLogger( _
   System.Reflection.MethodBase.GetCurrentMethod().DeclaringType)

の宣言になにかしないとだめなのでしょうか?

よろしくお願いします。
■No23405に返信(りゅうさんの記事)
> お世話になります。
> 
> log4netで複数のファイルにログを出力する場合、
> Appenderを複数書く(AlogAppender,BlogAppender)のように
> 設定するのは調べましたが、
> 実際のコーディングでどのようにすれば
> AlogAppenderのファイル出力先、BlogAppenderのファイル出力先に
> 出力されるようになるのかがわかりません。
> 
>  Private Shared log As ILog = LogManager.GetLogger( _
>    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType)
> 
> の宣言になにかしないとだめなのでしょうか?
> 
> よろしくお願いします。
> 

    <logger name="DBFile.Logging">
      <level value="ALL" />
      <appender-ref ref="DataBaseFileAppender" />
    </logger>
のようにlogger nameを宣言すればいいみたいなことをネットで見つけましたが、
なぜかこの部分が無視され<root>を優先してしまいます。
上記部分を削除してもログ出力に影響がないため、
読まれていないようなのですが・・

ご存知の方、いらっしゃいましたらご教授ください。
2008/11/22(Sat) 10:32:44 編集(投稿者)

検索サイトで調べたらちゃんと見つかるんだがネ〜

例えば・・・

<log4net>
<!-- ログ出力先の定義 -->
<!-- リングバッファログ -->
<appender name="AllLoggingFileAppender" type="log4net.Appender.RollingFileAppender" >
<param name="File" value=".\AllLogging.log" />
<param name="AppendToFile" value="true" />
<maximumFileSize value="1000KB" />
<maxSizeRollBackups value="2" />
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%d %-5p - %m%n" />
</layout>
</appender>
<appender name="Hoge1FileAppender" type="log4net.Appender.FileAppender" >
<param name="File" value=".\Hoge1.log" />
<param name="AppendToFile" value="true" />
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%d %-5p - %m%n" />
</layout>
</appender>
<appender name="Hoge2FileAppender" type="log4net.Appender.FileAppender" >
<param name="File" value=".\Hoge2.log" />
<param name="AppendToFile" value="true" />
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%d %-5p - %m%n" />
</layout>
</appender>
<root>
<level value="ALL" />
<appender-ref ref="AllLoggingFileAppender" />
</root>
<logger name="Hoge1">
<level value="ALL" />
<appender-ref ref="Hoge1FileAppender" />
</logger>
<logger name="Hoge2">
<level value="ALL" />
<appender-ref ref="Hoge2FileAppender" />
</logger>
</log4net>

こんな風な宣言で、3個のログに出力分けできています。
ただし制約と言うか制限があります。

<root>はどうしようもありませんが・・・
<logger name="Hoge1"> の、『Hoge1』は、そのクラス名か
ルート名前空間に記述されているものと一致しないと、ダメ
でした。アセンブリ名ではなくて、ルート名前空間名が基本
のようです。

そうなりますと、同一クラス内で、別々に出力させたいよう
な場合は、ダミーのログ出力クラスを宣言して、そちら経由
で出力先を分ける・・・と言うことになります。

● 因みに、動的に出力ログファイル名を変更できます。
  またログ出力先のパスも取得できますので、ログをlog4net
  から切り離してどこかバックアップ先にコピーし、再度、
  ロギングを再開する。なんてこともできます。

●  動的ログファイル名切り替え方法
   app.config に設定の修正が必要です。通常は固定なので。

Private Sub InitLogger(Optional ByVal szLogFile As String = "Hoge1.log")

Dim repositries As log4net.Repository.Hierarchy.Hierarchy

repositries = CType(log4net.LogManager.GetRepository, log4net.Repository.Hierarchy.Hierarchy)

For Each appenders As log4net.Appender.IAppender In repositries.GetAppenders
Dim fileAppender As log4net.Appender.FileAppender
fileAppender = CType(appenders, log4net.Appender.FileAppender)
If fileAppender IsNot Nothing Then
fileAppender.File = Environment.CurrentDirectory + "\" + szLogFile
fileAppender.ActivateOptions()
End If
Next

loggerSensour = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod.DeclaringType)

End Sub

●  ログの中止、バックアップと再開
Dim repositories As log4net.Repository.Hierarchy.Hierarchy
Dim szPath As String

szPath = String.Empty
repositories = CType(log4net.LogManager.GetRepository, log4net.Repository.Hierarchy.Hierarchy)

For Each appenders As log4net.Appender.IAppender In repositories.GetAppenders
Dim fileAppender As log4net.Appender.FileAppender
fileAppender = CType(appenders, log4net.Appender.FileAppender)
If fileAppender IsNot Nothing Then
szPath = fileAppender.File
Exit For
End If
Next

If szPath <> String.Empty Then
log4net.LogManager.Shutdown()

Application.DoEvents()

fi = New FileInfo(szPath)
If fi.Exists Then
Try
fi.CopyTo(szLog, True)
bRet = True
Catch ex As Exception
bRet = False
End Try
If bRet Then
fi.Delete()
End If
End If

log4net.Config.XmlConfigurator.ConfigureAndWatch(New System.IO.FileInfo(System.Reflection.Assembly.GetExecutingAssembly().Location + ".config"))

End If

    ※ 関数全体を記載することができませんでしたので
      解読して、使えるようにして下さい。
      エラー関係も若干ハショッてます!・・・

以上。参考まで

DOBON.NET | プログラミング道 | プログラミング掲示板