【问题标题】:Perl processing log filePerl 处理日志文件
【发布时间】:2013-07-10 16:25:26
【问题描述】:

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

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

【问题讨论】:

  • 你为什么要评论use strict;
  • 不想妨碍您获得一些乐趣和学习,但 Logwatch 完全符合您的描述:logwatch.org
  • 因为我收到错误和警告,因为并非所有变量都定义为“我的”或“我们的”。它仅用于测试目的。当脚本运行时,我将在稍后取消注释该行。
  • @ManeaDragosh 不,不,不,你搞错了。 use strict 有助于使您的脚本正常工作,而不是相反,无论那是什么奇怪的方式? (对已经“有效”的脚本使用 strict ?)
  • 如果您这样做是为了学习,请意识到注释掉 use strict 是一个错误。除了简单的单行代码或可怕、复杂的遗留代码(可能)之外,您应该始终使用 strict。

标签: linux perl logging


【解决方案1】:

写出一个包含line number 的状态文件。想恢复处理时,先读取状态文件,跳过行数。

【讨论】:

  • 好的,这听起来不错。但我怎么知道我离开的地方?我如何找到最后一个行号?
  • 我的答案中有一个超链接。请遵循它。
【解决方案2】:

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

同时将 inode 编号((stat $file)[1] 的结果)与书签一起保存可能有助于确保文件未被另一个文件替换(考虑使用 logrotate 轮换日志)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-22
    • 1970-01-01
    • 2015-11-21
    • 1970-01-01
    • 1970-01-01
    • 2011-03-09
    • 1970-01-01
    • 2014-08-22
    相关资源
    最近更新 更多