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

本文关键字:StreamWriter 实例 方法 日志 记录 | 更新日期: 2023-09-27 18:31:32

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

public static void M1(TextWriter w) 

直到我调用的所有方法。无论如何要避免这样做?我想要类似以下内容的东西,但它出错了:名称"w"在当前上下文中不存在

无论如何,使流编写器的实例可用于所有方法?还是类似的东西?如果可能的话,你能举个例子吗?

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

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

首先,你可能想看看log4net或NLog,这两个日志记录框架可以提供很多功能并防止很多关于日志记录的问题。

这些框架并不难使用,您可以快速启动和运行。但是,如果您想要一个快速简单的解决方案,如您的请求所示:

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

如果您使用"using 语句"来创建流写入,那么它将在其范围之外不可用。MSDN

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

如果要使用流作为全局变量,请尝试将 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();
}

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

  1. 使它们继承自 LoggingClass 中定义的 StreamWriter

  2. 使用静态软件和静态方法创建静态记录器类 日志(恕我直言,更好的方法)

    公共类记录器{ 私有静态流编写器w; 公共无效日志(字符串消息) { 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.同花顺(); } }}