如何在C#中将控制台输出写入控制台和文件?

错别字

我有一个简单的控制台应用程序,并且Console.WriteLine在很多地方都使用过向用户显示正在执行的活动。但是,最后,我还要将所有控制台输出也保存到日志文件中。目前,我有这样的事情:

if (!Directory.Exists(LOG_DIRECTORY)) {
    Directory.CreateDirectory(LOG_DIRECTORY);
}

long ticks = DateTime.Now.Ticks;
string logFilename = ticks.ToString() + ".txt";
string filePath = Directory.GetCurrentDirectory() + "\\" + LOG_DIRECTORY + "\\" + logFilename;
FileStream ostream = null;
StreamWriter writer = null;
TextWriter oldOut = Console.Out;

try
{
    ostream = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.Write);
    writer = new StreamWriter(ostream);
}
catch (Exception ex)
{
    Console.WriteLine("Cannot open {0} for writing.", logFilename);
    Console.WriteLine(ex.Message);
    return;
}

Console.SetOut(writer);

Console.WriteLine("{0}", Directory.GetCurrentDirectory());

Console.SetOut(oldOut);
writer.Close();
ostream.Close();

Console.WriteLine("\n\nDone!");

关键是这将把内容直接打印到文件中,而在控制台中什么也不会打印。有什么办法可以解决此问题?请注意,我需要将Console.WriteLine输出直接实时地写入控制台,而要写入日志文件,则可以在程序的结尾完成,几乎完成了其他所有操作。

磁盘垃圾

您可以创建自己的组件以写入多个输出,也可以使用日志记录工具(例如NLog)。可以<targets>对它进行配置,以便在该部分中您可以看到类似的内容。

<target name="debugger" xsi:type="Debugger" layout="${level}>${message} (${exception:format=ToString})"/>
<target name="console" xsi:type="ColoredConsole" layout="${date:format=dd-MM-yyyy HH\:mm\:ss} - ${message}" />
<target name="FullCSVFile" xsi:type="File"  fileName="${specialfolder:folder=LocalApplicationData}\YourApp\YourApp-${date:format=yyyy-MM-dd}.csv">
  <layout xsi:type="CsvLayout">
    <column name="Index" layout="${counter}" />
    <column name="ThreadID" layout="${threadid}" />
    <column name="Time" layout="${longdate}" />
    <column name="Severity" layout="${level:uppercase=true}" />
    <column name="Location" layout="${callsite:className=False:fileName=True:includeSourcePath=False:methodName=False}" />
    <column name="Detail" layout="${message}" />
    <column name="Exception" layout="${exception:format=ToString}" />
  </layout>
</target>

然后在本rules节中,您将有:

<logger name="*" minlevel="Debug" writeTo="console" />
<logger name="*" minlevel="Debug" writeTo="debugger" />
<logger name="*" minlevel="Debug" writeTo="FullCSVFile" />

要实际执行写操作,您的C#代码中将包含以下内容:

// at a class level;
private static NLog.Logger _logger = NLog.LogManager.GetCurrentClassLogger();

// later in code that writes to both targets...
_logger.Info("Something happened!");

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何将控制台输出写入txt文件

写入控制台和文本文件

如何输出到控制台和文件?

如何在golang中将消息记录到控制台和文件?

将输出写入日志文件和控制台

如何在C#中返回Postgresql函数的结果?控制台输出为空

C#:控制台输出无限(∞)

如何在控制台应用程序中将值永久写入app.config文件?

如何在Visual Studio单元测试中将Serilog输出写入控制台?

如何在Java中为控制台写入和文件写入设置不同的日志记录级别

tcpdump抑制脚本中的控制台输出并写入文件

Catch2-输出到控制台和文件

如何在RStudio服务器中同时将输出保存到控制台和文件?

Resharper:如何写入控制台输出

grunt lesslint如何防止将输出写入控制台

控制台写入文件问题

在postsharp中将日志写入文件而不是控制台

如何在控制台和文档中将内置方法分配给javascript中的变量?

如何在OS X中将命令输出同时重定向到控制台和文件

将robocopy输出写入控制台和日志文件

如何在 C# 中写入网页而不是控制台?

Java:如何在控制台和文件中打印控制台的每个输出?

使用 dictConfig 记录并写入控制台和文件

如何在 Java 中将控制台输出写入 Excel 文件

将控制台输出写入文件

如何在java中将eclipse控制台输出转换为txt文件

将命令标准输出写入控制台和文件(实时)——Python 3.5 + subprocess.run()

在 C♯ 中将转换字符输出到控制台

C#如何将控制台输出写入文件?