0

我有一个日志类,如下所示。

public  class Log
{
    public  StreamWriter logFile
    { get; set; }

    public  string logFilePath = Environment.GetEnvironmentVariable("Temp")+"\\testlog.txt";

    public  string LogFilePath
    {
        get
        {
            return logFilePath;
        }
        set
        {
            value = logFilePath;
        }
    }

    public  void WriteLog(string logMessage)
    {
        try
        {
            if (!File.Exists(logFilePath))
            {
                logFile = new StreamWriter(logFilePath);
            }
            else
            {
                logFile = File.AppendText(logFilePath);
            }

            logFile.WriteLine(DateTime.Now);
            logFile.WriteLine(logMessage.ToString());
            logFile.WriteLine();
            logFile.Flush();
        }
        catch
        {
        }
    }
}

我使用下面给出的对象在类中调用了上述WriteLog函数。Log

Log lg = new Log();
lg.WriteLog("message1");
lg.WriteLog("message2");
lg.WriteLog("message3");
lg.WriteLog("message4");

问题是只有“message1”被添加到日志中。不写入所有其他消息。

我该如何解决这个问题?

4

4 回答 4

3

您的问题是您没有关闭日志文件,因此当您下次写入它时它仍然处于打开状态(因为垃圾收集器尚未运行并为您关闭它)。

这意味着您会在后续调用日志记录函数时遇到异常,您将其隐藏为空catch(这很糟糕!)。

您必须关闭或处置该文件。最好的方法是将其全部包含在 using 中。这意味着您也不需要刷新(因为关闭/处理 FileStream 将首先刷新它)。

using即使发生异常,A也会确保它关闭。实际上,我认为您可以将整个事情简化为:

public void WriteLog(string logMessage)
{
    using (var logFile = File.AppendText(logFilePath))
    {
        logFile.WriteLine(DateTime.Now);
        logFile.WriteLine(logMessage);
        logFile.WriteLine();
    }
}

File.AppendText()如果一个文件尚不存在,将创建一个新文件,因此您无需先检查。

关于你所拥有的空虚catch永远不要那样做。始终至少记录异常消息。如果你这样做了,你会看到一个异常正在发生,你会看到它是什么——这可能会告诉你出了什么问题。

于 2013-05-03T08:09:37.380 回答
2

logFile.Close()logFile.Close(). _ 您收到有关正在使用的文件的异常,但默默地忽略它。

你也应该使用

System.IO.Path.GetTempPath()

代替

Environment.GetEnvironmentVariable("Temp")

因为前者更可靠。

于 2013-05-03T08:11:21.033 回答
1

您需要在 Flush 之后关闭 writestream

添加

          logFile.Close();

            logFile.WriteLine();
            logFile.Flush();
            logFile.Close();
于 2013-05-03T08:13:15.207 回答
0

同一个文件有两个作家。The StremWriter第二个File.AppendText。后者将打开一个不可写的新流。因此,在代码中(未经测试),在构造函数中移动流的初始化:

public class Log : IDisposable
{
    public const string logFilePath = Environment.GetEnvironmentVariable("Temp")+"\\testlog.txt";

    public Log() 
    {
            try
            {
                logFile = new StreamWriter(logFilePath);
            }
            catch
            {
                logFile = File.AppendText(logFilePath);
            }
    }

    public  StreamWriter logFile { get; set; }

    public  string LogFilePath
    {
        get
        {
            return logFilePath;
        }
        set
        {
            value = logFilePath;
        }
    }

    public  void WriteLog(string logMessage)
    {
        logFile.WriteLine(DateTime.Now);
        logFile.WriteLine(logMessage.ToString());
        logFile.WriteLine();
        logFile.Flush();
    }

    public void Dispose()
    {
        logfile.Dispose();
    }
}
于 2013-05-03T08:21:06.950 回答