最終的には、多くの選択肢があり、あなたに最適なアプローチを選ぶ必要があります。私が開発したさまざまな製品の例をいくつか紹介します。
静的ログ
@Matt Wilkoがすでに共有として、あなたは単純なアプローチの一つを取り、ログの静的List<String>
を持つことができます。ログの要件が本当に簡単であれば、これが最良の方法かもしれません。必要なプログラミングを最小限に抑えて、アプリケーション全体でアクセスできる共有ログを提供します。
public static class Log
{
private static readonly List<String> entries = new List<String>();
public static ICollection<String> Entries => entries;
}
私が追加されます唯一のノートでは、それは内部的にList<String>
かもしれませんがList<String>
としてICollection<String>
は、クラスのプライベートな実装の詳細ではなく、公共のAPIタイプとして、より目的としているように私はこれを公開するだろうということです、発呼者はそれを知る必要はなく、ケアしてもよい。作業ロギングAPIの
ユニット
私は、我々のデータ層の一部として、ロギングAPIを書きました。Webアプリケーションの一部として構築した標準のログビューアがありますが、すべてのソフトウェアは一貫したAPIを使用して同じ場所にログを記録します。我々の場合、これは最終的にEntity Framework
を使用していますが、StreamWriter
またはFileStream
です。あなたはそれを無視し、APIの設計にのみ焦点を当てることができます。
using (var context = new DataContext())
{
context.Log.NewEntry(LogCategory.Information, "Message");
}
我々は数百万行を持っているので、私は、パフォーマンスのためのさまざまなオプションを設計し、そのログを書き出すために準備が整うまで、あなたは無効context.AutoSave
のようなものを行うことができます。また、これがデータレイヤの一部だったのに対し、それ自体はLogContext
に抽象化されています。
using (var logger = new LogContext())
{
logger.NewEntry(LogCategory.Error, "Message");
}
そして最終的に、我々はSingleton
ので、ログが共有されますので、私たちは、アプリケーションのための単一LogContext
を持っていたとして、別の層でこれを実装しました。
コンポーネントのロギングは
私は最近、私は、プロセスの終了時にログを収集し、ユーザーにそれを表示したいアプリケーションを書きました。私の場合、それはウィザードベースのアプリケーションで、各ページは同じ基本クラスから派生し、独自のログを担当していました。私の場合は
public abstract class UpgradeStep
{
public ICollection<Log>
{
get;
private set;
}
}
public class DatabaseUpgradeStep : UpgradeStep
{
public override void PerformStep()
{
Log.Add(new UpgradeLog { Message = "Hello" });
}
}
、ログはちょうどSystem.String
ませんでしたが、ウィザード・プロセスの最後に、私はUpgradeSteps
の私のコレクションを列挙し、様々なステップから集団ログを生成することができました。
ロギングを実装する方法はたくさんあります。私が言ったように、複雑なものが必要な場合を除いて、シンプルでニーズに合ったものを選んでください。あなたのケースでは、あなたのニーズはかなり基本的なように聞こえますが、あまりにも多くのログを書き込んだ後で私たちが生きるいくつかのヒントを残しておきます。リソースファイルに
- イベントを使用して、ロジックからあなたのログを分離しようとすると、コールバック、アダプタ
- 入れロギング言い回しではなくどこ長い言い回しのコードを変更
- 使用状況コードなしに変更することができるように適切な
モジュールを作成します(これはグローバルになります)。そこにあなたのリストを 'Dim loggingList as New List(Of String)'として宣言します。 – Arvo
ツールを再開発するのではなく、いくつかの本当に良いロギングライブラリがありますが、これをすべて行うためのクラスは理にかなっています。 1つのインスタンスでアプリのすべてを記録できます。 – Plutonix