使用Perl或Python将日志文件内容导入MySQL数据库

时间:2013-11-23 01:46:30

标签: python mysql perl

希望你有时间了解我目前的问题。

我有一个运行在linux(Centos)中的程序的日志文件,我想将每行导出到MySQL数据库。

这是我目前拥有的日志文件内容

1385164910 | 200 |一般| QUEUEPAUSE |本地/ 202 @从队列/正 1385168102 | 200 |一般| QUEUEREMOVE | 1000 |本地/ 202 @从队列/正 1385168125 | 200 |一般| QUEUEUNPAUSE |本地/ 201 @从队列/正 1385168244 | 200 |一般| QUEUEADD | 1000 |本地/ 200 @从队列/正 1385168249 | 200 |一般| QUEUEREMOVE | 1000 |本地/ 200 @从队列/正 1385168275 | 200 |一般| QUEUEADD | 1000 |本地/ 200 @从队列/ N

现在我想要在MySQL中导出每一行,我已经知道如何创建一个与MySQL一起工作的Perl,我已经知道创建一个循环来读取日志,它看起来像这样

#!usr/bin/perl

use strict;
use warnings;

my $file = '/var/log/fop2_audit.log';
open my $info, $file or die "Could not open $file: $!";

my $count = 0;
while( my $line = <$info>)  {

use DBI;
$dbh = DBI->connect('dbi:mysql:dbname','username','password')
or die "Connection Error: $DBI::errstr\n";

$sql = "INSERT INTO `Logs`(`logs`) VALUES ($line)";

$sth = $dbh->prepare($sql);

$sth->execute
or die "SQL Error: $DBI::errstr\n";

     }

close $info;

但我的问题是我如何在插入MySQL之后删除一行日志文本。 我怎么能按“|”分解日志并将细分字符串插入MySQL字段。

实施例

日志: 1385168249 | 200 |一般| QUEUEREMOVE | 1000 |本地/ 200 @从队列/ N

MySQL的: TimeStamp:1385168249 EXT:200 类型:一般 行动:QUEUEREMOVE 队列:1000 OtherInfo:Local / 200 @ from-queue / n

或者我可以在Python中更好地做到这一点?

提前感谢您的帮助......

1 个答案:

答案 0 :(得分:1)

不是从实时日志文件中删除行,而是更安全且更常见的方法是旋转日志文件,然后处理旧文件并将其删除。

对于问题的第二部分,解析日志行,你可以用Python或Perl做同样的努力。

这是一个(未经测试的)Perl片段。 需要具有适当架构的表。

my $sth->prepare(q/
    insert into logs (tstamp, ext, type, action, queue, otherinfo)
    values (?,?,?,?,?,?)
/);
while (my $line = <$info>) {
      $line =~ s/\s+$//; # strip trailing ws
      my @fields = split(/\|/, $line);
      $sth->execute(@fields);
}