【问题标题】:why is TextWriter logging to file incomplete?为什么 TextWriter 记录到文件不完整?
【发布时间】:2021-03-02 12:23:38
【问题描述】:

我正在尝试按照this solution here 将我的控制台输出也镜像到日志文件,但是,我注意到文件的输出被切断,因此完整的控制台输出没有完全输出到文件中。这是为什么? TextWriter 是否有一定的行数限制?

private TextWriter txtMirror = new StreamWriter("mirror.txt");

// Write text
private void Log(string strText)
{
    Console.WriteLine(strText);
    txtMirror.WriteLine(strText);
}

附言我使用这个解决方案的原因是因为我在函数中有Console.Writeline 以及我在main() 中调用。所以如果我改用this solution,我将不得不在我有Console.WriteLine()的任何地方打开一个using语句...这似乎是多余的

【问题讨论】:

  • 您能稍微解释一下这个问题吗? cut off 表示文本内容没有完全写入文件?您是否考虑过使用 log4net、NLog 等日志框架将日志写入文本文件?
  • 您是否刷新/关闭/处置您的 TextWriter?
  • @ChetanRanpariya 例如,如果我有 100 条语句/行打印到控制台,当我检查日志文件时,我只看到大约 60 条语句/行。我确实考虑过 log4net,但现在我正在研究一个简单的控制台 POC,所以我宁愿不包括第 3 方库/包:)
  • @KlausGütter 你说得对,我必须在每个Log("...") txtMirror.Flush(); txtMirror.Close(); 之后添加这两行。但是using 似乎以更优雅的方式处理了这个问题:)
  • 您也可以将其添加为 Log 方法的最后一行

标签: c#


【解决方案1】:

您可以使用AutoFlush 属性System_IO_StreamWriter_Flush

除非您明确调用 Flush 或 Close,否则刷新流不会刷新其底层编码器。将 AutoFlush 设置为 true 意味着每次写入操作后数据都会从缓冲区刷新到流中,但不会刷新编码器状态。

顺便说一句,如果您多次实例化您的记录器类,您将拥有许多StreamWriter 对象。确保按照documentation

处理它们

此类型实现 IDisposable 接口。当您使用完该类型后,您应该直接或间接地处理它。要直接释放该类型,请在 try/catch 块中调用其 Dispose 方法。要间接处理它,请使用语言构造,例如 using(在 C# 中)或 Using(在 Visual Basic 中)。有关详细信息,请参阅 IDisposable 接口主题中的“使用实现 IDisposable 的对象”部分。

释放对象,确保调用flush 并将任何缓冲信息写入底层对象。

例子:

// Write text
private void Log(string strText)
{
    Console.WriteLine(strText);
    using (StreamWriter txtMirror = new StreamWriter("mirror.txt")) {
        txtMirror.WriteLine(strText);
    }
}

【讨论】:

  • 哦,所以我必须在每个 Log("...") 之后添加这两行? txtMirror.Flush(); txtMirror.Close();
  • 如果你用using语句包裹StreamWriter,当代码退出using块时,它会调用Dispose/closeflush,你不需要做任何事情。
  • 我使用 using 添加了代码。如果你这样使用,它不应该错过任何行。
  • 哦,它只是true!现在它的附加:) using (StreamWriter txtMirror = new StreamWriter("mirror.txt", true))
  • 你也可以使用File.AppendText(path)创建一个StreamWriter来追加到一个文件中!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-09
相关资源
最近更新 更多