文件输入插件

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

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

获取帮助

编辑

有关插件的问题,请在Discuss论坛中开启一个主题。对于错误或功能请求,请在Github中开启一个issue。有关 Elastic 支持的插件列表,请查阅Elastic 支持矩阵

描述

编辑

从文件中流式传输事件,通常以类似于tail -0F的方式跟踪文件,但可以选择从头开始读取它们。

通常,日志记录会在写入的每一行的末尾添加一个换行符。默认情况下,每个事件都被认为是一行,并且一行被认为是换行符之前的文本。 如果你想将多行日志连接到一个事件中,你需要使用多行编解码器。插件在发现新文件和处理每个已发现的文件之间循环。已发现的文件具有生命周期,它们从“已监视”或“已忽略”状态开始。生命周期中的其他状态是:“活动”、“已关闭”和“未监视”

默认情况下,使用 4095 个文件的窗口来限制正在使用的文件句柄的数量。处理阶段有多个阶段

  • 检查“已关闭”或“已忽略”的文件自上次以来大小是否发生变化,如果发生变化,则将其置于“已监视”状态。
  • 选择足够多的“已监视”文件以填充窗口中的可用空间,这些文件被设为“活动”。
  • 打开并读取活动文件,默认情况下,每个文件从上次已知位置读取到当前内容的末尾 (EOF)。

在某些情况下,能够控制首先读取哪些文件、排序以及是否完整读取或分带/条纹读取是很有用的。完整读取是所有文件 A,然后是文件 B,然后是文件 C,依此类推。分带或条纹读取是一些文件 A,然后是文件 B,然后是文件 C,依此类推,循环回到文件 A,直到读取完所有文件。通过更改file_chunk_countfile_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)、五列或六列

  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”,此字符串将转换为十进制秒。 有许多受支持的自然和缩写持续时间,有关详细信息,请参见string_duration

设置 输入类型 必需

check_archive_validity

布尔值

close_older

数字string_duration

分隔符

字符串

发现间隔

数字

ECS 兼容性

字符串

排除

数组

读取后退出

布尔值

文件块计数

数字

文件块大小

数字

文件完成操作

字符串,以下之一:["delete", "log", "log_and_delete"]

文件完成日志路径

字符串

文件排序依据

字符串,以下之一:["last_modified", "path"]

文件排序方向

字符串,以下之一:["asc", "desc"]

忽略较旧

数字string_duration

最大打开文件数

数字

模式

字符串,以下之一:["tail", "read"]

路径

数组

sincedb 清理间隔

数字string_duration

sincedb 路径

字符串

sincedb 写入间隔

数字string_duration

起始位置

字符串,以下之一:["beginning", "end"]

统计间隔

数字string_duration

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

 

check_archive_validity

编辑
  • 值类型为 布尔值
  • 默认值为 false

当设置为 true 时,此设置会在处理压缩文件之前验证其是否有效。文件会经过两次扫描——一次扫描以验证文件是否有效,另一次扫描以处理文件。

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

close_older

编辑

文件输入会关闭在指定持续时间(如果指定为数字,则为秒)之前最后读取的任何文件。这会根据文件是被跟踪还是被读取而产生不同的影响。如果跟踪文件,并且传入数据的时间间隔很大,则可以关闭文件(允许打开其他文件),但在检测到新数据时会排队等待重新打开。如果读取文件,则文件会在上次读取字节后经过 close_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/*"

在 Tail 模式下,您可能需要排除 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_action 为 *log* 或 *log_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 weeks”。
  • 如果指定一个数字,则将其解释为,并且可以是小数,例如 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_。

此选项仅修改“首次接触”情况,即文件是新的且以前未见过,也就是说,在 Logstash 读取的 sincedb 文件中没有记录当前位置的文件。如果某个文件之前已经见过,则此选项无效,将使用 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。当您有两个或多个相同类型的插件时,例如,如果您有 2 个文件输入,这尤其有用。在这种情况下添加命名 ID 将有助于在使用监控 API 时监控 Logstash。

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

id 字段中的变量替换仅支持环境变量,不支持使用来自 secret store 的值。

tags

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

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

这有助于稍后进行处理。

type

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

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

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

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

如果您尝试在已经具有类型的事件上设置类型(例如,当您将事件从托运人发送到索引器时),则新的输入不会覆盖现有类型。在托运人处设置的类型将在事件的整个生命周期中保留,即使将其发送到另一个 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”。

毫秒

编辑

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

milli millismilliseconds 不受支持

微秒

编辑

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

micro microsmicroseconds 不受支持