1

アプリのステータスをログに記録したいのですが、 TextWriter パラメータをメソッドに渡さないようにしたいです。

public static void M1(TextWriter w) 

私が呼び出すすべてのメソッドまで。とにかくこれを避けるには?次のようなものが欲しいのですが、次のエラーが表示されます: The name 'w' does not exist in the current context

とにかく、ストリームライターのインスタンスをすべてのメソッドで利用できるようにするには? それともそのようなものですか?可能であれば、例を挙げていただけますか。

    public static void Main(string[] args)
    {
        using (StreamWriter w = File.CreateText(ConfigManager.logFile))
        {
            Log("start");
            M1();
            Log("end");
        }
    }

    public static void M1()
    {
        Log("M1 start");
        Log("M1 end");
    }

    public static void Log(string logMessage)
    {
        w.WriteLine("[{0}][{1}] {2} ", String.Format("{0:yyyyMMdd HH:mm:ss}", DateTime.Now),
            "Info", logMessage);
        w.Flush();
    }
4

3 に答える 3

6

まず最初に、log4net または NLog を調べてみてください。これは、多くの機能を提供し、ロギングに関する多くの問題を防ぐことができる 2 つのロギング フレームワークです。

これらのフレームワークは難しくなく、すぐに使い始めることができます。ただし、リクエストのように、すばやく簡単なソリューションが必要な場合は、次のようにします。

wその範囲ではわかりません。これに取り組むにはいくつかの方法がありますが、あなたの状況では次のことをお勧めします。

ロギングを行うクラスを作成します。

public class Logger
{
    public void Log(string message)
    {
        using (StreamWriter w = File.CreateText(ConfigManager.logFile))
        {
            w.WriteLine("[{0}][{1}] {2} ", String.Format("{0:yyyyMMdd HH:mm:ss}",  DateTime.Now), "Info", logMessage);
            w.Flush();
        }
    }
}

次に、そのクラスを呼び出します。静的 Program クラスに (静的) グローバル変数を含めるか、新しいインスタンスを作成して毎回呼び出すことができます。

静的、関数の外側の Program クラスで定義します。

static Logger logger = new Logger();

たとえば、必要に応じてその場で定義するだけです。

var logger = new Logger()

于 2012-04-19T10:14:05.743 に答える
0

「using ステートメント」を使用してストリーム書き込みを作成している場合、その範囲外では使用できません。 msdn

Using(StreamWriter sw= new StreamWriter(filename))
{
   sw.Writeline("error");
}

stream をグローバル変数として使用する場合は、sw をクラス メンバーとして宣言してみてください。注: グローバル変数として使用する場合は、ストリームライターを閉じることを忘れないでください。

あなたの場合、それはこのようになります

private static StreamWriter w;
public static void Main(string[] args)
{
    w = File.CreateText(ConfigManager.logFile);
    Log("start");
    M1();
    Log("end");        
}

public static void M1()
{
    Log("M1 start");
    Log("M1 end");
}

public static void Log(string logMessage)
{
    w.WriteLine("[{0}][{1}] {2} ", String.Format("{0:yyyyMMdd HH:mm:ss}", DateTime.Now),
        "Info", logMessage);
    w.Flush();
}
于 2012-04-19T10:11:47.927 に答える
0

別のクラスで StreamWriter を使用する必要がある場合は、次のオプションがあります。

  1. StreamWriter が定義されている LoggingClass から継承させる

  2. 静的SWと静的メソッドLogを使用して、静的Loggerクラスを作成します(より良い方法です)

    public class Logger { プライベート スタティック StreamWriter w; public void Log(string message) { if(w == null) w = File.CreateText(ConfigManager.logFile); { w.WriteLine("[{0}][{1}] {2} ", String.Format("{0:yyyyMMdd HH:mm:ss}", DateTime.Now), "Info", logMessage); w.Flush(); } } }

于 2012-04-19T10:12:50.537 に答える