3

3 つの異なるタイプのログを作成するために、構成ファイルに 3 つのアペンダーがあります。グローバル コンテキスト プロパティを設定することで、3 つのアペンダーのそれぞれでファイルの動的命名を使用しています。場合によっては、1 つのアペンダーに対してログ ファイル名を動的に設定する必要があります。
1つのアペンダーのみにファイル名を設定すると、名前が動的に設定された実際のログファイルに加えて、データのない「null」という名前の別のファイルが作成されます。示されているように構成ファイルを作成しました。

<appender name="RollingFileAppenderV1" type="log4net.Appender.RollingFileAppender">   
<file type="log4net.Util.PatternString" value="Logs\%property{applog}" /> 
.
.
.
<appender name="RollingFileAppenderV2" type="log4net.Appender.RollingFileAppender"> 
<file type="log4net.Util.PatternString" value="Logs\%property{dblog}" />
.
.
.
<logger name="Logger1"> 
<level value="DEBUG" /> 
<appender-ref ref="RollingFileAppenderV1" /> 
</logger> 
<logger name="Logger2"> 
<level value="DEBUG" /> 
<appender-ref ref="RollingFileAppenderV2" /> 
</logger> 

VB.NET コードでは、ファイル名を次のように設定します。

log4net.GlobalContext.Properties("applog") = "file1.log"  
Dim logobj as log4net.Ilog = LogManager.GetLogger("Logger1")   
logobj.debug("test") 

この場合、「file1.log」と「null」という名前の別の空のファイルが作成されます。これは、実行時にいずれかのアペンダー ファイル名を設定している場合にのみ発生します。どんな助けでも感謝します。

4

3 に答える 3

6

私が知る限り、log4net を構成した瞬間にログ ファイルが作成されます。これは、最初にプロパティを設定し、後で log4net を構成する必要があることを意味します。

例えば

log4net.GlobalContext.Properties["applog"] = "file1.log"
log4net.Config.XmlConfigurator.Configure();
于 2010-10-06T13:09:36.070 に答える
0

log4net github ページで、まさにこのことについての議論があります。

https://github.com/net-commons/common-logging/issues/81

説明全体を言い換えるつもりはありませんが、プロパティを動的にオーバーライドできるようになるまでの推奨される回避策は、log4net にその構成を明示的にリセットするように指示することです。

// This line sets the properties in global context
var dummy = Common.Logging.LogManager.GetLogger("dummy");

// Now reset the ILoggingFactoryAppender to null so log4net needs to be re-configured
Common.Logging.LogManager.Reset(); 

// Now you can override properties in the global context
dummy.GlobalVariablesContext.Set("LogsDirectory", "C:\\Logs");

// Access to LogManager.GetLogger() triggers log4net initialization because the ILoggingFactoryAppender was set to NULL by LogManager.Reset().
var logger = Common.Logging.LogManager.GetLogger<MyLogger>();
于 2016-10-25T00:28:17.943 に答える
0

私はまったく同じ問題を抱えていました。XmlConfigurator.Configure() を呼び出すと、2 つのファイルが作成されました。1 つは正しいファイル パスで、もう 1 つはアセンブリが実行されるフォルダー内の「null」という名前のファイルです。

XmlConfigurator.Configure() を初めて呼び出す前に、すべてのファイル パス プロパティを string.Empty に初期化することで、これを解決しました。

したがって、あなたの場合、次のコードで問題を解決する必要があります。

log4net.GlobalContext.Properties("applog") = "file1.log"

' Set all of the other properties defined in the config file to String.Empty.
' By default, they are null and cause the issue.
log4net.GlobalContext.Properties("dblog") = String.Empty

log4net.Config.XmlConfigurator.Configure()

Dim logobj as log4net.Ilog = LogManager.GetLogger("Logger1")
logobj.debug("test")
于 2016-05-01T16:28:23.887 に答える