4

C# および .NET 2.2 でコンソール プログラムからログ (.txt) に記録する最も効率的な方法は何ですか? 私のプログラムは、ユーザーが望むものに基づいて常に異なるデータを出力する複数回ループするため、これを達成するための最も効率的な方法を探しています。

いつでもストリームを再開してから閉じることができることはわかっていますが、それを行うたびに 1 行だけが書き込まれ、次回 (数秒後) にプログラムが再ループし、再度書き込む必要があります。私の意見では、それはあまり資源に優しいとは思えません。

ログに記録したい出力データを持つ複数のスレッドを使用しています (同じファイルを開いたり閉じたりすることや、異なるスレッドで同じファイルにアクセスすることは悪いかもしれません)。「自動フラッシュするストリームライターへの参照を保持する」は良い考えのように聞こえますが、その方法がわかりません。

4

6 に答える 6

16

log4net の使用を検討してください:

プログラマーがさまざまな出力ターゲットにログ ステートメントを出力するのを支援するツール....NET ランタイムの新機能を利用しながら、元の log4j と同様のフレームワークを維持しています。log4net の詳細については、機能のドキュメントを参照してください...

于 2008-09-30T15:39:06.477 に答える
3

行を書くたびに開閉に伴うパフォーマンス ヒットを受け入れます。信頼度判断です。すべてをメモリに保持していて、ハード クラッシュが発生した場合、トラブルシューティングに役立つログ情報がまったくありません。これが問題にならない場合は、メモリに保持することで確実にパフォーマンスが向上します。

于 2008-09-30T15:42:36.093 に答える
3

CLR の一部を形成するトレース フレームワークにフックすることができます。http://www.chaosink.co.uk/files/tracing.zipのような単純なクラスを使用すると、診断情報を選択的にログに記録できます。それを使用するには、クラスをアプリケーションに追加します。次のように、クラスでトレーサーのインスタンスを作成します。

private Tracing trace = new Tracing("My.Namespace.Class");

次を使用して呼び出します。

MyClass()
{
    trace.Verbose("Entered MyClass");
    int x = 12;
    trace.Information("X is: {0}", x);
    trace.Verbose("Leaving MyClass");
}

組み込みのトレース フレームワークには、次の 4 つのレベルの情報があります。

Verbose - プログラムの流れをログに記録する

情報 - 関心のある特定の情報をモニターに記録する

警告 - 無効な状態または回復可能な例外をログに記録するには

エラー - 回復不能な例外または状態をログに記録するには

アプリケーションから情報にアクセスするには、app.config (または web.config) に次を追加します。

<system.diagnostics>
    <trace autoflush="false" indentsize="4">
        <listeners>
            <add name="myListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="c:\mylogfile.log" />
        </listeners>
    </trace>
    <switches>
        <add name="My.Namespace.Class" value="4"/>      
    </switches>
</system.diagnostics>

イベントログやその他の関心のある場所に公開するためのリスナーをアタッチすることもできます。トレース フレームワークの詳細については、次の URL を参照してください。

http://msdn.microsoft.com/en-us/library/ms733025.aspx

于 2008-09-30T15:52:14.433 に答える
2

log4net の使用に同意します。

しかし、本当に単純なものが必要な場合は、WriteLine ごとに自動フラッシュする StreamWriter への参照を保持するシングルトンを用意することを検討してください。

そのため、ハード クラッシュが発生した場合にログ データを失うリスクを冒さずに、閉じる/開くのオーバーヘッドを回避して、セッション全体でファイルを開いたままにします。

于 2008-09-30T15:48:54.940 に答える
0

The logging frameworks like log4net should handle multi-threading correctly.

There might be also a useful hint: the logging significantly pollutes the code making it less readable. Did you consider using aspect for injecting logging functionality to the code at the compile time? See this article for an example.

于 2008-10-01T05:51:28.797 に答える
0

簡単な方法は、TextWriterTraceListener を提供し、それを Trace クラスの TraceListeners のコレクションに追加することです。これにより、すべての Trace.Write... 呼び出しが対応するファイルに自動的に書き込まれます。

于 2008-09-30T15:47:53.320 に答える