好的,我正在尝试使用Tail来监控日志文件,但是我无法以编程方式获得与使用相同参数通过cmd提示手动运行它时相同的行为。
在cmd提示下运行时,它会立即显示新行 。但是以编程方式,我必须在“缓冲区”释放所有行之前等待日志文件中 75+个新行。
这是我现在的代码。
private const string tailExecutable = @"C:\tail.exe";
private const string logFile = @"C:\test.log";
private static void ReadStdOut()
{
var psi = new ProcessStartInfo
{
FileName = tailExecutable,
Arguments = String.Format("-f \"{0}\"", logFile),
UseShellExecute = false,
RedirectStandardOutput = true
};
// Running same exe -args through cmd.exe
// works perfectly, but not programmatically.
Console.WriteLine("{0} {1}", psi.FileName, psi.Arguments);
var tail = new Process();
tail.StartInfo = psi;
tail.OutputDataReceived += tail_OutputDataReceived;
tail.Start();
tail.BeginOutputReadLine();
}
static void tail_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
Console.WriteLine(e.Data);
}
之前我使用过OutputDataReceived事件,但从未遇到过这些缓冲/垃圾邮件问题。
我现在很困惑。
我发现this wintail project on CodeProject并且我将要切换到那个,因为缓冲区使得这个解决方案太慢了。
感谢您的回答。
答案 0 :(得分:2)
Process.StandardOutput,当重定向时,默认为具有4096字节缓冲区的StreamReader,所以答案是肯定的。
答案 1 :(得分:1)
在大多数语言和操作系统中,标准流通常是缓冲的,但错误流不是。
尝试使用:
System.Console.Error