2012-04-19 53 views
1

我想在我的應用程序中記錄狀態,並且我想避免將TextWriter參數傳遞給方法,例如在多種方法中使用StreamWriter的實例進行日誌記錄

public static void M1(TextWriter w) 

到我所說的所有方法。無論如何,要避免這樣做?我想要類似下面的東西,但它的錯誤:名稱'W'在當前上下文中不存在

無論如何,使所有方法的Streamwriter的實例可用?或類似的東西?如果可能,你可以提供一個例子。

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(); 
    } 

回答

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類中有一個(靜態)全局變量,或者創建一個新實例並每次調用它。

靜態,定義你的程序類的任何功能外:

static Logger logger = new Logger();

實例,只是定義在現場在必要時:

var logger = new Logger()

0

如果您正在使用「使用說明」,以創建流寫那麼將無法使用它的範圍之內。 msdn

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

如果你想使用流作爲一個全局變量試圖聲明SW作爲一個階級memeber。 注意:如果使用全局變量,請記得關閉streamwriter。

你的情況

它會是這樣

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(); 
} 
+2

我不會建議這個,因爲StreamWriter是IDisposable的,所以你會希望在可能的時候處理它。 – Bertvan 2012-04-19 10:15:29

+0

我與Bertvan。每當類實現IDisposable時,總是使用「using」語句。 – 2012-04-19 10:26:16

0

如果您需要使用您的StreamWriter在不同的班級,你有多種選擇:

  1. 讓他們從你的StreamWriter一個LoggingClass繼承在其中定義

  2. 用你的靜態SW和靜態方法創建一個靜態Logger類Log(更好的方法imho)

    public class Logger {0}私有靜態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(); }} } 所有的

相關問題