文件输入插件
编辑文件输入插件
编辑- 插件版本: v4.4.6
- 发布日期: 2023-12-13
- 更新日志
对于其他版本,请参阅版本化插件文档。
获取帮助
编辑有关插件的问题,请在Discuss论坛中开启一个主题。对于错误或功能请求,请在Github中开启一个issue。有关 Elastic 支持的插件列表,请查阅Elastic 支持矩阵。
描述
编辑从文件中流式传输事件,通常以类似于tail -0F
的方式跟踪文件,但可以选择从头开始读取它们。
通常,日志记录会在写入的每一行的末尾添加一个换行符。默认情况下,每个事件都被认为是一行,并且一行被认为是换行符之前的文本。 如果你想将多行日志连接到一个事件中,你需要使用多行编解码器。插件在发现新文件和处理每个已发现的文件之间循环。已发现的文件具有生命周期,它们从“已监视”或“已忽略”状态开始。生命周期中的其他状态是:“活动”、“已关闭”和“未监视”
默认情况下,使用 4095 个文件的窗口来限制正在使用的文件句柄的数量。处理阶段有多个阶段
- 检查“已关闭”或“已忽略”的文件自上次以来大小是否发生变化,如果发生变化,则将其置于“已监视”状态。
- 选择足够多的“已监视”文件以填充窗口中的可用空间,这些文件被设为“活动”。
- 打开并读取活动文件,默认情况下,每个文件从上次已知位置读取到当前内容的末尾 (EOF)。
在某些情况下,能够控制首先读取哪些文件、排序以及是否完整读取或分带/条纹读取是很有用的。完整读取是所有文件 A,然后是文件 B,然后是文件 C,依此类推。分带或条纹读取是一些文件 A,然后是文件 B,然后是文件 C,依此类推,循环回到文件 A,直到读取完所有文件。通过更改file_chunk_count
和file_chunk_size
来指定分带读取。如果你希望所有文件中的某些事件尽早出现在 Kibana 中,则分带和排序可能很有用。
插件有两种操作模式:跟踪模式和读取模式。
跟踪模式
编辑在此模式下,插件旨在跟踪正在更改的文件,并在内容附加到每个文件时发出新内容。在此模式下,文件被视为永无止境的内容流,并且 EOF 没有特殊意义。插件始终假设会有更多内容。当文件轮换时,会检测到较小或零大小,当前位置将重置为零,并且流式传输继续。必须先看到分隔符,然后才能将累积的字符作为一行发出。
读取模式
编辑在此模式下,插件将每个文件视为内容已完成,也就是说,有限的行流,并且现在 EOF 很重要。不需要最后一个分隔符,因为 EOF 表示可以将其累积的字符作为一行发出。此外,此处的 EOF 表示可以关闭该文件并将其置于“未监视”状态 - 这会自动释放活动窗口中的空间。此模式还使得可以处理压缩文件,因为它们的内容是完整的。读取模式还允许在完全处理完文件后执行操作。
过去,尝试在仍然假设无限流的情况下模拟读取模式并不理想,而专用的读取模式是一种改进。
与 Elastic Common Schema (ECS) 的兼容性
编辑此插件添加有关事件来源的元数据,并且可以使用ecs_compatibility
配置以ECS 兼容的方式进行。此元数据在事件被适当的编解码器解码后添加,并且永远不会覆盖现有值。
ECS 已禁用 | ECS v1 , v8 |
描述 |
---|---|---|
|
|
处理事件的 Logstash 主机的名称 |
|
|
事件来自的日志文件的完整路径 |
跟踪已监视文件中当前位置
编辑该插件通过在名为 sincedb 的单独文件中记录每个文件的当前位置来跟踪该位置。这使得可以停止并重新启动 Logstash,并且使其在停止时能够从它离开的位置继续,而不会错过在 Logstash 停止时添加到文件中的行。
默认情况下,sincedb 文件放置在 Logstash 的数据目录中,其文件名基于正在监视的文件名模式(即path
选项)。因此,更改文件名模式将导致使用新的 sincedb 文件,并且任何现有的当前位置状态都将丢失。如果你的模式更改频率很高,则明确选择带有sincedb_path
选项的 sincedb 路径可能更有意义。
每个输入必须使用不同的sincedb_path
。使用相同的路径会导致问题。每个输入的读取检查点必须存储在不同的路径中,这样信息才不会被覆盖。
文件通过标识符进行跟踪。该标识符由 inode、主设备号和次设备号组成。在 Windows 中,从kernel32
API 调用中获取不同的标识符。
Sincedb 记录现在可以过期,这意味着在一定时间段后将不再记住旧文件的读取位置。文件系统可能需要为新内容重用 inode。理想情况下,我们不会使用旧内容的读取位置,但是我们没有可靠的方法来检测是否发生了 inode 重用。这与在 sincedb 中跟踪大量文件的读取模式更为相关。但请记住,如果记录已过期,则将再次读取先前看到的文件。
Sincedb 文件是文本文件,具有四列 (< v5.0.0)、五列或六列
- inode 号(或等效项)。
- 文件系统的主设备号(或等效项)。
- 文件系统的次设备号(或等效项)。
- 文件中的当前字节偏移量。
- 上次活动时间戳(浮点数)
- 此记录上次匹配的已知路径(对于转换为新格式的旧 sincedb 记录,此项为空白)。
在非 Windows 系统上,可以使用例如ls -li
来获取文件的 inode 号。
从远程网络卷读取
编辑文件输入没有在诸如 NFS、Samba、s3fs-fuse 等远程文件系统上进行全面测试,但是偶尔会对 NFS 进行测试。远程 FS 客户端给出的文件大小用于控制在任何给定时间读取多少数据,以防止读取到已分配但尚未填充的内存中。由于我们在标识符中使用设备主设备号和次设备号来跟踪文件的“上次读取”位置,并且在重新挂载时,设备主设备号和次设备号可能会更改,因此 sincedb 记录可能与重新挂载不匹配。读取模式可能不适用于远程文件系统,因为由于远程到客户端复制过程中的延迟,客户端侧发现时的文件大小可能与远程侧的文件大小不同。
跟踪模式下的文件轮换
编辑此输入会检测并处理文件轮换,无论文件是通过重命名还是复制操作进行轮换的。为了支持在轮换发生后一段时间内写入轮换文件的程序,请在要监视的文件名模式(path
选项)中同时包含原始文件名和轮换文件名(例如 /var/log/syslog 和 /var/log/syslog.1)。对于重命名,将检测到 inode 已从/var/log/syslog
移动到/var/log/syslog.1
,因此“状态”也会在内部移动,不会重新读取旧内容,但会读取重命名文件上的任何新内容。对于复制/截断,复制到新文件路径中的内容(如果发现)将被视为新发现,并从头开始读取。因此,复制的文件路径不应在要监视的文件名模式(path
选项)中。将检测到截断,并将“上次读取”位置更新为零。
文件输入配置选项
编辑此插件支持以下配置选项以及稍后描述的通用选项。
持续时间设置可以文本形式指定,例如“250 ms”,此字符串将转换为十进制秒。 有许多受支持的自然和缩写持续时间,有关详细信息,请参见string_duration。
设置 | 输入类型 | 必需 |
---|---|---|
否 |
||
否 |
||
否 |
||
否 |
||
否 |
||
否 |
||
否 |
||
否 |
||
否 |
||
字符串,以下之一: |
否 |
|
否 |
||
字符串,以下之一: |
否 |
|
字符串,以下之一: |
否 |
|
否 |
||
否 |
||
字符串,以下之一: |
否 |
|
是 |
||
否 |
||
否 |
||
否 |
||
字符串,以下之一: |
否 |
|
否 |
另请参阅 通用选项,以获取所有输入插件支持的选项列表。
check_archive_validity
编辑- 值类型为 布尔值
- 默认值为
false
。
当设置为 true
时,此设置会在处理压缩文件之前验证其是否有效。文件会经过两次扫描——一次扫描以验证文件是否有效,另一次扫描以处理文件。
验证压缩文件需要更多处理时间,但可以防止损坏的存档导致循环。
close_older
编辑文件输入会关闭在指定持续时间(如果指定为数字,则为秒)之前最后读取的任何文件。这会根据文件是被跟踪还是被读取而产生不同的影响。如果跟踪文件,并且传入数据的时间间隔很大,则可以关闭文件(允许打开其他文件),但在检测到新数据时会排队等待重新打开。如果读取文件,则文件会在上次读取字节后经过 close_older 秒后关闭。如果您将插件升级到 4.1.0+,并且正在读取而不是跟踪,并且不切换到使用读取模式,则会保留此设置以实现向后兼容性。
discover_interval
编辑- 值类型为 数字
- 默认值为
15
我们多久扩展一次 path
选项中的文件名模式,以发现要监视的新文件。此值是 stat_interval
的倍数,例如,如果 stat_interval
为 “500 毫秒”,则每 15 X 500 毫秒(7.5 秒)可以发现新文件。实际上,这将是最佳情况,因为需要考虑读取新内容所花费的时间。
ecs_compatibility
编辑- 值类型为 字符串
-
支持的值为
-
disabled
:在事件上设置非 ECS 元数据(例如顶层host
、path
) -
v1
、v8
:在事件上设置与 ECS 兼容的元数据(例如[host][name]
、[log][file][path]
)
-
-
默认值取决于正在运行的 Logstash 版本
- 当 Logstash 提供
pipeline.ecs_compatibility
设置时,其值用作默认值 - 否则,默认值为
disabled
。
- 当 Logstash 提供
控制此插件与 Elastic Common Schema (ECS) 的兼容性。
exclude
编辑- 值类型为 数组
- 此设置没有默认值。
排除项(与文件名匹配,而不是完整路径)。此处也允许使用文件名模式。例如,如果您有
path => "/var/log/*"
在 Tail 模式下,您可能需要排除 gzip 压缩的文件
exclude => "*.gz"
exit_after_read
编辑- 值类型为 布尔值
- 默认值为
false
此选项可以在 read
模式下使用,以强制在读取文件后关闭所有监视器。可以在文件内容是静态的并且在执行期间不会更改的情况下使用。当设置为 true
时,它还会禁用文件的活动发现 - 只会读取进程启动时目录中的文件。它支持 sincedb
条目。当文件被处理一次后被修改,则下次运行只会读取新添加的条目。
file_chunk_count
编辑- 值类型为 数字
- 默认值为
4611686018427387903
与 file_chunk_size
结合使用时,此选项设置在移动到下一个活动文件之前,从每个文件中读取多少个块(带或条纹)。例如,file_chunk_count
为 32 且 file_chunk_size
为 32KB 将处理每个活动文件中的下一个 1MB。由于默认值非常大,因此在移动到下一个活动文件之前,实际上会将文件读取到 EOF。
file_chunk_size
编辑- 值类型为 数字
- 默认值为
32768
(32KB)
文件内容以块或块的形式从磁盘读取,并从块中提取行。请参阅 file_chunk_count
,了解为什么以及何时更改此设置的默认值。
file_completed_action
编辑- 值可以是以下任何一个:
delete
、log
、log_and_delete
- 默认值为
delete
。
在 read
模式下,完成文件时应执行什么操作。如果指定 *delete*,则将删除该文件。如果指定 *log*,则会将文件的完整路径记录到 file_completed_log_path
设置中指定的文件。如果指定 log_and_delete
,则会执行以上两个操作。
file_completed_log_path
编辑- 值类型为 字符串
- 此设置没有默认值。
应将完全读取的文件路径附加到哪个文件。仅当 file_completed_action
为 *log* 或 *log_and_delete* 时,才将此路径指定给文件。重要提示:此文件仅追加 - 它可能会变得非常大。您负责文件轮换。
file_sort_by
编辑- 值可以是以下任何一个:
last_modified
、path
- 默认值为
last_modified
。
应使用“已监视”文件的哪个属性对其进行排序。文件可以按修改日期或完整路径字母顺序排序。以前,发现的以及因此“监视”的文件的处理顺序取决于操作系统。
file_sort_direction
编辑- 值可以是以下任何一个:
asc
、desc
- 默认值为
asc
。
在对“监视”文件进行排序时,选择升序或降序。如果首先考虑最早的数据,则 last_modified
+ asc
的默认值很好。如果首先考虑最新数据更重要,则选择 last_modified
+ desc
。如果您对文件完整路径使用特殊命名约定,则 path
+ asc
可能会帮助控制文件处理的顺序。
ignore_older
编辑当文件输入发现上次修改时间在指定持续时间(如果指定为数字,则为秒)之前的文件时,该文件将被忽略。在发现之后,如果忽略的文件被修改,则不再忽略该文件,并且会读取任何新数据。默认情况下,此选项处于禁用状态。请注意,此单位以秒为单位。
max_open_files
编辑- 值类型为 数字
- 此设置没有默认值。
此输入在任何时候消耗的最大文件句柄数是多少。如果需要处理的文件数量超过此数量,请使用 close_older 关闭某些文件。此值不应设置为操作系统可以执行的最大值,因为其他 LS 插件和操作系统进程也需要文件句柄。内部设置的默认值为 4095。
mode
编辑- 值可以是
tail
或read
。 - 默认值为
tail
。
您希望文件输入以哪种模式运行。跟踪几个文件或读取多个内容完整的文件。读取模式现在支持 gzip 文件处理。
如果指定 read
,则可以使用以下设置
-
ignore_older
(不会处理较旧的文件) -
file_completed_action
(处理完文件后应采取的操作) -
file_completed_log_path
(应将完成的文件路径记录到哪个文件)
如果指定 read
,则将忽略以下设置
-
start_position
(文件始终从头开始读取) -
close_older
(当到达 EOF 时,文件会自动关闭)
path
编辑- 这是一个必需的设置。
- 值类型为 数组
- 此设置没有默认值。
用作输入的文件的路径。您可以在这里使用文件名模式,例如 /var/log/*.log
。如果您使用类似 /var/log/**/*.log
的模式,则会对 /var/log
进行递归搜索,查找所有 *.log
文件。路径必须是绝对路径,不能是相对路径。
您还可以配置多个路径。请参阅Logstash 配置页面上的示例。
sincedb_clean_after
编辑sincedb 记录现在具有与其关联的上次活动时间戳。如果在最近 N 天内未在跟踪的文件中检测到任何更改,则其 sincedb 跟踪记录将过期,并且不会被持久化。此选项有助于防止 inode 回收问题。Filebeat 有一个关于 inode 回收的常见问题解答。
sincedb_path
编辑- 值类型为 字符串
- 此设置没有默认值。
sincedb 数据库文件的路径(跟踪受监视日志文件的当前位置),该文件将写入磁盘。默认情况下,会将 sincedb 文件写入 <path.data>/plugins/inputs/file
注意:它必须是文件路径,而不是目录路径
start_position
编辑- 值可以是以下任意一种:
beginning
,end
- 默认值为
"end"
选择 Logstash 最初开始读取文件的位置:开头或结尾。默认行为将文件视为实时流,因此从结尾开始。如果您有要导入的旧数据,请将其设置为 _beginning_。
此选项仅修改“首次接触”情况,即文件是新的且以前未见过,也就是说,在 Logstash 读取的 sincedb 文件中没有记录当前位置的文件。如果某个文件之前已经见过,则此选项无效,将使用 sincedb 文件中记录的位置。
通用选项
编辑所有输入插件都支持这些配置选项
codec
编辑- 值类型是 codec
- 默认值为
"plain"
用于输入数据的编解码器。输入编解码器是一种方便的方法,可以在数据进入输入之前对其进行解码,而无需在 Logstash 管道中使用单独的过滤器。
字符串持续时间
编辑格式为 number
string
,并且它们之间的空格是可选的。因此,“45s”和“45 s”都是有效的。
使用最合适的持续时间,例如“3 days”而不是“72 hours”。
周
编辑支持的值:w
week
weeks
,例如“2 w”、“1 week”、“4 weeks”。
天
编辑支持的值:d
day
days
,例如“2 d”、“1 day”、“2.5 days”。
小时
编辑支持的值:h
hour
hours
,例如“4 h”、“1 hour”、“0.5 hours”。
分钟
编辑支持的值:m
min
minute
minutes
,例如“45 m”、“35 min”、“1 minute”、“6 minutes”。
秒
编辑支持的值:s
sec
second
seconds
,例如“45 s”、“15 sec”、“1 second”、“2.5 seconds”。