包
org.apache.nifi | nifi-standard-nar
描述
“Tail”一个或多个文件,在文件写入数据时从文件中摄取数据。该文件应为文本文件。只有遇到新行(回车符、换行符或二者组合)时才会摄取数据。如果要跟踪的文件会定期“轮转”(日志文件通常如此),可以使用可选的“轮转文件名模式”从已轮转的文件中检索数据,即使NiFi未运行时发生了轮转(前提是NiFi重新启动时数据仍然存在)。通常建议将运行计划设置为几秒,而不是使用默认的0秒,因为如果调度过于频繁,此处理器会消耗大量资源。目前,此处理器不支持摄取轮转时已压缩的文件。
标签
file、log、source、tail、text
输入要求
不允许
是否支持敏感动态属性
否
TailFile 2.3.0 补充详情
TailFile介绍
此处理器提供了强大的功能,允许用户定期查看由其他进程正在写入的文件。当文件发生变化时,新行的数据会被摄取。此处理器假定文件中的数据为文本格式。
从文件系统跟踪文件看似简单,但实际上非常困难。这是因为我们要定期检查正在写入的文件内容。文件可能不断变化,也可能很少变化。文件可能会“轮转”(即重命名),重要的是,即使应用程序(此处指NiFi)重新启动,我们也能够从上次中断的地方继续处理。此外还有其他复杂情况。例如,NFS挂载的驱动器可能表明数据可读,但在尝试读取时返回NUL字节(Unicode 0),因为实际字节尚未确定(见相关属性),而且不同文件系统的时间戳粒度也不同。
此处理器旨在处理所有这些不同情况。这可能会导致配置略显复杂,但本文档将为您提供入门所需的所有信息!
模式
此处理器用于跟踪单个文件或多个文件,具体取决于配置的模式。选择的模式取决于要跟踪的文件所遵循的日志记录模式。在任何情况下,如果存在轮转模式,轮转文件必须是纯文本文件(目前不支持压缩)。
- 单文件:处理器将跟踪“要跟踪的文件”属性中指定路径的文件。
- 多文件:处理器将在“基本目录”中查找文件。它将根据“递归查找”属性递归查找文件,并跟踪与“要跟踪的文件”属性中提供的正则表达式匹配的所有文件。
轮转文件名模式
如果使用“轮转文件名模式”属性,当处理器检测到要跟踪的文件已轮转时,它将在轮转文件中查找可能遗漏的消息。为此,处理器将使用该模式在与要跟踪文件相同的目录中查找轮转文件。
为了在“多文件”模式下,当多个要跟踪的文件位于同一目录时仍能使用此属性,可以使用 ${filename} 标签来引用要跟踪文件的名称(不含扩展名)。例如,如果有:
/my/path/directory/my-app.log.1
/my/path/directory/my-app.log
/my/path/directory/application.log.1
/my/path/directory/application.log
“轮转文件名模式”可以设置为 ${filename}.log.* 。
不同模式和策略的说明
“单文件”模式假定即使存在轮转模式,要跟踪的文件名称始终不变。例如:
/my/path/directory/my-app.log.2
/my/path/directory/my-app.log.1
/my/path/directory/my-app.log
新的日志消息始终追加到my-app.log文件中。
如果将递归设置为“true”,要跟踪文件的正则表达式必须包含基本目录和要跟踪文件之间可能存在的中间目录。例如:
/my/path/directory1/my-app1.log
/my/path/directory2/my-app2.log
/my/path/directory3/my-app3.log
基本目录:/my/path
要跟踪的文件:directory[1-3]/my-app[1-3].log
递归:true
如果处理器配置为“多文件”模式,另外两个属性很重要:
- 查找频率:指定处理器再次列出要跟踪文件之前等待的最短时间。
- 最大年龄:指定根据文件的上次修改日期,认为不会再向文件追加新消息所需的最短时间。如果自文件修改以来经过的时间大于此时间段,则不会跟踪该文件。例如,如果一个文件在24小时前被修改,而此属性设置为12小时,则不会跟踪该文件。但如果此属性设置为36小时,则会继续跟踪该文件。
需要注意“查找频率”和“最大年龄”属性,以及处理器的触发频率,以实现高性能。建议保持“最大年龄” > “查找频率” > 处理器调度频率,以避免数据丢失。同时也不建议将“最大年龄”设置得过低,因为如果在文件被认为“太旧”之后又有消息追加到文件中,文件中的所有消息可能会被再次读取,从而导致数据重复。
如果处理器配置为“多文件”模式,“轮转文件名模式”属性必须足够具体,以确保只列出轮转文件,而不列出同一目录中当前正在跟踪的其他文件(可以使用 ${filename} 标签实现)。
处理多行消息
大多数情况下,跟踪文件时,我们希望定期接收文件中的数据。但在某些场景中,数据的写入方式可能需要将多行数据作为一个整体保留。例如,在日志文件中可能会找到以下文本行:
2021-07-09 14:12:19,731 INFO [main] org.apache.nifi.NiFi Launching NiFi...
2021-07-09 14:12:19,915 INFO [main] o.a.n.p.AbstractBootstrapPropertiesLoader Determined default application properties path to be '/Users/mpayne/devel/nifi/nifi-assembly/target/nifi-1.14.0-SNAPSHOT-bin/nifi-1.14.0-SNAPSHOT/./conf/nifi.properties'
2021-07-09 14:12:19,919 INFO [main] o.a.nifi.properties.NiFiPropertiesLoader Loaded 199 properties from /Users/mpayne/devel/nifi/nifi-assembly/target/nifi-1.14.0-SNAPSHOT-bin/nifi-1.14.0-SNAPSHOT/./conf/nifi.properties
2021-07-09 14:12:19,925 WARN Line 1 of Log Message Line 2: This is an important warning. Line 3: Please do not ignore this warning. Line 4: These lines of text make sense only in the context of the original message.
2021-07-09 14:12:19,941 INFO [main] Final message in log file
在这种情况下,我们可能希望确保日志行的摄取方式不会导致多行日志消息被拆分,例如将第1行和第2行放在一个FlowFile中,而将第3行和第4行放在另一个FlowFile中。为实现这一点,处理器提供了一个属性。如果将此属性设置为 \d{4}-\d{2}-\d{2} ,则是告诉处理器每个消息应以4位数字开头,后跟一个短划线、2位数字、一个短划线和2位数字,即每个消息以yyyy-MM-dd格式的时间戳开头。因此,即使处理器运行时只看到多行日志消息的第1行和第2行,它也不会立即摄取数据,而是会等待,直到看到下一个以时间戳开头的消息。
需要注意的是,在上述情况下,处理器遇到的最后一条消息是“Final message in log file”这一行。此时,处理器不知道下一行文本是属于这一行还是属于新消息。因此,它不会摄取此数据,而是会等待,直到遇到另一条匹配正则表达式的消息,或者文件轮转(重命名)。因此,如果写入文件的进程在此处停止写入,文件中的最后一条消息可能会有摄取延迟。
此外,正则表达式可能与文件中的数据不匹配,这可能导致缓冲整个文件内容,从而使NiFi内存耗尽。为避免这种情况,相关属性限制了可缓冲的数据量。如果缓冲的数据量达到此限制,即使尚未遇到另一条消息,也会将缓冲区的数据刷新到FlowFile中。
属性
显示名称 | 描述 | API名称 | 默认值 | 允许值 | 表达式语言作用域 | 是否敏感 | 是否必需 |
状态位置 | 指定状态存储位置,本地或集群,以便在NiFi重新启动时正确存储状态,确保所有数据被消费且不重复。 | File Location | Local | Local、Remote | 不支持 | 否 | 是 |
要跟踪的文件 | 单文件模式下为要跟踪文件的路径。多文件模式下为在基本目录中查找要跟踪文件的正则表达式。如果递归设置为true,正则表达式将用于匹配从基本目录开始的路径(示例见补充详情)。 | File to Tail | 无 | 无 | JVM级定义的环境变量和系统属性 | 否 | 是 |
初始起始位置 | 处理器首次开始跟踪数据时,此属性指定处理器应从何处开始读取数据。从文件摄取数据后,处理器将从上次接收数据的位置继续读取。 | Initial Start Position | 文件开头 | 时间起始点、文件开头、当前时间 | 不支持 | 否 | 是 |
行起始模式 | 用于匹配日志行开头的正则表达式。如果指定,任何匹配该表达式的行及其后续行将被缓冲,直到遇到另一个匹配该表达式的行。这样可以避免拆分文件中的多行消息,假定数据为UTF-8格式。 | Line Start Pattern | 无 | 无 | 不支持 | 否 | 否 |
最大缓冲区大小 | 使用行起始模式时,可能会出现正在跟踪的文件中的数据始终不匹配正则表达式的情况。这将导致处理器缓冲来自跟踪文件的所有数据,可能会迅速耗尽堆内存。为避免这种情况,处理器在刷新缓冲区之前最多只缓冲此数量的数据,即使这意味着从文件中摄取部分数据。 | Max Buffer Size | 64 KB | 无 | 不支持 | 否 | 是 |
轮转后跟踪周期 | 文件轮转后,处理器将继续跟踪轮转后的文件,直到该文件在指定时间内未被修改。这允许另一个进程轮转文件,然后刷新任何缓冲的数据。请注意,设置此值后,当跟踪的文件轮转时,新文件将在旧文件未被修改达到配置的时间后才会被跟踪。此外,使用此功能时,为避免数据重复,此周期必须设置得比处理器的运行计划长,并且在跟踪的文件轮转后且数据未完全消费之前,处理器不能停止。否则,可能会导致数据重复,因为整个文件可能会作为单个FlowFile的内容被写出。 | Post-Rollover Tail Period | 0秒 | 无 | 不支持 | 否 | 否 |
预分配缓冲区大小 | 设置为每个跟踪文件预分配的内存量。 | pre-allocated-buffersize | 65536 B | 无 | 不支持 | 否 | 是 |
遇到NUL时重读 | 如果此选项设置为“true”,读取到NUL字符时,处理器将暂停并稍后尝试再次读取相同部分。(注意:暂停可能会延迟此处理器对其他跟踪文件的处理,而不仅仅是包含NUL字符的文件。)此标志的目的是让用户处理读取文件可能返回临时NUL值的情况,例如NFS可能会乱序发送文件内容,此时缺失的部分会临时用NUL值替换。注意!如果文件包含合法的NUL值,设置此标志会导致处理器无限期挂起。因此,如果可以避免,用户应避免使用此功能,并尽量避免将目标文件放在读取不可靠的文件系统上。 | reread-on-nul | false | true、false | 不支持 | 否 | 否 |
轮转文件名模式 | 如果要跟踪的文件像日志文件那样“轮转”,此文件名模式将用于识别已轮转的文件,以便在NiFi重新启动且文件已轮转时,能够从上次中断的地方继续处理。此模式支持通配符*和?,也支持 ${filename} 表示法,用于根据文件名称(不含扩展名)指定模式,并假定已轮转的文件与正在跟踪的文件位于同一目录。所有文件都将使用相同的通配符模式。 | Rolling Filename Pattern | 无 | 无 | 不支持 | 否 | 否 |
基本目录 | 用于查找要跟踪文件的基本目录。在多文件模式下此属性是必需的。 | tail-base-directory | 无 | 无 | JVM级定义的环境变量和系统属性 | 否 | 否 |
跟踪模式 | 使用的模式:单文件模式将仅跟踪一个文件,多文件模式将查找文件列表。在多文件模式下,基本目录是必需的。 | tail-mode | 单文件 | 单文件、多文件 | 不支持 | 否 | 是 |
查找频率 | 仅在多文件模式下使用。指定处理器再次列出要跟踪文件之前等待的最短时间。 | tailfilelookup-frequency | 10分钟 | 无 | 不支持 | 否 | 否 |
最大年龄 | 仅在多文件模式下使用。指定根据文件的上次修改日期,认为不会再向文件追加新消息所需的最短时间。此值不应设置得过低,以避免在新消息追加频率较低的情况下出现数据重复。 | tailfile-maximumage | 24小时 | 无 | 不支持 | 否 | 否 |
递归查找 | 在多文件模式下,此属性定义是否在基本目录中递归列出文件。 | tailfile-recursive-lookup | false | true、false | 不支持 | 否 | 是 |
状态管理
作用域 | 描述 |
LOCAL、CLUSTER | 存储关于在跟踪文件中上次停止位置的状态,以便在重新启动时无需重复处理数据。状态根据<文件位置>属性存储在本地或集群中。 |
限制
所需权限 | 解释 |
读取文件系统 | 赋予操作员读取NiFi有权访问的任何文件的能力。 |
关系
名称 | 描述 |
success | 所有FlowFile都被路由到这个关系。 |
写入属性
名称 | 描述 |
tailfile.original.path | FlowFile来自的原始文件的路径。 |