2016-05-10 4 views
0

複数のクラスを使用するVB.NETプロジェクトで作業しており、System.IO FileWriterを使用してエラーメッセージとログメッセージをファイルに書き込みます。この動作を変更し、別のアプリケーションに送信できる単一のList(Of String)でエラーメッセージとログメッセージを収集したいと思います。私がここで求めているのは、Listクラス(Of String)型のグローバル変数をいくつかのクラスで使用できることに似ています。ここで私が求めています何の例を示します(列の)複数のクラスで1つのList(Of String)をロギング目的で使用する

薄暗いloggingListとして一覧=(列の)新規一覧

クラス1: loggingList.Add( "メッセージの文字列")

クラス2: loggingList.Add( "メッセージ文字列")

クラス3: loggingList.Add( "メッセージ文字列")

私は上記で定義されたどのような実現は、タイプLのインスタンス変数でしたist(Of String)、しかし私がしようとしている動作は、3つのクラスすべてで同じList(Of String)を使用することです。私が何をすべきか、それをどうするべきかはわかりません。私は静的クラスをList(Of String)で定義する必要があると考えていますが、わかりません。

私は静的なクラスについて読んできましたが、質問に答えるために必要な情報が見つかりません。私は、別のクラスで同じList(Of String)を使用したいと思います。そして、すべてのメッセージを収集したら、すでにそのリストを別のアプリケーションに送るコードを持っています。助けを前にありがとう。

+1

モジュールを作成します(これはグローバルになります)。そこにあなたのリストを 'Dim loggingList as New List(Of String)'として宣言します。 – Arvo

+0

ツールを再開発するのではなく、いくつかの本当に良いロギングライブラリがありますが、これをすべて行うためのクラスは理にかなっています。 1つのインスタンスでアプリのすべてを記録できます。 – Plutonix

答えて

0

ちょうどあなたのリストであるShared Propertyを持つクラスを使用します。

Public Class Logging 
    Public Shared Property LogMessages As New List(of String) 
End Class 

ザ・あなたのアプリケーションでこのどこかのようなエントリを追加することができます

Logging.LogMessages.Add("message string") 

これは、使用してより良いオプションですあなたが将来的に機能を拡張することができるため、モジュール

+0

この最後の応答を読む前に、Moduleオプションを実装しました。クラスとモジュールの使用の違いを明確にしていただきありがとうございます。 List(Of String)を渡すコードは、パラメーターとしてリストをとります。どのように私はそのプロパティゲッターを使用してパラメータとして私のloggingListを渡すことができますか? –

+0

'MyMethod(Logging.LogMessages)'と呼ぶだけで、 –

0

最終的には、多くの選択肢があり、あなたに最適なアプローチを選ぶ必要があります。私が開発したさまざまな製品の例をいくつか紹介します。

静的ログ

@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の私のコレクションを列挙し、様々なステップから集団ログを生成することができました。

ロギングを実装する方法はたくさんあります。私が言ったように、複雑なものが必要な場合を除いて、シンプルでニーズに合ったものを選んでください。あなたのケースでは、あなたのニーズはかなり基本的なように聞こえますが、あまりにも多くのログを書き込んだ後で私たちが生きるいくつかのヒントを残しておきます。リソースファイルに

  • イベントを使用して、ロジックからあなたのログを分離しようとすると、コールバック、アダプタ
  • 入れロギング言い回しではなくどこ長い言い回しのコードを変更
  • 使用状況コードなしに変更することができるように適切な
関連する問題