TailFile

文档中心 › 组件索引 › TailFile

TailFile Processor

类型全限定名:cn.org.acal.lynxus.processors.standard.TailFile

所属 Bundle:cn.org.acal.lynxus:lynxus-standard-nar:2.11.8

描述

"跟踪"一个文件或文件列表,在数据写入文件时摄取数据。

标签

tailfilelogtextsource

属性

下表中,加粗的属性为必填项;其余为可选项。表格同时标注默认值、是否支持表达式语言,以及是否为敏感属性(值会被加密)。

名称默认值可选值描述
Tailing ModeSingle file
  • 单文件 — 在此模式下,处理器仅监视 'Files to tail' 属性中指示的一个文件。在此模式下,启动处理器时文件可以不存在。
  • 多文件 — 在此模式下,'Files to tail' 属性接受正则表达式,处理器将在 'Base directory' 中查找文件以列取要由处理器跟踪的文件。
使用的模式:单文件模式仅追踪一个文件,多文件模式将查找文件列表。在多文件模式下需要指定基本目录。
要追踪的文件单文件模式下要追踪的文件路径。如果使用多文件模式,则为在基本目录中查找要追踪文件的正则表达式。当 recursive 设置为 true 时,正则表达式将从基本目录开始匹配路径(有关示例,请参阅更多详细信息)。
支持表达式语言:是(仅使用环境/系统变量求值)
Rolling Filename Pattern如果要追踪的文件发生'滚动'(如日志文件的情况),此文件名模式将用于识别已滚动的文件,以便在 Lynxus 重启且文件已滚动时,能够从上次中断的位置继续。此模式支持通配符 * 和 ?,也支持 ${filename} 表示法来基于文件名(不含扩展名)指定模式,并假定已滚动的文件与正在追踪的文件位于同一目录中。相同的 glob 模式将用于所有文件。
Post-Rollover Tail Period0 sec当文件发生滚动时,处理器将继续追踪已滚动的文件,直到该文件在指定时间内未被修改。这允许另一个进程滚动文件,然后刷新任何缓冲数据。请注意,设置此值后,当追踪的文件滚动时,在旧文件在指定时间内未被修改之前,新文件不会被追踪。此外,使用此功能时,为避免数据重复,此周期必须设置为长于处理器的运行调度周期,且在追踪的文件已滚动但数据尚未完全消费之前,不得停止处理器。否则,数据可能会被重复,因为整个文件可能被写入为单个 FlowFile 的内容。
Base Directory用于查找要追踪的文件的基本目录。使用多文件模式时此属性为必填项。
支持表达式语言:是(仅使用环境/系统变量求值)
Initial Start PositionBeginning of File
  • 最早数据 — 从匹配 Rolling Filename Pattern 的最旧数据开始,然后开始从 File to Tail 读取
  • 文件开头 — 从 File to Tail 的开头开始。不摄取已滚动的任何数据
  • 当前时间 — 从 File to Tail 末尾的数据开始。不摄取已滚动的任何数据或 File to Tail 中已写入的任何数据。
当处理器首次开始追踪数据时,此属性指定处理器应从何处开始读取数据。一旦从文件中摄取了数据,处理器将从上次接收数据的最后位置继续。
State LocationLocal
  • 本地 — 状态存储在本地。集群中的每个节点都会尾随一个不同的文件。
  • 远程 — 状态位于远程资源上。此处理器将在集群中存储状态,以便可以仅在主节点上运行,并且新的主节点可以从上一个主节点停止的地方继续。
指定状态存储位置(本地或集群),以便状态能够被适当存储,确保在 Lynxus 重启时所有数据都被消费且不重复。
Recursive Lookupfalse
  • true
  • false
在多文件模式下,此属性定义是否在基本目录中递归列出文件。
Lookup Frequency10 minutes仅在多文件模式下使用。指定处理器在再次列出要追踪的文件之前等待的最短时间。
Maximum Age24 hours仅在多文件模式下使用。指定根据文件最后修改日期判断不再有消息追加到文件中的最短时间。此值不应设置得太低,以避免在消息以较低频率追加时出现数据重复。
Reread on NUL Encounteredfalse
  • true
  • false
