2012-09-08 15 views
7

実行時にlog4net APIを介してlog4netログファイルの名前パターンを取得するC#コードを作成しようとしています。log4netログファイルの名前パターンをプログラムで取得する方法は?

log4net.configに、次のアペンダが定義されている場合は、次のとおりです。

<appender name="MyAppender" type="log4net.Appender.RollingFileAppender"> 
    <file type="log4net.Util.PatternString" value="%date{yyyy}\%date{MM}\%date{dd}\%property{Id}.log" /> 
    <appendToFile value="true" /> 
    <rollingStyle value="Size" /> 
    <maxSizeRollBackups value="16" /> 
    <maximumFileSize value="1MB" /> 
    <staticLogFileName value="true" /> 
    <layout type="log4net.Layout.PatternLayout"> 
    <conversionPattern value="%message%newline" /> 
    </layout> 
</appender> 

私は%日{YYYY} \%日付{MM} \%日付{DD}を取得したいと思い\%property {Id} .logをコード内の文字列変数に変換します(解析なしでlog4net.configをプレーンXMLとして使用します)。

誰もがこのトリックを引き出すアイデアを持っていますか?

ありがとうございます。

答えて

2

このパターンの値は、ログリポジトリの一部であるFileAppenderインスタンスのFileプロパティになります。

アペンダーでの取得は、いくつかの異なる方法で行うことができます。

  1. あなたは既に(あなたがLogManager.GetLogger()から入手例えば何)​​インスタンスを持っている場合は、それにAppendersプロパティがあります。これにより、ロギング階層の特定のレベルに関連付けられているアペンダーが表示されます。
  2. LogManager.GetRepository()に電話して、ロガー全体とアペンダー階層を含むHeirarchyオブジェクトを取得することもできます。このメソッドではアセンブリが必要なので、GetCallingAssembly()を渡してデフォルトの値を取得します。このクラスには、コンフィグレーションされたすべてのアペンダを返すメソッドGetAppenders()がありますが、どちらのロガーに関連付けられているかはわかりません。そこから

、ちょうどそれがFile財産だ読んで、その後、正しい型(例えばFileAppenderまたはRollingFileAppender)のアペンダを探して目を通します。

+2

。ファイルプロパティは、その時点ですでに評価されています。だから、 '%date {yyyy} \%date {MM} \%date {dd} ...'が '2012 \ 09 \ ...'には含まれなくなりました。 – Wolfgang

+0

@Michael Wolfgangは絶対に正しいです:_File_プロパティが取得されると、元のパターン値を取得できませんでした。 – Lev

+0

hrm。あなたはそうです、私はいつもこれを使って道を得ることができました。パターンはどこかで再計算されるので、このデータはどこかで利用可能でなければなりません。 –

0

私はRollingFileAppenderをサブクラス化し、基本クラスではなくconfigファイルでサブクラスを使用したいと思っています。 log4netが見つけることができるように、クラス名の先頭に完全な名前空間を付けるようにしてください。

私は、自分のコードにサブクラス化されたUDPAppenderしか持っていません。

public override void ActivateOptions() 
    { 
     base.ActivateOptions(); 
    } 

私は、基本クラスの呼び出しの前に壊れたとき、私は地元の人々のウィンドウで「これ」を検討し、UDPAppender「メンバー」の値を見た:私はこのようなオーバーライドを追加しました。

+0

残念ながら、_RollingFileAppender_のインスタンスは評価済みのファイル名で既に設定されており、ファイル名のパターンは認識しません。私はこのパターンを見る最後のオブジェクトは_ParseAppender()_メソッドの_log4net.Repository.Hierarchy.XmlHierarchyConfigurator_のインスタンスだと思います。そのような場合、私が必要とするものを達成するための唯一の方法は、実際に自分で設定ファイルを解析することです(うんこ!)... – Lev

+0

ああ、私は誤解しました。あなたはパターンそのものが必要です。私は誰かがパターンを変更するかもしれないと思いますので、コードで設定したくありません(あらかじめ知っているでしょう)? – chrismead

0

マイケル・エデンフィールドの説明が良いです。ここに実現します。

private static readonly ILog log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 

string fileName = ((RollingFileAppender)log.Logger.Repository.GetCurrentLoggers() 
    .Where(e => e.Name == "Your namespace.class").ToList()[0] 
    .Repository.GetAppenders() 
    .Where(e => e.Name == "MyAppender").ToList()[0]).File.ToString(); 
0

私は次のコードで<file value>の値を取得できます。私はそれが動作しないと思います

((log4net.Appender.FileAppender) ((log4net.Appender.IAppender[]) 
      ((log4net.Repository.Hierarchy.Logger) 
       log.Logger).Appenders.SyncRoot)[0]).File 
関連する問題