从控制台监控日志文件更新使用 JMP 17.2.0,我尝试从控制台(在本例中为 Mac OS 终端)监控 JSL 日志文件的输出。 我正在使用尾巴命令与-F每当写入文件时实时查看更新的选项。
$ tail -f log.txt
但是,当新文本写入日志时,控制台输出永远不会更新。 下面的示例 JSL 每秒输出一行文本:
Open Log();
Clear Log();
For( ii=0, ii<10, ii++,
Write( "hello, world " || Char( ii ) || "\!n" );
Save Log( "log.txt" );
Wait( 1 );
);
当我启动脚本时,然后运行尾巴命令几秒钟后,我得到了预期的结果:
$ tail -f log.txt
/*:hello, world 0
hello, world 1
hello, world 2
hello, world 3
但随后的 JSL 日志消息不会被尾巴命令。 如果我Ctrl-C退出,然后重新运行尾巴,我当时正确地将所有内容输出到日志文件中。 但输出再也不会更新。
关于为什么这行不通的任何想法? 或者是否有另一种方法来管理日志文件,使其按预期工作?
自动化和脚本编写苹果系统回复:从控制台监控日志文件更新使用“powershell版本的tail”似乎工作正常(除非文件首先存在,否则这不会运行)
Get-Content -Path "<logfilepath>" -Wait
https://stackoverflow.com/questions/4426442/unix-tail-equivalent-command-in-windows-powershell
我确实写了日志
Names Default To Here(1);
For(i = 1, i <= 30, i++,
Show(i);
wait(1);
Save Log("$TEMP/jmplog/log.txt");
);
您可以手动检查日志文件是否按照您的想法进行更新,如果是这样,则开始找出 tail 出了什么问题。 例如,保存日志是否可以每次重新创建文件,并且因此尾部删除实时跟踪?
通常当我从 JMP 写入日志时,我使用保存文本文件() 。 首先创建带有标题的文件(如果我有的话),然后使用 mode("append") 添加新行。 仅当我想获取整个日志内容时,我才使用 Save Log() (例如,当代码有错误时保存日志)。 获取日志()有时也很有用。
编辑:也许将 -f 更改为 -F 会有帮助? https://man7.org/linux/man-pages/man1/tail.1.html
-f, --follow[={name|descriptor}]
output appended data as the file grows;
-F same as --follow=name --retry
--retry
keep trying to open a file if it is inaccessible回复:从控制台监控日志文件更新@史蒂夫特里如果是因为 JMP 正在替换文件并且 tail 无法锁定新文件(似乎有可能),那么(大约是伪代码)如下所示:
xxx = get log text();
clear log(); // so each chunk is appended only once
savetextfile("log.txt", xxx, mode("append") );
或者,您可以使用手表,例如
watch tail log.txt
每隔几秒重新运行 tail 命令。 更容易,但效率不那么高。
回复:从控制台监控日志文件更新谢谢@jthi , 这-F选项是让它发挥作用的原因。 不知道为什么我没有在男人页面 - 可能是因为我一直在使用-F几十年来,并不热衷于跳出框框思考。 仅供参考, - 重试Mac 上不存在该选项;看起来你是在 Linux 环境中使用 JMP 吗? 我想了解更多相关信息。
我用保存文本文件()动态构建 JSL 脚本需要迭代相当多的时间,但我认为这在这里不合适,因为它不会捕获发送到日志的内容,例如,写()和展示() ,所以这将是双重工作。
@Craige_Hales ,感谢您的建议。 供参考,手表没有出现在 Mac 上(无论如何对于基本安装 - 也许我可以手动安装它),尽管我在 Ubuntu 上看到了。 天哪,你是否也以某种方式将 JMP 与 Linux 结合起来? ;–)
正如你们俩所指出的,看起来确实如此保存日志()正在以一种给它一个新的 inode 的方式重写文件,这尾部-f输了。 这看起来效率很低。 我可以想象这在某些进行大量日志缓冲区操作(例如定期清除)的情况下可能会有用。 但我认为,对于大多数应用程序来说,如果存在将日志缓冲区刷新到预先分配的文件的机制,那就更好了。 我的代码实际上有问题保存日志()非常频繁地执行命令,以便在发生运行时故障时捕获最近的活动(这样我就可以识别故障之前它最后一次执行的操作)。 现在听起来这会造成大量的磁盘抖动。 这可能是我想建议的新功能吗?
回复:从控制台监控日志文件更新我在 Linux 下的 VirtualBox 中运行的 Windows 上运行 JMP。 JSL 可以与 Linux 对话吗?例如。
我认为您可能想要添加的愿望是 JMP 也能够与日志窗口并行写入磁盘文件日志,可能会刷新每一行的输出。
回复:从控制台监控日志文件更新我在 Windows 上运行 JMP。 我刚刚用谷歌搜索尾巴并检查了该手册页(不过我已经将它与 cygwin 一起使用来监视日志)。
回复:从控制台监控日志文件更新将此功能添加到愿望清单中,以防有人想要评论或投票。
https://community.jmp.com/t5/JMP-Wish-List/Provide-option-to-write-log-file-to-disk-in-parallel-with-the/idi-p/701103