将日志写入文本文件不能按预期工作

时间:2013-05-03 08:04:15

标签: c# streamwriter

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

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 个答案:

答案 0 :(得分:3)

你的问题是你没有关闭日志文件,所以当你下次打开它时它仍然打开(因为垃圾收集器还没有运行并为你关闭它)。

这意味着你后来对日志记录功能的调用会得到一个异常,你隐藏了一个空的catch(这很糟糕!)。

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

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

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

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

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

答案 1 :(得分:2)

logFile.Close()之后添加logFile.Close()。您正在获取有关正在使用的文件的例外情况,但却默默地忽略它。

另外你应该使用

System.IO.Path.GetTempPath()

而不是

Environment.GetEnvironmentVariable("Temp")

因为前者更可靠。

答案 2 :(得分:1)

刷新后需要关闭写入流

添加

          logFile.Close();

喜欢

            logFile.WriteLine();
            logFile.Flush();
            logFile.Close();

答案 3 :(得分: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();
    }
}