文件输入插件

编辑
  • 插件版本:v4.4.6
  • 发布日期:2023-12-13
  • 变更日志

对于其他版本,请参阅 版本化插件文档

获取帮助

编辑

有关插件的问题,请在 Discuss 论坛中发起主题。对于错误或功能请求,请在 Github 中提交问题。有关 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 兼容 的方式使用 ecs_compatibility 进行操作。此元数据在事件被相应的编解码器解码后添加,并且永远不会覆盖现有值。

ECS 已禁用 ECS v1v8 描述

主机

[host][name]

处理事件的 Logstash 主机的名称

路径

[log][file][path]

事件来源日志文件的完整路径

跟踪监视文件中当前的位置

编辑

插件通过在名为 sincedb 的单独文件中记录当前位置来跟踪每个文件中的当前位置。这使得可以停止和重新启动 Logstash,并使其从上次停止的地方继续,而不会错过在 Logstash 停止期间添加到文件中的行。

默认情况下,sincedb 文件放置在 Logstash 的数据目录中,文件名基于正在监视的文件名模式(即 path 选项)。因此,更改文件名模式将导致使用新的 sincedb 文件,并且任何现有的当前位置状态都将丢失。如果您经常更改模式,则可能需要使用 sincedb_path 选项显式选择 sincedb 路径。

每个输入必须使用不同的 sincedb_path。使用相同的路径会导致问题。每个输入的读取检查点必须存储在不同的路径中,以便信息不会被覆盖。

文件通过标识符进行跟踪。此标识符由 inode、主设备号和次设备号组成。在 Windows 中,不同的标识符取自 kernel32 API 调用。

现在可以使 Sincedb 记录过期,这意味着在特定时间段后将不再记住较旧文件的读取位置。文件系统可能需要为新内容重新使用 inode。理想情况下,我们不会使用旧内容的读取位置,但我们没有可靠的方法来检测是否发生了 inode 重用。这与读取模式更相关,在读取模式下,sincedb 中会跟踪大量文件。但请记住,如果记录已过期,则会再次读取以前看到的文件。

