希望你有时间了解我目前的问题。
我有一个运行在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中更好地做到这一点?
提前感谢您的帮助......
答案 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);
}