使用 NEwspaper 读取日志文件以进行报告

Using NEsper to read LogFiles for reporting purposes

我们正在评估NEsper。我们的重点是在企业环境中监控数据质量。在一个应用程序中,我们将记录很多字段上的每个更改 - 例如在“订单”中。所以我们有像

这样的字段

...还有更多字段。可以想象,日志文件会越来越大。

因为数据是由不同的客户发送的,并且在应用程序中导入,所以我们想分析有多少(以及哪些)字段从“无值”更新为“有值”(仅作为示例)。

我试着用字段构建一个测试用例

对于我的测试用例,我添加了两个带有上下文信息的语句。第一个应该只计算每个订单的一般变化:

epService.EPAdministrator.CreateEPL("create context RefContext partition by Ref from LogEvent");
var userChanges = epService.EPAdministrator.CreateEPL("context RefContext select count(*) as x, context.key1 as Ref from LogEvent");

第二条语句应计算从“无值”到“有值”的更新:

epService.EPAdministrator.CreateEPL("create context FieldAndRefContext partition by Ref,Fieldname from LogEvent");
var countOfDataInput = epService.EPAdministrator.CreateEPL("context FieldAndRefContext SELECT context.key1 as Ref, context.key2 as Fieldname,count(*) as x from pattern[every (a=LogEvent(Value = '') -> b=LogEvent(Value != ''))]");

要读取测试日志文件,我使用 csvInputAdapter:

CSVInputAdapterSpec csvSpec = new CSVInputAdapterSpec(ais, "LogEvent");
csvInputAdapter = new CSVInputAdapter(epService.Container, epService, csvSpec);
csvInputAdapter.Start();

我不想使用更新监听器,因为我只对所有事件的结果感兴趣(可能这是不可能的,这是我的失败)。

因此在读取 csv (csvInputAdapter.Start() returns) 后,我读取了所有事件,这些事件存储在语句 NewEvents-Stream.

在 CSV 文件中使用 10 个条目一切正常。使用 100 万行需要很长时间。我在没有 EPL 声明的情况下尝试过(所以只是 CSV 导入)——大约需要 5 秒。对于第一个语句(不是复杂模式语句),我总是在 20 分钟后停止 - 所以我不确定需要多长时间。

然后我改变了我的第一条声明的EPL:我引入了一个group by而不是context。

select Ref,count(*) as x from LogEvent group by Ref

现在它真的很快 - 但在 CSVInputAdapter 返回后我的 NewEvents 流中没有任何结果...

我的问题:

  1. 我想使用 NEsper 的方式是一个受支持的用例还是这是我失败的根本原因?

  2. 如果这是一个有效的用例:我的错误在哪里?我怎样才能以高效的方式获得我想要的结果?

  3. 为什么使用“group by”而不是“context”时我的 EPL 语句中没有 NewEvents?

对1),是

对于 2) 这是有效的,您的 EPL 设计可能有点低效。您可能希望通过使用过滤器索引和索引条目来了解模式的工作原理,这些索引和索引条目的创建成本更高,但丢弃不需要的事件的速度非常快。 读: http://esper.espertech.com/release-7.1.0/esper-reference/html_single/index.html#processingmodel_indexes_filterindexes 还有 http://esper.espertech.com/release-7.1.0/esper-reference/html_single/index.html#pattern-walkthrough 也许试试 "previous"。分别衡量每个语句的性能。 我也不认为 CSV 适配器针对处理大文件进行了优化。我认为 CSV 可能无法流式传输。

至 3) 检查您的代码?不要将 CSV 文件用于大型内容。确保附加了侦听器。