在多种方法中使用StreamWriter实例进行日志记录

时间:2012-04-19 10:06:21

标签: c# .net

我想在我的应用中记录状态,我想避免将TextWriter参数传递给方法,例如

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

3 个答案:

答案 0 :(得分: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()

答案 1 :(得分:0)

如果您使用“using statement”创建流写入,那么它将不在其范围之外。 msdn

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

如果要将stream用作全局变量,请尝试将sw声明为类memeber。 注意:如果使用全局变量,请记得关闭该编写器。

在你的情况下就像这样

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 :(得分:0)

如果您需要在不同的类中使用StreamWriter,您可以选择:

  1. 让它们从LoggingClass继承,并在其中定义StreamWriter

  2. 创建一个静态Logger类,使用静态SW,并使用静态方法Log(更好的方式imho)

    公共类Logger {     private static 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();         }     } }