如何实时监视文本文件


73

为了在稍微封闭的系统中进行调试,我必须将文本输出到文件中。

有谁知道在Windows上运行的工具(是否基于控制台)检测到文件更改并实时输出的工具?

Answers:



69

我喜欢可以执行多个任务的工具,Notepad ++是出色的记事本替代品,并且具有可很好工作的Document Monitor插件(与标准msi一起安装)。它还是便携式的,因此您可以将其放在随身碟上以在任何地方使用。

对于命令行选项,PowerShell(实际上是一个新命令行)具有已经提到的强大功能。

Get-Content someFile.txt -wait

但是您也可以在命令行使用正则表达式进行过滤

Get-Content web.log -wait | where { $_ -match "ERROR" }

4
在Notepad ++中,对于那些在“插件”菜单下找不到“文档监视器”的人,可以使用“插件管理器”来安装它。
StormPooper 2012年

从网络打开文件时,两者都不起作用:(
Mikhail

我发现文档监视器仅在关闭正在写入要监视的文件的应用程序后才更新。
生锈的

Get-Content给我一个错误,提示“该进程无法访问该文件,因为该文件正在被另一个进程使用。”
生锈的2014年

当前似乎没有文档监视器插件,但是View菜单底部有一个内置的“监视”选项。
标记



14

我使用BareTail在Windows上执行此操作。它是免费的,并且具有一些不错的功能,例如用于拖尾多个文件的选项卡和可配置的突出显示。


7

到目前为止,尾巴是最好的答案。

如果您不使用Windows,则可能已经有尾巴了。

如果您确实使用Windows,则可以从此处获得大量的Unix命令行工具。解压缩它们并将它们放在您的PATH中的某个位置。

然后只需在命令提示符下从您的日志文件所在的文件夹中执行此操作:

tail -n 50 -f whatever.log

这将向您显示文件的最后50行,并将随着文件更新而更新。

您可以将grep与tail结合使用,从而获得不错的效果-如下所示:

tail -n 50 -f whatever.log | grep Error

给您仅带有“错误”的行。

祝好运!


在我的路径中。我的路径是什么?
user4951 2014年

6

FileSystemWatcher可以解决问题,尽管您确实需要对重复事件的触发有所注意-Google的第一个链接-但记住这一点会产生很好的结果。


5

答案较晚,尽管可能对某人有所帮助-LOGEXPERT似乎是Windows的有趣尾部实用程序。


我真的很喜欢LOGEXPERT,但在Windows10上无法像在Windows7上正常工作,我无法使用sftp打开文件
vanduc1102 '16

3

我使用FileSystemWatcher监视我最近构建的组件的文本文件。可能有更好的选择(我在有限的研究中从未发现任何东西),但这似乎很好地完成了这个技巧:)

糟糕,我不好,您实际上是在寻找一种为您完成所有工作的工具。

好吧,如果您不走运并且想自己滚一下;)


3

尝试使用Microsoft的SMSTrace(现在称为CMTrace,在某些版本的Windows的“开始”菜单中直接可用)

它是一个出色的GUI工具,可以实时监视对任何文本文件的更新,即使它被锁定以供其他文件写入也是如此。

请勿被描述所迷惑,该描述能够监视任何文件,包括.txt,.log或.csv。

它监视锁定文件的功能非常有用,这也是该实用程序亮起的原因之一。

最好的功能之一是线条着色。如果看到单词“ ERROR”,该行将变为红色。如果看到单词“ WARN”,该行将变为黄色。这使日志更容易遵循。


这绝对是一个隐藏的宝石。
道格2014年

2

蛇尾巴。这是一个不错的选择。 http://snakenest.com/snaketail/


1
我进行了一些测试,即使它的定义很简单,SnakeTail还是做得很好:在文件尾部使用通配符模式。例如,在Sitecore开发中,您将有一个名为的日志文件,log.20150901.220158.txt但是在重新编译/配置更改后,将使用不同的时间戳生成一个新文件。使用通配符模式设置SnakeTaillog.*.txt会自动在行中尾随下一个文件,而无需切换目标。谢谢小费,埃里克。
FrederikStruck-Schøning15年

不客气,老兄。
Erick Alves

1

您可以在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中监视文件夹活动


1

答案很简单,但是我有一个免费的基于Web的应用程序,称为Hacksaw,用于查看log4net文件。我设置了自动刷新选项,因此您可以进行近乎实时的更新,而不必一直刷新浏览器。


1

是的,我在Win32上使用了Tail,在Cygwin上使用了tail。我发现两者都很出色,尽管我稍微偏爱Cygwin,因为我能够高效地通过Internet尾部文件而不会崩溃(在某些情况下,Win32的尾巴在我身上崩溃了)。

因此,基本上,我会在Cygwin上使用tail,并将输出重定向到本地计算机上的文件。然后,我将在Vim中打开此文件,并在需要时重新加载(:e)。


1

裸尾+1。我实际上使用的是BareTailPro,它使用基本搜索字符串或使用正则表达式的搜索字符串在尾部提供实时过滤。



1

没人惊讶提到Trace32(或Trace64)。这些都是很棒的(免费的)Microsoft实用程序,它们提供漂亮的GUI并突出显示任何错误等。它还具有过滤功能,听起来像您所需要的。


1

这是我编写的用于执行此操作的实用程序:

它使用FileSystemWatcher在本地文件夹或网络共享中查找日志文件中的更改(不必挂载,只需提供UNC路径),并将新内容附加到控制台。

在github上:https : //github.com/danbyrne84/multitail

http://www.danielbyrne.net/projects/multitail

希望这可以帮助


-1 NullReferenceException-是否经过良好测试?
Grim

1
认真地为此投票吗?哇,我不卖这个-只是试图说明如何做到这一点。您是否在运行之前将路径放入配置文件?
Managedheap84 2014年


0

我在Cygwin中第二个“ tail -f”。我认为Tail for Win32将完成相同的操作。




0
@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

一种命令提示符方式。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.