如果此选项设置为'true',当读取到 NUL 字符时,处理器将让步并稍后尝试重新读取相同部分。(注意:让步可能会延迟此处理器追踪的其他文件的处理,不仅仅是包含 NUL 字符的文件。)此标志的目的是允许用户处理读取文件可能返回临时 NUL 值的情况。例如,NFS 可能会乱序发送文件内容。在这种情况下,缺失的部分会被临时替换为 NUL 值。注意!如果文件包含合法的 NUL 值,设置此标志会导致此处理器无限期卡住。因此,用户应尽量避免使用此功能,并尽量避免将目标文件放在读取不可靠的文件系统上。
Line Start Pattern用于匹配日志行开头的正则表达式。如果指定,任何匹配该表达式的行及其后续行都将被缓冲,直到另一行匹配该表达式。这样可以避免将文件中的多行消息拆分。此功能假设数据为 UTF-8 格式。
Preallocated Buffer Size65536 B设置为每个追踪文件预分配的内存量。
Max Buffer Size64 KB使用行起始模式时,可能存在被追踪文件中的数据永远不匹配正则表达式的情况。这将导致处理器缓冲被追踪文件中的所有数据,可能迅速耗尽堆内存。为避免这种情况,处理器在刷新缓冲区之前最多只缓冲此数量的数据,即使这意味着摄取文件中的部分数据。

关系 (Relationships)

名称描述自动终止
success所有FlowFile都路由到此关系。否

写入的 FlowFile 属性

名称描述
tailfile.original.pathFlowFile 来源的原始文件的路径。

状态管理

作用域描述
LOCAL、CLUSTER存储关于在跟踪文件中停止位置的状态,以便在重新启动时不必重复数据。状态根据 <File Location> 属性以本地或集群方式存储。

受限 (Restricted)

该组件不受限。

输入要求

该组件不允许有传入连接。

详细说明

TailFile

简介

此 Processor 提供了一项强大的能力:允许用户周期性地监视一个正在被其他进程写入的文件。当文件发生 变化时,新增的行会被摄取(ingest)。该 Processor 假定文件中的数据是文本。

跟踪(tail)文件系统中的文件看似简单,实则出了名的困难。这是因为我们在周期性地检查一个正在被 写入的文件的内容:文件可能在不断变化,也可能很少变化;文件可能会被"轮转"(即重命名),而且 重要的是,即便在应用(本例中为 Lynxus)重启之后,也要能够从上次的位置继续。还有一些其他的 复杂情况:例如,NFS 挂载的磁盘可能显示数据可读,但实际读取时返回 NUL 字节(Unicode 0), 因为真正的字节尚不可知(参见 属性);不同的文件系统的时间戳 精度也各不相同。

此 Processor 的设计能够处理上述所有情况。这可能会使配置稍显复杂,但本文档应当能提供你上手 所需的全部内容!

模式

此 Processor 根据配置的模式用于跟踪一个或多个文件。选择哪种模式取决于被跟踪文件所遵循的日志 模式。无论哪种情况,如果存在轮转模式,轮转文件必须是纯文本文件(目前不支持压缩)。

  • Single file(单文件):Processor 会跟踪 'File(s) to tail' 属性中给出路径的文件。
  • Multiple files(多文件):Processor 会在 'Base directory' 中查找文件。它会按照 'Recursive lookup' 属性递归查找,并跟踪所有匹配 'File(s) to tail' 属性中所给正则表达式的文件。

轮转文件名模式(Rolling filename pattern)

如果使用了 'Rolling filename pattern' 属性,当 Processor 检测到被跟踪的文件发生轮转时, 会在轮转后的文件中查找可能遗漏的消息。为此,Processor 会使用该模式在与被跟踪文件相同的目录中 查找轮转文件。

