4

私が現在取り組んでいるプロジェクトでは、ロギングに Enterprise Libraries V3.1 フレームワークを使用しています。

生成されたログ ファイルを特定の時点でアーカイブする必要があります。組み込みの Trace Listener は、ロギング イベント間でファイルを開いたままにしているようです。ファイルに追加して閉じるカスタム トレース リスナーをセットアップし、ファイルが常にシフト可能になるようにしました。

次のようになります (わかりやすくするためにエラー処理を省略しています)。

[ConfigurationElementType(typeof(CustomTraceListenerData))]
public class AlwaysClosedTextFileTraceListener : CustomTraceListener
{
    private string logFilePath;

    public AlwaysClosedTextFileTraceListener ()
    {
        logFilePath = @"hardcodedpath\log.txt";
    }

    public override void Write(string message)
    {
        using (StreamWriter logFile = File.AppendText(logFilePath))
        {
            logFile.Write(message);
            logFile.Flush();
            logFile.Close();
        }
    }

    public override void WriteLine(string message)
    {
        using (StreamWriter logFile = File.AppendText(logFilePath))
        {
            logFile.WriteLine(message);
            logFile.Flush();
        }
    }

    public override void TraceData(TraceEventCache eventCache, string source, TraceEventType eventType, int id, object data)
    {
        if (data is LogEntry && this.Formatter != null)
        {
            WriteLine(this.Formatter.Format(data as LogEntry));
        }
        else
        {
            WriteLine(data.ToString());
        }
    }
}

これは問題なく動作しますが、パスをハードコーディングするのではなく、何らかの方法でパラメーターとして渡したいと思います。

楽しみのために、コンストラクターに追加して、何が起こるかを確認してみました。

    public LogFolderTraceListener(string logFilePath)
    {
        this.logFilePath = logFilePath;
    }

これを行うと、何が間違っているかを示唆するエラーメッセージが返されます。

System.InvalidOperationException : The type 'AlwaysClosedTextFileTraceListener' specified for custom trace listener named 'MyLogFile' does not a default constructor, which is required when no InitData is specified in the configuration.

ここから先、私の調査は行き止まりとは正反対の、無限の確率の問題に行き着きました。

組み込みのソースコードからこの親指を見つけましたRollingTraceListener

  • RollingFlatFileTraceListenerData : TraceListenerDataコンストラクターに渡されたすべての設定を含むと思われるクラスがあります
  • ファイルの下部にキャンプアウトされているのは、工場と思われるRollingFlatFileTraceListenerDataクラスですRollingTraceListenerAssembler : TraceListenerAsssembler
  • クラスを構成アプリケーションに提示可能にSystemDiagnosticsTraceListenerNode : TraceListenerNodeするように見える別のクラスがありますData

CustomTraceListener私の質問はこれです:の構成可能なパラメーターを使用して を作成するにはどうすればよいpathですか?

4

5 に答える 5

6

CustomTraceListenerはTraceListenerから派生し、これには属性と呼ばれるStringDictionaryがあります。

これには、TraceListenerの構成行のすべての属性が含まれ、名前で取得できます。

string logFileName= Attributes["fileName"]
于 2009-10-13T06:43:35.400 に答える
1

おそらく、エンタープライズ アプリケーション ブロックは (おそらく) 素晴らしいものですが、不必要に複雑に見え、最終的には、この種のカスタマイズの価値よりも多くの問題を抱えているように思われます。

于 2009-09-10T00:38:10.950 に答える
1

問題は典型的なマイクロソフトです..(ここに独自の形容詞を追加してください)..

1) カスタム トレース リスナーを追加すると、追加される「生の」app.config ステートメントは次のようになります。

   name="Custom Trace Listener" initializeData="" formatter="Text Formatter" />

2) 「initializeData」に注意してください - これは、不可解なエラー メッセージが「InitData」を呼び出しているものです。

3)つまり、初期化データを受け入れるコンストラクターが必要であるということです-vbの用語で:

  sub new (byval initstuff as string)

4) または 'initializeData=""' を削除し、デフォルトのコンストラクターを用意します。

  sub new()

P&P の人々はバブルの中に住んでいると思います。リックス。

于 2009-10-08T20:04:08.403 に答える
0

同じ問題が発生しました(Enterprise Library v4.1を除く)。

私が見つけた解決策は、デフォルトのコンストラクターを削除することであり、ファイル名の文字列パラメーターを持つコンストラクターのみがあります。

public AlwaysClosedTextFileTraceListener (string pathParameter)   
{   
    logFilePath = pathParameter;   
} 

次に、app.configで、initializeDataパラメーターにパスを入力します

<add ... initializeData="C:\Logs\myLog.log" />

これはEntripriseLibrary構成エディターによって認識されず、可能な限り適切ではありませんが、パラメーターが1つしかない限り機能します。

誰かがそれを適切に行う方法を見つけたら、投稿して私たちに知らせてください-それは確かにこれほど難しいことではないはずです。

于 2010-01-26T10:38:07.120 に答える
0

これが価値があるのは、私がそれをどのように実装したかです。私の this.buildCurrPath() では、構成ファイルから読み取ることができます。この場合、Web アプリの「起動パッド」を取得するだけです。しかし、それは私にとってはうまくいきます。まだ製品コードには入れていませんが、すぐに出てくるはずです。

[ConfigurationElementType(typeof(CustomTraceListenerData))]
public class CustomListener: CustomTraceListener
{

    #region Fields (3) 
    private int logSize;
    StreamWriter sw;
    #endregion Fields 

    #region Constructors (1) 

    public CustomListener ():base()
    {
        string startPath = this.buildCurrPath();
        sw = new StreamWriter(startPath + "\\Logs\\test.log");
        sw.AutoFlush = true;

    }
于 2009-09-11T21:57:23.397 に答える