我如何使用NiFi处理器RouteOnContent

时间:2018-04-12 12:56:58

标签: apache-nifi

我试图读取像那样的日志文件:

199.72.81.55 - - [01/Jul/1995:00:00:01 -0400] "GET /history/apollo/ HTTP/1.0" 200 6245
unicomp6.unicomp.net - - [01/Jul/1995:00:00:06 -0400] "GET /shuttle/countdown/ HTTP/1.0" 200 3985
199.120.110.21 - - [01/Jul/1995:00:00:09 -0400] "GET /shuttle/missions/sts-73/mission-sts-73.html HTTP/1.0" 200 4085
burger.letters.com - - [01/Jul/1995:00:00:11 -0400] "GET /shuttle/countdown/liftoff.html HTTP/1.0" 304 0
199.120.110.21 - - [01/Jul/1995:00:00:11 -0400] "GET /shuttle/missions/sts-73/sts-73-patch-small.gif HTTP/1.0" 200 4179

我每次运行此练习时都会发送1000行,并且我使用的是splitText处理器,而在extractText处理器中我使用此正则表达式:

successCode -> ^[0-9A-Z\-a-z\.]* - - \[[0-9A-Za-z\/\:]* -[0-9]*\] \"[A-Z]* [0-9A-Za-z\/\.\- ]*\" ([0-9]*) [0-9]*
tiemStamp -> ^[0-9A-Z\-a-z\.]* - - \[([0-9A-Za-z\/\:]*) -[0-9]*\] \"[A-Z]* [0-9A-Za-z\/\.\- ]*\" [0-9]* [0-9]*
important -> ^([0-9A-Z\-a-z\.]*) - - \[[0-9A-Za-z\/\:]* -[0-9]*\] \"[A-Z]* [0-9A-Za-z\/\.\- ]*\" [0-9]* [0-9]*

这可能是一个错误。当然这是我的问题。

然后,我尝试将不同的日志发送到不同的路由。如果successCode == 200,那么我试着将它放在route / user // success /%{tiemStamp} /上,但我的所有行都转到第三种方式:"无法匹配"

在RouteOnContent处理器上我尝试过:

successCode -> ${successCode:equals("200")}
successCode -> ${successCode:contains(2)}
successCode -> ${successCode:contains("2")}

有没有人使用" RouteOnContent"处理器?

2 个答案:

答案 0 :(得分:3)

根据文档,=INDIRECT(VLOOKUP(A1;c_colors;2;FALSE)) 处理器"根据FlowFile的内容评估一个或多个正则表达式。 将这些正则表达式的结果分配给FlowFile属性 [...]"

因此,您不应在下一步使用ExtractText处理器,而应使用RouteOnContent处理器。

(如果您停止RouteOnAttribute处理器以便将消息保留在队列中,您可以看到流文件的内容。在流文件的" Attributes"选项卡中,您可以看到不同属性的值。我用你的正则表达式确认,我有successCode = 200。)

答案 1 :(得分:1)

基本上,您可以同时使用RouteOnAttributeRouteOnText,但是每个参数都使用不同的参数。

如果选择使用ExtractText,则会为每一行填充定义的属性(在SplitText处理器拆分原始文件之后)。 现在,您有两个选择:

  1. 基于已提取的属性的路由(RouteOnAttribute)。
  2. 基于内容(RouteOnContent)的路由。在这种情况下,您实际上不需要使用Extract Text

每个处理器对FlowFile的路由方式不同:

  1. RouteOnAttribute 查询FlowFile的属性(NiFi表达式语言查询)。例如,假设我定义了属性“名称”,则基于其值的路由可以是: enter image description here

  2. 另一方面, RouteOnContext 根据正则表达式表达式查询FlowFile的内容。例如: enter image description here

定义这些参数后,您可以继续基于以下动态关系进行路由: enter image description here