我有一个用 c# 编码的服务器,我想知道.. 有没有办法记录控制台中弹出的所有内容,而不必去每行显示 Console.WriteLine 并添加 StreamWriter 或其他什么?
我将使用这个:
*.exe > *.log
但我希望能够在记录时看到控制台..有什么想法吗?
我有一个用 c# 编码的服务器,我想知道.. 有没有办法记录控制台中弹出的所有内容,而不必去每行显示 Console.WriteLine 并添加 StreamWriter 或其他什么?
我将使用这个:
*.exe > *.log
但我希望能够在记录时看到控制台..有什么想法吗?
您可以使用Trace来写入控制台和文件:
Trace.WriteLine("Hello");
要设置控制台和文件输出,请在应用程序启动时使用以下命令:
Trace.AutoFlush = true;
Trace.Listeners.Clear();
Trace.Listeners.Add(new ConsoleTraceListener());
Trace.Listeners.Add(new TextWriterTraceListener("log.txt"));
同样可以从配置文件中配置
<system.diagnostics>
<trace autoflush="true">
<listeners>
<clear/>
<add name="console" type="System.Diagnostics.ConsoleTraceListener"/>
<add name="file" type="System.Diagnostics.TextWriterTraceListener"
initializeData="log2.txt"/>
</listeners>
</trace>
</system.diagnostics>
但考虑使用一些日志框架行NLog(可从 NuGet 获得)。我认为这就是您所需要的-您可以同时写入控制台和文件以及许多其他目标,您可以通过更改配置文件来添加和删除它们:
<targets>
<target xsi:type="Console" name="console" layout="${time} ${message}"/>
<target xsi:type="File" name="file" fileName="${basedir}/logs/log.txt"/>
</targets>
<rules>
<logger name="*" minlevel="Trace" writeTo="file,console" />
</rules>
用法:
Logger logger = LogManager.GetCurrentClassLogger();
// after you obtained logger
logger.Info("Hello");// message goes to all targets
其可行性和易用性取决于您的程序是如何启动的。
如果您的程序是从命令行、批处理脚本或快捷方式启动的,您可以简单地重定向输出。像这样的东西:
myprogram.exe > mylogfile.txt
如果您正在编写一个启动另一个程序的程序,您可以通过重定向代码中的输出来完成同样的事情。请参阅ProcessStartInfo.RedirectStandardOutput
我认为您正在寻找的是使用类似tee
. 它旨在让您查看控制台输出以及将相同的输出重定向到文件。
它不随 Windows 一起提供,但它和其他有用的工具可在http://gnuwin32.sourceforge.net获得。当然比重写你的代码要好。:-)
编写一个方法,当您调用时,它会同时调用Console.WriteLine()
您用来记录的任何方法 - 然后调用该方法而不是Console.WriteLine()
public class Logger
{
public static void WriteLine(string s)
{
Console.WriteLine(s);
myLogger.WriteLine(s);
{
}
运行cmd,然后像这样执行你的exe
c:\Users\you> c:\Bin\yourexecutable.exe > c:\Log\yourexecutable.Log