【问题标题】:Text in file is not appended - C#文件中的文本未附加 - C#
【发布时间】:2011-07-17 18:14:43
【问题描述】:

我决定在我的应用程序中添加一个日志记录机制,这样我就可以捕获任何抛出的错误或异常。我注意到,当创建日志条目时,它不会添加到日志中,它似乎会覆盖文件中的所有内容,因此只有一个条目。

我觉得我缺少一些简单的东西,但我并不经常使用 System.IO 命名空间。

创建/检查日志文件:

public static void SetWorkingDirectory(string path)
        {
            _workingDirectory = path + "\\ErrorLog.txt";

            if(!File.Exists(_workingDirectory))
            {
                File.Create(_workingDirectory);
            }
            pathSet = true;
        }

添加到日志中:

public static bool Add(string message)
        {
            StringBuilder str = new StringBuilder();
            str.Append(System.DateTime.Now);
            str.Append(" ");
            str.Append(message);
            str.Append(" \n");

            using (StreamWriter writer = new StreamWriter(_workingDirectory))
            {
                writer.Write(str.ToString());
            }
            return true;
        }

日志本身:

【问题讨论】:

    标签: c# logging .net streamwriter


    【解决方案1】:

    尝试使用this 构造函数并为第二个参数传递true,以便它以追加模式打开文件。

    ...
    using(writer = new StreamWriter(_workingDirectory, true))
    ...
    

    【讨论】:

    • 哈哈,这是我想检查的最后一件事 =/ 我认为有一个“\n”会导致它写入一个新行,但我想这仅适用于控制台。谢谢!
    • 您的假设部分正确。问题是您每次打开文件时只写一行,而每次打开文件时,您都会覆盖旧文件而不是追加到文件末尾。
    【解决方案2】:

    只需使用 StreamWriter 的重载,它需要一个 bool 来确定它是否应该追加。

    using (var writer = new StreamWriter(_workingDirectory, true)
    {
        ...
    }
    

    【讨论】:

      【解决方案3】:

      您正在使用的 StreamWriter 构造函数会覆盖文件。有一个重载会追加:

       using (StreamWriter writer = new StreamWriter(_workingDirectory, true))
      

      It is all in the docs.

      此外,除非这是为了学习,否则请改用许多可用的日志记录框架之一。日志记录可能很难做到。

      【讨论】:

        【解决方案4】:

        之前已经花费了很多编程时间来解决这个问题。我建议使用 log4net 之类的日志记录包来节省您调试代码的时间,这些代码旨在让您检测正在编写的代码。

        【讨论】:

        • 有效的意见,但它不是这个问题的真正答案,不如评论一下?
        • 我的回答可能更像是对未来编程考虑的战略性回答,而不是“解决眼前问题”的回答。
        【解决方案5】:

        正如 driis 上面所说的,在执行日志记录时,最好使用现成的日志记录框架之一,因为无需付出极大的努力,他们就能比您更高效、更清洁地执行此操作。我在 .NET 中最喜欢的是使用预打包的 System.Diagnostics 跟踪实用程序,它允许您在应用配置中声明一个跟踪侦听器,然后只需在您的代码中写入它们,如下所示:

        Trace.Write("Test output ");
        

        您也可以使用log4Net 框架。

        【讨论】:

        • 谢谢肖恩,我会调查的 :)
        猜你喜欢
        • 2011-01-24
        • 1970-01-01
        • 2016-07-30
        • 2019-12-18
        • 1970-01-01
        • 1970-01-01
        • 2011-05-31
        • 1970-01-01
        相关资源
        最近更新 更多