【发布时间】:2010-10-20 09:41:45
【问题描述】:
我有一个以附加模式生成日志的应用程序,但日志没有时间戳。
是否可以使用带有某些选项的tail -f 或perl 脚本来监控对该文件的写入并在它们前面加上时间戳?
鉴于我在没有 Cygwin 的情况下运行 Windows,我是否可以避免使用 bash 或任何其他 Unix shell?
【问题讨论】:
我有一个以附加模式生成日志的应用程序,但日志没有时间戳。
是否可以使用带有某些选项的tail -f 或perl 脚本来监控对该文件的写入并在它们前面加上时间戳?
鉴于我在没有 Cygwin 的情况下运行 Windows,我是否可以避免使用 bash 或任何其他 Unix shell?
【问题讨论】:
如果您使用的是 GNU tail,那么您应该可以使用 GNU gawk。
C:\test>tail -F file | gawk.exe "{s=systime(); print strftime(\"%Y-%m-%d:%H:%M:%S\",s),$0}"
【讨论】:
gnuwin32.sourceforge.net/packages.html 下载 GNU 工具。 UnxUtils 的那些已经过时了
你可以使用while循环:
tail -f logfile | while read line;
do
echo $(date) $line;
done
暗示每行的运行日期。您可以使用 date 命令的格式输出选项来获取您想要的时间戳格式。
我非常基本的 Perl 等价物是 (script.pl):
while (<>) {
my $date = scalar localtime;
print $date . " " . $_;
}
tail -f logfile | perl script.pl
【讨论】:
echo 带有反引号,您可以将$line 作为参数传递给date:date +"%c $line"(前提是您的$line 不包含@987654328 的百分比代码@ 将解释为格式化指令)。
您可以使用带有 File::Tail 和 DateTime 的 perl 脚本吗?
use File::Tail;
use DateTime;
my $ref=tie *FH,"File::Tail",(name=>$ARGV[0]);
while (<FH>) {
my $dt = DateTime->now();
print "[", $dt->dmy(), " ",$dt->hms(),"] $_";
}
【讨论】:
看起来File::Tail 模块是专门为读取附加日志文件而设计的。
可能值得一看。
【讨论】: