0

我想创建一个在 linux 中处理日志文件的 perl 脚本。想法是将“有趣”的行与其他行进行排序。我的计划是: - 制作日志文件的临时副本(因为它是不断写入的) - 搜索“有趣的”行(关键字) - 将它们复制到另一个文件“log.processed” - 通过 e 发送该文件- 邮件给我。(我认为这部分将由 cron 完成)

直到现在我有这个:

#!/usr/bin/perl
#use strict;
use warnings;
use File::Copy;

copy("/home/hq-asa.log","/home/hq-asa.temp") or die "Copy failed $!";
$NewLog     = "/home/hq-asa.processed";
our $search = "keyword1|keyword2|";
my $TempLog = "/home/hq-asa.temp";

open (my $LogFile, "+<", $TempLog) or die "Could not open log temp file $!";
qx(touch $NewLog);
open ($newlog, "+<", $NewLog) or die "could not open new log file $!";
foreach $line (<$LogFile>) {
    if (($line =~ m/$search/) or ($line eq $search))  {
        print $newlog $line;
    }
}
close($LogFile);
close($newlog);
unlink "/home/hq-asa.temp";

不要评判,我是新手。问题是,如果我希望这个脚本每小时运行一次,它将一次又一次地处理所有原始日志文件。我可以在原始日志文件中插入一个“书签”并告诉这个脚本搜索最后一个并从那里继续吗?或者这应该怎么做?

4

2 回答 2

2

写出一个包含你离开的行号的状态文件。当您想恢复处理时,首先读取状态文件并跳过行数。

于 2013-07-12T07:31:37.187 回答
1

用于tell()获取您所谓的“书签”(文件中的偏移量)并seek()返回该位置。

此外,将 inode 编号( 的结果(stat $file)[1])与书签一起保存可能有助于确保该文件没有被另一个文件替换(考虑使用 旋转日志logrotate)。

于 2013-07-15T13:55:11.827 回答