为了在 'Multiple files' 模式下、当多个被跟踪文件位于同一目录时该属性仍然可用,可以使用 ${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

那么 'rolling filename pattern' 应为 ${filename}.log.*。

不同模式与策略的说明

'Single file' 模式假定即使存在轮转模式,被跟踪的文件名始终保持不变。示例:

/my/path/directory/my-app.log.2 /my/path/directory/my-app.log.1 /my/path/directory/my-app.log

新的日志消息总是追加到 my-app.log 文件中。

如果递归性(recursivity)设置为 'true',被跟踪文件的正则表达式必须能够涵盖基础目录与被跟踪 文件之间可能存在的中间目录。示例:

/my/path/directory1/my-app1.log /my/path/directory2/my-app2.log /my/path/directory3/my-app3.log

Base directory: /my/path Files to tail: directory[1-3]/my-app[1-3].log Recursivity: true

如果 Processor 配置为 'Multiple files' 模式,还有两个属性比较重要:

  • Lookup frequency(查找频率):指定 Processor 在再次列出被跟踪文件之前等待的最短时间。
  • Maximum age(最大存活时间):指定根据文件最后修改时间判断"不会再有新消息追加"所需的 最短时间。如果自文件上次修改以来经过的时间超过该时长,该文件将不再被跟踪。例如,如果一个 文件在 24 小时前被修改,而此属性设为 12 小时,则该文件不会被跟踪;但如果此属性设为 36 小时, 该文件会继续被跟踪。

要实现高性能,需要注意 'Lookup frequency'、'Maximum age' 属性以及 Processor 的触发频率。 建议保持 'Maximum age' > 'Lookup frequency' > Processor 调度频率,以避免丢失数据。也不建议 把 'Maximum Age' 设得太低,因为如果某个文件在被认为"太旧"之后又追加了消息,该文件中的所有 消息可能会被重新读取,导致数据重复。

如果 Processor 配置为 'Multiple files' 模式,'Rolling filename pattern' 属性必须足够 具体,以确保只列出轮转文件,而不会列出同一目录中当前正在被跟踪的其他文件(可以通过使用 ${filename} 标签来实现)。

多行消息的处理

大多数情况下,跟踪文件时我们乐于周期性接收数据,无论数据是如何写入文件的。但也存在一些场景, 数据的写入方式要求多行必须保持在一起。以日志文件中可能出现的如下文本为例:

2021-07-09 14:12:19,731 INFO [main] cn.org.acal.lynxus.Lynxus Launching Lynxus... 
2021-07-09 14:12:19,915 INFO [main] o.a.n.p.AbstractBootstrapPropertiesLoader Determined default application properties path to be '/Users/mpayne/devel/lynxus/lynxus-assembly/target/lynxus-1.14.0-SNAPSHOT-bin/lynxus-1.14.0-SNAPSHOT/./conf/lynxus.properties' 
2021-07-09 14:12:19,919 INFO [main] o.a.lynxus.properties.LynxusPropertiesLoader Loaded 199 properties from /Users/mpayne/devel/lynxus/lynxus-assembly/target/lynxus-1.14.0-SNAPSHOT-bin/lynxus-1.14.0-SNAPSHOT/./conf/lynxus.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 行进入另一个。为此,该 Processor 提供了 属性。如果 把该属性设置为 \d{4}-\d{2}-\d{2},就是告诉 Processor:每条消息应以 4 位数字开头,后跟一个 短横线、2 位数字、一个短横线和 2 位数字。也就是说,我们告诉它每条消息都以 yyyy-MM-dd 格式的 时间戳开头。正因如此,即使 Processor 运行时只看到多行日志消息的第 1、2 行,它也不会立即摄取 数据,而是等到看到下一条以时间戳开头的消息。

注意,正因如此,在上述情况下 Processor 遇到的最后一条消息是 "Final message in log file" 这一行。 此时,Processor 并不知道接下来遇到的文本是属于这一行的内容还是一条新消息,因此它不会摄取这条 数据,而是等到遇到另一条消息(匹配我们的正则)或者文件发生轮转(重命名)。因此,如果写入文件的 进程在此处停止写入,文件中最后一条消息的摄取可能会有一些延迟。

此外,还存在正则表达式与文件中的数据不匹配的风险。这可能导致整个文件的内容被缓冲,进而导致 Lynxus 内存耗尽。为避免这种情况, 属性限制了可缓冲的数据量。如果缓冲的数据 达到该上限,即使还没有遇到下一条消息,数据也会被刷新(flush)到 FlowFile 中。