如何在C#中将控制台输出写入控制台和文件?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在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("
Done!");
关键是这会将内容直接打印到文件中,并且控制台中不会打印任何内容。有没有办法解决这个问题?请注意,我需要将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}YourAppYourApp-${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!");
另一答案
如何在string array
或List<string>
等变量中保存控制台输出?然后做File.WriteAllText(filepath, consoleOutputArray);
我的意思是这样的:
class Program
{
static void Main(string[] args)
{
List<string> textStorage = new List<string>();
string exampleData = "Ford Mustang";
Console.WriteLine(exampleData);
SaveOutput(ref textStorage, exampleData);
System.IO.File.WriteAllLines(@"C://Desktop//MyFolder", textStorage);
}
public static void SaveOutput(ref List<string> textStorage, string output)
{
textStorage.Add(output);
}
}
另一答案
每个控制台输出后,将输出存储在列表中,并在程序结束时更新包含详细信息的日志。
var list = new List<string>;
string xyz = "message";
Console.WriteLine(xyz);
list.add(xyz);
foreach (object o in list)
{
StreamWriter sw = null;
String Logfile = "C:ExceptionLog.txt";
if (!System.IO.File.Exists(LogFile))
{
sw = File.CreateText(LogFile);
}
else
{
sw = File.AppendText(@"C:ExceptionLog.txt");
}
sw.WriteLine(o);
sw.Close();
}
以上是关于如何在C#中将控制台输出写入控制台和文件?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Visual Studio C++ 中将西里尔文(俄语)字符输出到控制台?