Perl解析日志/存储结果/阅读结果

xqnpmsa8  于 2022-11-15  发布在  Perl
关注(0)|答案(3)|浏览(132)

不久前我创建了一个日志解析器。日志可以是几千行到几百万行。我将解析后的条目存储在一个哈希引用数组中。
我正在寻找有关如何存储输出的建议,以便在脚本再次运行时可以快速地将其读回(这样就不必重新解析日志)。
最终目标是有一个Web界面,允许用户创建查询(基本上是把解析后的输出当作存在于数据库中的输出)。
我已经考虑过将Data::Dumper的输出写入文件。
以下是使用Data::Dumper打印的数组项示例:

$VAR = 
          {
            'weekday' => 'Sun',
            'index' => 26417,
            'timestamp' => '1316326961',
            'text' => 'sys1  NSP
Test.cpp      1000
This is a example error message.
',
            'errname' => 'EM_TEST',
            'time' => {
                        'array' => [
                                     2011,
                                     9,
                                     18,
                                     '06',
                                     22,
                                     41
                                   ],
                        'stamp' => '20110918062241',
                        'whole' => '06:22:41',
                        'hour' => '06',
                        'sec' => 41,
                        'min' => 22
                      },
            'month' => 'Sep',
            'errno' => '2261703',
            'dayofmonth' => 18,
            'unknown2' => '1',
            'unknown3' => '1',
            'year' => 2011,
            'unknown1' => '0',
            'line' => 219154
          },`

有没有更有效的方法来完成我的目标?

t9aqgxwy

t9aqgxwy1#

如果输出是对象(或者如果你想让它变成一个对象),那么你可以用KiokuDB(沿着您选择的数据库后端)。如果不是这样,那么您可以使用Storable。当然,如果您的数据结构基本上模拟CSV文件,那么您可以将输出写入文件,也可以将数据输出到JSON对象中,然后将其存储在文件中,还可以放弃中间人而直接使用数据库。
您提到您的数据结构是一个“哈希数组”(可能您指的是哈希引用数组)。如果每个哈希引用的键都相同,那么您可以将其存储在CSV中。
如果不对您的数据进行更具体的说明,您不太可能得到一个具体的答案。

**编辑:**现在您已经发布了一些示例数据,您可以简单地将其写入CSV文件或数据库,其中包含indextimestamptexterrnameerrnounknown1unknown2unknown3line的值。

oknwwptz

oknwwptz2#

use Storable;

# fill my hash
store \%hash, 'file';

%hash = ();
%hash = %{retrieve('file')};
# print my hash
nsc4cvqm

nsc4cvqm3#

您可以使用KiokuDB、Storable或我们拥有的其他工具,但如果您计划进行聚合,从长远来看,使用关系数据库(或支持查询的数据存储)可能是最好的解决方案。使用SQLite等不需要运行数据库服务器的SQL引擎的轻量级数据存储可能是一个很好的起点。

相关问题