我正在做一个项目,我正在读取日志文件并处理它们并将它们加载到 Postgres 数据库中。这些日志文件按月分开,这意味着我给我的脚本一个特定的月份,它会遍历目录(实际上它们是每个服务器的目录,有 8 个服务器)并抓取文件并上传它们。这段代码将它们加载到数据库中:
sub insert_n_gridftp_usage {
eval {
$sth = $dbh->prepare("INSERT into $stats_table VALUES ($epoch, '$servername', $currentnumhash{'RETR'}, $currentbyteshash{'RETR'}, $currentnumhash{'STOR'}, $currentbyteshash{'STOR'}, $currentnumhash{'ERET'}, $currentbyteshash{'ERET'}, $currentnumhash{'ESTO'}, $currentbyteshash{'ESTO'}, $currentnumhash{'LIST'}, $currentbyteshash{'LIST'}, $currentnumhash{'NLST'}, $currentbyteshash{'NLST'}, $currentnumhash{'MLSD'}, $currentbyteshash{'MLSD'}, $currentnum, $currentbytes);") || die;
$sth->execute;
$dbh->commit;
} or
do {
$stats_fails++;
eval { $dbh->rollback };
}
}
该表具有唯一索引约束,可防止加载重复记录。现在,当此语句遇到重复时,我在 stderr 上收到此错误:
DBD::Pg::st execute failed: ERROR: duplicate key value violates unique constraint "transfer_unique"DETAIL: Key (starttime, endtime, file)=(1366822840, 1366822840, /dev/null) already exists. at ./database_load_script.pl line 196, <LOGFILE> line 1332302.
LOGFILE 是我的变量,字行后面的数字是我的变量 $linenum。我没有在我的代码中的任何地方设置这个错误字符串。那么,这个字符串是从哪里来的呢?是否可以修改此字符串以指出其读取的文件?(我有一个文件名变量)。任何帮助表示赞赏。
谢谢。