在C#控制台应用程序中,是否有一种智能方法可以将控制台输出镜像到文本文件中?
目前我只是将相同的字符串传递给两个Console.WriteLine
和InstanceOfStreamWriter.WriteLine
一个日志方法.
这可能是一些更多的工作,但我会反过来.
TraceListener
为控制台实例化一个,为日志文件实例化一个; 之后Trace.Write
在代码中使用语句而不是Console.Write
.之后删除日志或控制台输出或附加其他日志记录机制变得更加容易.
static void Main(string[] args) { Trace.Listeners.Clear(); TextWriterTraceListener twtl = new TextWriterTraceListener(Path.Combine(Path.GetTempPath(), AppDomain.CurrentDomain.FriendlyName)); twtl.Name = "TextLogger"; twtl.TraceOutputOptions = TraceOptions.ThreadId | TraceOptions.DateTime; ConsoleTraceListener ctl = new ConsoleTraceListener(false); ctl.TraceOutputOptions = TraceOptions.DateTime; Trace.Listeners.Add(twtl); Trace.Listeners.Add(ctl); Trace.AutoFlush = true; Trace.WriteLine("The first line to be in the logfile and on the console."); }
据我所知,您可以在应用程序配置中定义侦听器,从而可以在不触及构建的情况下激活或停用日志记录.
这是一个简单的类,它将TextWriter子类化,以允许将输入重定向到文件和控制台.
像这样使用它
using (var cc = new ConsoleCopy("mylogfile.txt")) { Console.WriteLine("testing 1-2-3"); Console.WriteLine("testing 4-5-6"); Console.ReadKey(); }
这是班级:
class ConsoleCopy : IDisposable { FileStream fileStream; StreamWriter fileWriter; TextWriter doubleWriter; TextWriter oldOut; class DoubleWriter : TextWriter { TextWriter one; TextWriter two; public DoubleWriter(TextWriter one, TextWriter two) { this.one = one; this.two = two; } public override Encoding Encoding { get { return one.Encoding; } } public override void Flush() { one.Flush(); two.Flush(); } public override void Write(char value) { one.Write(value); two.Write(value); } } public ConsoleCopy(string path) { oldOut = Console.Out; try { fileStream = File.Create(path); fileWriter = new StreamWriter(fileStream); fileWriter.AutoFlush = true; doubleWriter = new DoubleWriter(fileWriter, oldOut); } catch (Exception e) { Console.WriteLine("Cannot open file for writing"); Console.WriteLine(e.Message); return; } Console.SetOut(doubleWriter); } public void Dispose() { Console.SetOut(oldOut); if (fileWriter != null) { fileWriter.Flush(); fileWriter.Close(); fileWriter = null; } if (fileStream != null) { fileStream.Close(); fileStream = null; } } }
查看log4net.使用log4net,您可以设置控制台和文件追加器,它们可以使用单个日志语句将日志消息输出到两个位置.
您不能使用>
命令将输出重定向到文件吗?
c:\>Console.exe > c:/temp/output.txt
如果需要镜像,可以尝试查找tee
将输出拆分为文件的win32版本.
您可以继承TextWriter类,然后使用Console.SetOut方法将其实例分配给Console.Out - 这尤其与将相同的字符串传递给log方法中的两个方法相同.
另一种方法可能是声明您自己的Console类并使用using语句来区分类:
using Console = My.Very.Own.Little.Console;
要访问标准控制台,您需要:
global::Console.Whatever
正如我从这里学到的那样,真的需要在这里分享我的解决方案.
首先,我们需要创建StreamWriter固有的新类,比如CombinedWriter;
然后使用Console.Out初始化CombinedWriter的新瞬间;
最后,我们可以通过Console.SetOut将控制台输出重定向到新类的瞬间;
以下代码是新课程适合我.
public class CombinedWriter : StreamWriter { TextWriter console; public CombinedWriter(string path, bool append, Encoding encoding, int bufferSize, TextWriter console) :base(path, append, encoding, bufferSize) { this.console = console; base.AutoFlush = true; // thanks for @konoplinovich reminding } public override void WriteLine(string value) { console.Write(value); base.WriteLine(value); } }
Log4net可以为您完成此操作.你只会写这样的东西:
logger.info("Message");
配置将确定打印输出是否将转到控制台,文件或两者.