Sincedb 文件是具有四 ( < 5.0.0)、五或六列的文本文件

  1. inode 编号(或等效编号)。
  2. 文件系统的设备主编号(或等效编号)。
  3. 文件系统的设备次编号(或等效编号)。
  4. 文件内的当前字节偏移量。
  5. 上次活动时间戳(浮点数)
  6. 此记录最后匹配到的已知路径(对于转换为新格式的旧 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”,此字符串将转换为十进制秒。支持相当多的自然持续时间和缩写持续时间,有关详细信息,请参阅 字符串持续时间

另请参阅 通用选项,以获取所有输入插件支持的选项列表。

 

check_archive_validity

编辑

设置为 true 时,此设置会在处理压缩文件之前验证其有效性。文件将经过两次传递——​一次传递用于验证文件是否有效,另一次传递用于处理文件。

验证压缩文件需要更多处理时间,但可以防止损坏的归档文件导致循环。

close_older

编辑

文件输入会关闭上次读取指定持续时间(如果指定了数字,则以秒为单位)之前的任何文件。这根据文件是正在跟踪还是正在读取而具有不同的含义。如果正在跟踪,并且传入数据存在较大的时间间隔,则可以关闭文件(允许打开其他文件),但将在检测到新数据时排队重新打开。如果正在读取,则在上次读取字节后 closed_older 秒后,文件将被关闭。如果您将插件升级到 4.1.0+,并且正在读取而不是跟踪且不切换到使用读取模式,则此设置将保留以确保向后兼容性。

delimiter

编辑

设置新行分隔符,默认为 "\n"。请注意,读取压缩文件时不会使用此设置,而是使用标准的 Windows 或 Unix 行结束符。

discover_interval

编辑
  • 值类型为 数字
  • 默认值为 15

我们在 path 选项中扩展文件名模式以发现要监视的新文件的频率。此值是 stat_interval 的倍数,例如,如果 stat_interval 是“500 毫秒”,则每 15 X 500 毫秒(7.5 秒)可能会发现新的文件。实际上,这将是最佳情况,因为需要考虑读取新内容所需的时间。

ecs_compatibility

编辑
  • 值类型为 字符串
  • 支持的值为

    • disabled:在事件上设置非 ECS 元数据(例如顶级 hostpath
    • v1v8:在事件上设置兼容 ECS 的元数据(例如 [host][name][log][file][path]
  • 默认值取决于正在运行的 Logstash 版本

    • 当 Logstash 提供 pipeline.ecs_compatibility 设置时,其值将用作默认值
    • 否则,默认值为 disabled

控制此插件与 Elastic Common Schema (ECS) 的兼容性。

exclude

编辑
  • 值类型为 数组
  • 此设置没有默认值。

排除项(与文件名匹配,而不是完整路径)。文件名模式在此处也有效。例如,如果您有

    path => "/var/log/*"

在跟踪模式下,您可能希望排除 gzip 文件

    exclude => "*.gz"

exit_after_read

编辑

此选项可用于 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

编辑
  • 值可以是以下任何一个:deleteloglog_and_delete
  • 默认为 delete

read 模式下,当文件处理完毕时应执行什么操作。如果指定了 delete,则将删除该文件。如果指定了 log,则文件的完整路径将记录到 file_completed_log_path 设置中指定的文件中。如果指定了 log_and_delete,则上述两个操作都将发生。

file_completed_log_path

编辑
  • 值类型为 字符串
  • 此设置没有默认值。

应将完全读取的文件路径附加到哪个文件。仅当 file_completed_actionloglog_and_delete 时才指定此文件路径。重要提示:此文件仅附加 - 它可能会变得非常大。您负责文件轮换。

file_sort_by

编辑
  • 值可以是以下任何一个:last_modifiedpath
  • 默认为 last_modified

应使用“监视”文件的哪个属性按其排序。文件可以按修改日期或完整路径字母顺序排序。以前,发现的因此“监视”的文件的处理顺序依赖于操作系统。

file_sort_direction

编辑
  • 值可以是以下任何一个:ascdesc
  • 默认为 asc

在排序“监视”文件时选择升序和降序。如果最旧的数据优先,则 last_modified + asc 的默认值很好。如果最新数据优先,则选择 last_modified + desc。如果您对文件完整路径使用特殊命名约定,则 path + asc 可能有助于控制文件处理顺序。

ignore_older

编辑

当文件输入发现一个最后修改时间早于指定持续时间(如果指定了数字,则以秒为单位)的文件时,将忽略该文件。在其发现之后,如果忽略的文件被修改,则不再忽略它,并且会读取任何新数据。默认情况下,此选项被禁用。请注意,此单位以秒为单位。

max_open_files

编辑
  • 值类型为 数字
  • 此设置没有默认值。

此输入在任何时间消耗的文件句柄的最大数量是多少。如果您需要处理的文件数量超过此数字,请使用 close_older 关闭一些文件。这不应该设置为操作系统可以执行的最大值,因为其他 LS 插件和操作系统进程需要文件句柄。内部设置了 4095 的默认值。

mode

编辑
  • 值可以是 tailread
  • 默认值为 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

编辑
  • 值类型为 数字字符串持续时间
  • 此设置的默认值为“2 周”。
  • 如果指定了数字,则将其解释为,并且可以是小数,例如 0.5 为 12 小时。

sincedb 记录现在与其关联了一个上次活动时间戳。如果在过去 N 天中在跟踪文件中未检测到任何更改,则其 sincedb 跟踪记录将过期,并且不会持久化。此选项有助于防止 inode 回收问题。Filebeat 有一个关于 inode 回收的常见问题解答

sincedb_path

编辑
  • 值类型为 字符串
  • 此设置没有默认值。

sincedb 数据库文件的路径(跟踪监视日志文件的当前位置),该文件将写入磁盘。默认情况下,sincedb 文件将写入 <path.data>/plugins/inputs/file 注意:它必须是文件路径,而不是目录路径

sincedb_write_interval

编辑

写入包含监视日志文件当前位置的 since 数据库的频率(以秒为单位)。

start_position

编辑
  • 值可以是以下任何一个:beginningend
  • 默认值为 "end"

选择 Logstash 最初读取文件的位置:开头或结尾。默认行为将文件视为实时流,因此从结尾开始。如果您有要导入的旧数据,请将其设置为 beginning

此选项仅修改文件是新的且以前未见过时的“首次接触”情况,即 sincedb 文件(由 Logstash 读取)中未记录当前位置的文件。如果文件以前已被读取过,则此选项无效,并且将使用 sincedb 文件中记录的位置。

stat_interval

编辑

我们对文件进行 stat 以查看它们是否已被修改的频率(以秒为单位)。增加此间隔将减少我们进行的系统调用次数,但会增加检测新日志行的时间。

发现新文件并检查它们是否增长/缩小是在循环中发生的。此循环将在再次循环之前休眠 stat_interval 秒。但是,如果文件已增长,则会读取新内容并将行入队。跨所有增长文件读取和入队可能需要时间,尤其是在管道拥塞的情况下。因此,总循环时间是 stat_interval 和文件读取时间的组合。

常用选项

编辑

所有输入插件都支持这些配置选项

设置 输入类型 必需

add_field

hash

codec

codec

enable_metric

布尔值

id

字符串

tags

数组

type

字符串

add_field

编辑
  • 值类型为 hash
  • 默认值为 {}

向事件添加字段

codec

编辑
  • 值类型为 codec
  • 默认值为 "plain"

用于输入数据的编解码器。输入编解码器是在数据进入输入之前对其进行解码的便捷方法,无需在 Logstash 管道中使用单独的过滤器。

enable_metric

编辑
  • 值类型为 boolean
  • 默认值为 true

禁用或启用此特定插件实例的指标日志记录,默认情况下我们记录所有可能的指标,但您可以禁用特定插件的指标收集。

  • 值类型为 string
  • 此设置没有默认值。

向插件配置添加唯一的 ID。如果未指定 ID,Logstash 将生成一个。强烈建议在您的配置中设置此 ID。当您有两个或多个相同类型的插件时,这尤其有用,例如,如果您有两个文件输入。在这种情况下添加命名 ID 将有助于在使用监控 API 时监控 Logstash。

input {
  file {
    id => "my_plugin_id"
  }
}

id 字段中的变量替换仅支持环境变量,不支持使用密钥存储中的值。

tags

编辑
  • 值类型为 array
  • 此设置没有默认值。

向您的事件添加任意数量的标签。

这可以帮助以后进行处理。

type

编辑
  • 值类型为 string
  • 此设置没有默认值。

向此输入处理的所有事件添加 type 字段。

类型主要用于过滤器激活。

类型存储为事件本身的一部分,因此您也可以使用类型在 Kibana 中搜索它。

如果您尝试在已经拥有类型的事件上设置类型(例如,当您从发货器发送事件到索引器时),那么新的输入将不会覆盖现有类型。在发货器处设置的类型将与该事件一起存在,即使发送到另一个 Logstash 服务器也是如此。

字符串持续时间

编辑

格式为 number string,这两个之间有一个空格,并且空格是可选的。因此,“45s”和“45 s”都是有效的。

使用最合适的持续时间,例如,“3 天”而不是“72 小时”。

支持的值: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”。

毫秒

编辑

支持的值:ms msec msecs,例如“500 ms”、“750 msec”、“50 msecs”

milli millismilliseconds 不支持

微秒

编辑

支持的值:us usec usecs,例如“600 us”、“800 usec”、“900 usecs”

micro microsmicroseconds 不支持