题
为了在某种封闭的系统中进行调试,我必须将文本输出到文件中。
有谁知道在 Windows(基于控制台或非控制台)上运行的工具可以检测文件的更改并实时输出它们?
解决方案
- Win32 的尾部
- 阿帕奇电锯 - 与此一起使用 log4net 日志, ,可能要求文件采用某种格式
其他提示
我喜欢能够执行多项任务的工具,Notepad++ 是一个很好的记事本替代品,并且有一个文档监视器插件(与标准 msi 一起安装),效果很好。它也是便携式的,因此您可以将其放在拇指驱动器上以便在任何地方使用。
对于命令行选项,PowerShell(实际上是一个新的命令行)有一个已经提到的很棒的功能。
Get-Content someFile.txt -wait
但您也可以在命令行中使用正则表达式进行过滤
Get-Content web.log -wait | where { $_ -match "ERROR" }
我在 cygwin 下使用“tail -f”。
我用 裸尾 用于在 Windows 上执行此操作。它是免费的,并且有一些不错的功能,例如用于跟踪多个文件的选项卡和可配置的突出显示。
使用时 Windows PowerShell 您可以执行以下操作:
Get-Content someFile.txt -wait
FileSystemWatcher 的工作原理很不错,尽管您必须小心重复事件的触发 - 来自 Google 的第一个链接 - 但牢记这一点可以产生很好的结果。
Tail 是迄今为止最好的答案。
如果您不使用 Windows,您可能已经有了 tail。
如果您使用 Windows,您可以从这里获得大量 Unix 命令行工具: http://unxutils.sourceforge.net/ - 解压它们并将它们放在您的路径中的某个位置。
然后只需在日志文件所在的同一文件夹中的命令提示符下执行此操作:
tail -n 50 -f 随便.log
这将显示文件的最后 50 行,并将随着文件更新而更新。
你可以将 grep 与 tail 结合起来,得到很好的结果 - 像这样:
尾巴-n 50 -f whywing.log | GREP错误
只给你包含“Error”的行
祝你好运!
迟到的回答,虽然可能对某人有帮助—— 日志专家 对于 Windows 来说,尾部实用程序似乎很有趣。
我用过 文件系统观察者 用于监视我最近构建的组件的文本文件。可能有更好的选择(我从来没有在我的 有限的 研究)但这似乎很有效:)
糟糕,我的错,你实际上正在寻找一个可以为你完成这一切的工具。
好吧,如果你不走运并且想自己动手的话;)
尝试 Microsoft 的 SMSTrace(现在称为 CMTrace,在某些版本的 Windows 上可直接在“开始”菜单中使用)
它是一个出色的 GUI 工具,可以实时监控任何文本文件的更新,即使它被另一个文件锁定写入。
不要被描述所迷惑,它能够监控任何文件,包括 .txt、.log 或 .csv。
它监视锁定文件的能力非常有用, ,这也是该实用程序大放异彩的原因之一。
最好的功能之一是线条着色。如果看到“错误”一词,该线就会变成红色。如果看到“警告”一词,该线会变成黄色。这使得日志更容易跟踪。
蛇尾。这是一个不错的选择。http://snakenest.com/snaketail/
您可以使用 System.Diagnostics 中的 FileSystemWatcher。
来自 MSDN:
公共班观察者{
public static void Main()
{
Run();
}
[PermissionSet(SecurityAction.Demand, Name="FullTrust")]
public static void Run()
{
string[] args = System.Environment.GetCommandLineArgs();
// If a directory is not specified, exit program.
if(args.Length != 2)
{
// Display the proper way to call the program.
Console.WriteLine("Usage: Watcher.exe (directory)");
return;
}
// Create a new FileSystemWatcher and set its properties.
FileSystemWatcher watcher = new FileSystemWatcher();
watcher.Path = args[1];
/* Watch for changes in LastAccess and LastWrite times, and
the renaming of files or directories. */
watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite
| NotifyFilters.FileName | NotifyFilters.DirectoryName;
// Only watch text files.
watcher.Filter = "*.txt";
// Add event handlers.
watcher.Changed += new FileSystemEventHandler(OnChanged);
watcher.Created += new FileSystemEventHandler(OnChanged);
watcher.Deleted += new FileSystemEventHandler(OnChanged);
watcher.Renamed += new RenamedEventHandler(OnRenamed);
// Begin watching.
watcher.EnableRaisingEvents = true;
// Wait for the user to quit the program.
Console.WriteLine("Press \'q\' to quit the sample.");
while(Console.Read()!='q');
}
// Define the event handlers.
private static void OnChanged(object source, FileSystemEventArgs e)
{
// Specify what is done when a file is changed, created, or deleted.
Console.WriteLine("File: " + e.FullPath + " " + e.ChangeType);
}
private static void OnRenamed(object source, RenamedEventArgs e)
{
// Specify what is done when a file is renamed.
Console.WriteLine("File: {0} renamed to {1}", e.OldFullPath, e.FullPath);
}
}
您也可以点击此链接 在 VB.NET 中观察文件夹活动
只是一个无耻的插件来尾随答案,但我有一个免费的基于网络的应用程序,名为 钢锯 用于查看 log4net 文件。我添加了自动刷新选项,这样您就可以为自己提供近乎实时的更新,而无需一直刷新浏览器。
是的,我在 Win32 上使用了 Tail,在 Cygwin 上使用了 tail。我发现两者都非常出色,尽管我更喜欢 Cygwin,因为我能够有效地通过 Internet 跟踪文件而不会崩溃(Tail for Win32 在某些情况下对我来说崩溃了)。
所以基本上,我会在 Cygwin 上使用 tail 并将输出重定向到本地计算机上的文件。然后我会在 Vim 中打开这个文件并在需要时重新加载 (:e) 它。
裸尾+1。我实际上用 裸尾专业版, ,它通过基本搜索字符串或使用正则表达式的搜索字符串提供尾部实时过滤。
为了使列表完整,这里提供了许多有用工具(其中包括 tail)的 GNU WIN32 端口的链接。GNUWin32 CoreUtils
令人惊讶的是没有人提到 Trace32(或 Trace64)。这些都是很棒的(免费)Microsoft 实用程序,可以提供漂亮的 GUI 并突出显示任何错误等。它还具有过滤功能,听起来正是您所需要的。
这是我为此编写的一个实用程序:
它使用 FileSystemWatcher 查找本地文件夹或网络共享中日志文件的更改(不必安装,只需提供 UNC 路径)并将新内容附加到控制台。
在 github 上: https://github.com/danbyrne84/multitail
http://www.danielbyrne.net/projects/multitail
希望这可以帮助
文件星期一 是一个免费的独立工具,可以检测各种文件访问。您可以过滤掉任何不需要的内容。但它不会向您显示实际更改的数据。
我在 cygwin 中第二个“tail -f”。我认为 Win32 的 Tail 也会完成同样的事情。
我自己做了一个小查看器:
@echo off
set LoggingFile=C:\foo.txt
set lineNr=0
:while1
for /f "usebackq delims=" %%i in (`more +%lineNr% %LoggingFile%`) DO (
echo %%i
set /a lineNr+=1
REM Have an appropriate stop condition here by checking i
)
goto :while1
执行此操作的命令提示符方式。