perl - 打开最新的日志文件并打印晚于特定时间戳的行

标签 perl logging ssh garbage-collection

我正在编写一个 Perl 脚本,我需要从垃圾收集日志中捕获一些行并将它们写入一个文件。

日志位于远程主机上,我正在使用 Net::OpenSSH 进行连接模块。

我需要阅读可用的最新日志文件。

在 shell 中,我可以使用以下命令找到最新的日志:

cd builds/5.7.1/5.7.1.126WRF_B/jboss-4.2.3/bin
ls -lat | grep '.log$' | tail -1

这将返回最新的日志:

-rw-r--r--   1 load     other    2406173 Jul 11 11:53 18156.stdout.log

所以在 Perl 中,我希望能够编写一些东西来定位并打开该日志以供阅读。

当我有那个日志文件时,我想打印时间戳大于指定时间的所有行。指定的时间戳是从最新日志消息时间中减去的 $Runtime 变量。

这是垃圾收集日志的最后消息:

                                      ...

73868.629: [GC [PSYoungGen: 941984K->14720K(985216K)] 2118109K->1191269K(3065984K), 0.2593295 secs] [Times: user=0.62 sys=0.00, real=0.26 secs]
73873.053: [GC [PSYoungGen: 945582K->12162K(989248K)] 2122231K->1189934K(3070016K), 0.2329005 secs] [Times: user=0.60 sys=0.01, real=0.23 secs]

因此,如果 $Runtime 的值为 120 秒,我将需要打印从时间戳 (73873.053 - 120) 秒开始的所有行。

最后我的脚本看起来像这样......

open GARB, ">", "./report/archive/test-$now/GC.txt" or die "Unable to create file: $!";

my $ssh2 = Net::OpenSSH->(
  $pathHost,
  user => $pathUser,
  password => $pathPassword
);
$ssh2->error and die "Couldn't establish SSH connection: ". $ssh2->error; 

# Something to find and open the log file.
print GARB #Something to return certain lines.
close GARB;

我意识到这有点类似于 this问题,但我想不出一种方法来根据我正在寻找的内容进行定制。非常感谢任何帮助!

最佳答案

找到最新的文件并将其提供给 perl:

 LOGFILE=`ls -t1 $DIR | grep '.log$' | head -1`
 if [ -z $LOGFILE ]; then
   echo "$0: No log file found - exiting"
   exit 1;
 fi

 perl myscript.pl $LOGFILE

第一行的管道列出了目录中的文件,仅名称,在一列中,最近的排在第一位;过滤日志文件,然后只返回第一个。

我不知道如何将您的时间戳转换成我可以理解的东西,并据此进行数学计算和比较。但总的来说:

$threshold_ts = $time_specified - $offset;
while (<>) {
  my ($line_ts) = split(/\s/, $_, 2);
  print if compare_time_stamps($line_ts, $threshold_ts);
}

编写阈值操作和比较作为练习留给读者。

关于perl - 打开最新的日志文件并打印晚于特定时间戳的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11436173/

相关文章:

excel - 使用电子表格::SimpleExcel

objective-c - 输出正在调用方法的类的名称的最佳方式是什么?

c++在Windows上调试日志记录

file - 通过ssh rsync删除现有文件

python - 我如何使用 python 打开远程服务器文件夹?

windows - 将 mac 上生成的 ssh key 转换为 ppk

c - 如何从 Makefile.PL 中找到 C 库头文件?

Perl LWP 用我的边界发布表单数据

perl - 如何对 if 条件下的值求和?

Azure V3函数登录另一个类库