2009-02-21 10 views
34

私が書いた構文の妥当性を検証するために、私より賢い人を探しています。このアイデアは、自分のプロジェクトにもっと再利用できるように、私のRollingFileAppenderのファイル名をアセンブリの名前に設定することです。アペンダファイルのパスを動的に設定する最も良い方法

私はthis previous SO articleを見てきましたが、まさに私の質問に答えることができませんでした...

私はlog4netの内部コンポーネントを理解しようとしている時間のディケンズを持っていたし、これは私が来たものです(Global.asaxファイルに存在する - Application_Startメソッド)を持つまで:

// Bind to the root hierarchy of log4net 
log4net.Repository.Hierarchy.Hierarchy root = 
    log4net.LogManager.GetRepository() 
    as log4net.Repository.Hierarchy.Hierarchy; 

if (root != null) 
{ 
    // Bind to the RollingFileAppender 
    log4net.Appender.RollingFileAppender rfa = 
    (log4net.Appender.RollingFileAppender)root.Root.GetAppender("RollingLogFileAppender"); 

    if (rfa != null) 
    { 
    // Set the file name based on the assembly name 
    string filePath = 
     string.Format("~/App_Data/{0}.log", GetType().Assembly.GetName().Name); 

    // Assign the value to the appender 
    rfa.File = Server.MapPath(filePath); 

    // Apply changes to the appender 
    rfa.ActivateOptions(); 
    } 
} 

誰も私を伝えることができ、「これは恐ろしいです」、または「これは正常に動作する必要がありますか」?また、ファイルを動的に設定すると、log4net.configファイル設定に基づいてファイルをローテーションするlog4netの動作が期待できますか?

非常に高く評価されました!

答えて

82

これは難しいことです。アプリケーションの設定ファイルにXMLとしてあなたのlog4netの設定を定義して、有利に%property{}を使用します。

<appender name="YourAppender" type="log4net.Appender.RollingFileAppender"> 
    <file type="log4net.Util.PatternString" value="~/App_Data/%property{LogName}" /> 
    .... 
</appender> 

これは動的である - あなただけのlog4netのプロパティを設定する必要があり、「LogName前にlog4netのを初期化します。

string LogName = GetType().Assembly.GetName().Name + ".log"; 
log4net.GlobalContext.Properties["LogName"] = LogName; 

はもちろん、あなたが任意のプロパティ名を使用することがあります。このように、あなたのコードあなたはlog4netのを設定する前に、任意の時点では、このプロパティの目標値を設定します。私は簡単な例として "LogName"を選択しましたが、あなたのコードが正しいプロパティ名と正しい値を知っている限り、アプリケーションごとに1つずつ作成することができます。

+2

ああ、正確に...それはそれはされている必要がありますよりも、より困難に思えました。ありがとうございました... – Dscoduc

+2

log4netfactoryadapterを使用するときにこれと同等の方法や方法があるかどうか知っていますか?私はすべてのコードでcommon.loggingを使用しており、宣言的に設定(app.config)を定義しています。私はGlobalContextメソッドを試してみましたが、ファイル名に(null)がついてしまい、使用している変数がnullでないことが分かりました。 –

+0

残念ながら、私はlog4netfactoryアダプターに精通していません。 ** log4netが初期化または使用される前にGlobalContext **を使用していますか?プロパティを定義する前にlog4netが使用または初期化されると、それらはnullになります。 – Eddie

0

%property {}を使って同じことを行っていますが、ファイルは "(nul).log"として作成されています。 は以下のコードである:私は2015年

<file type="log4net.Util.PatternString" value="C:\MY_Log\%property{Service}.log" /> 
+2

私は彼が上記のようにあなたはアペンダーあなたのサービスプロパティを設定した後。 'log4net.Config.BasicConfigurator.Configure();' –

7

としてXMLファイルで宣言した

log4net.GlobalContext.Properties["service"] = _servicename.ToString(); 
_flatFileLogger = LogManager.GetLogger("FlatFileLogger"); 
_flatFileLogger.Debug(logData.ToString()); 

、我々はこのようにそれを実行します。

<file type="log4net.Util.PatternString"> 
    <conversionPattern value="%appdomain.log" /> 
</file> 

必要はありませんその他のコード。

App Domainは実行中のアセンブリのファイル名です。ここで

5

は、実行時に最初のアペンダのログファイルを設定または変更する方法です:私はこの投稿をなぜ

var appender = (log4net.Appender.FileAppender)LogManager.GetRepository().GetAppenders()[0]; 
appender.File = "C:\whatever.log"; 
appender.ActivateOptions(); 
関連する問題