日志

编辑

Logstash 在其运行时会发出内部日志,这些日志位于 LS_HOME/logs(对于 DEB/RPM,则位于 /var/log/logstash)。默认的日志级别是 INFO。Logstash 的日志框架基于 Log4j 2 框架,其大部分功能直接暴露给用户。

您可以为特定的子系统、模块或插件配置日志。

当您需要调试问题时,特别是插件问题时,请考虑将日志级别提高到 DEBUG 以获取更详细的消息。例如,如果您正在调试 Elasticsearch 输出的问题,您可以仅为该组件提高日志级别。这种方法可以减少过度日志记录造成的干扰,并帮助您专注于问题区域。

您可以使用 log4j2.properties 文件或 Logstash API 配置日志。

  • log4j2.properties 文件。 通过 log4j2.properties 文件所做的更改需要您重新启动 Logstash 才能生效。更改在随后的重新启动中保持不变
  • 日志 API。 通过日志 API 所做的更改会立即生效,无需重新启动。更改在 Logstash 重新启动后不会保持不变

Log4j2 配置

编辑

Logstash 附带一个包含开箱即用设置的 log4j2.properties 文件,包括记录到控制台。您可以修改此文件以更改轮转策略、类型和其他 log4j2 配置

您必须重新启动 Logstash 才能应用您对此文件所做的任何更改。对 log4j2.properties 的更改在 Logstash 重新启动后会保持不变。

以下是一个使用 outputs.elasticsearch 的示例

logger.elasticsearchoutput.name = logstash.outputs.elasticsearch
logger.elasticsearchoutput.level = debug

前面的示例定义了记录器 logstash.outputs.elasticsearch 的名称和级别。记录器通常由 Java 类名标识,例如 org.logstash.dissect.Dissector。它也可以是部分包路径,例如 org.logstash.dissect。对于 Ruby 类,如 LogStash::Outputs::Elasticsearch,记录器名称是通过将完整的类名小写并将双冒号替换为单点获得的。

请考虑使用 Logstash 附带的默认 log4j 配置,因为它配置为适用于大多数部署。下一节将介绍滚动策略的工作方式,以防您需要进行调整。

轮转设置

编辑

log4j2.properties 文件有三个用于写入日志文件的追加器:一个用于纯文本,一个用于 json 格式,一个用于在您设置 pipeline.separate_logs 值时按管道拆分日志行。

这些追加器定义了

  • 触发策略,它决定是否应执行轮转,以及
  • 轮转策略,它定义如何执行轮转。

默认情况下,定义了两个触发策略——时间和大小。

  • 时间策略每天创建一个文件。
  • 大小策略会在文件大小超过 100 MB 后强制创建新文件。

默认策略还基于最大文件数执行文件轮转。当达到 30 个文件的限制时,将删除第一个(最旧的)文件,以便为新文件创建空间。后续文件将相应地重新编号。

每个文件都有一个日期,并且在轮转期间将删除超过 7 天(默认)的文件。

appender.rolling.type = RollingFile 
appender.rolling.name = plain_rolling
appender.rolling.fileName = ${sys:ls.logs}/logstash-plain.log 
appender.rolling.filePattern = ${sys:ls.logs}/logstash-plain-%d{yyyy-MM-dd}-%i.log.gz 
appender.rolling.policies.type = Policies
appender.rolling.policies.time.type = TimeBasedTriggeringPolicy 
appender.rolling.policies.time.interval = 1
appender.rolling.policies.time.modulate = true
appender.rolling.layout.type = PatternLayout
appender.rolling.layout.pattern = [%d{ISO8601}][%-5p][%-25c]%notEmpty{[%X{pipeline.id}]}%notEmpty{[%X{plugin.id}]} %m%n
appender.rolling.policies.size.type = SizeBasedTriggeringPolicy 
appender.rolling.policies.size.size = 100MB
appender.rolling.strategy.type = DefaultRolloverStrategy
appender.rolling.strategy.max = 30 
appender.rolling.strategy.action.type = Delete 
appender.rolling.strategy.action.basepath = ${sys:ls.logs}
appender.rolling.strategy.action.condition.type = IfFileName
appender.rolling.strategy.action.condition.glob = logstash-plain-* 
appender.rolling.strategy.action.condition.nested_condition.type = IfLastModified
appender.rolling.strategy.action.condition.nested_condition.age = 7D 

追加器类型,它会滚动旧的日志文件。

当前日志文件的名称。

滚动文件的名称格式定义,在本例中,日期后跟一个递增的数字,最多 30 个(默认)。

时间策略,以在一天结束时触发轮转。

大小策略,一旦纯文本文件达到 100 MB 的大小,就会触发轮转。

轮转策略定义最多 30 个文件。

轮转期间要执行的操作。

操作要考虑的文件集。

执行轮转操作的条件:超过 7 天。

轮转操作还可以强制执行磁盘使用限制,删除旧文件以匹配请求的条件,例如

appender.rolling.type = RollingFile
...
appender.rolling.strategy.action.condition.glob = pipeline_${ctx:pipeline.id}.*.log.gz
appender.rolling.strategy.action.condition.nested_condition.type = IfAccumulatedFileSize
appender.rolling.strategy.action.condition.nested_condition.exceeds = 5MB 

如果压缩文件的总累积大小超过 5MB,则删除文件。

日志 API

编辑

对于临时的日志更改,修改 log4j2.properties 文件并重新启动 Logstash 会导致不必要的停机时间。相反,您可以通过日志 API 动态更新日志级别。这些设置会立即生效,不需要重新启动。

默认情况下,日志 API 尝试绑定到 tcp:9600。如果此端口已被另一个 Logstash 实例使用,则需要使用指定的 --api.http.port 标志启动 Logstash 以绑定到不同的端口。有关更多信息,请参阅 命令行标志

检索日志配置列表

编辑

要检索运行时可用的日志子系统列表,您可以向 _node/logging 发送 GET 请求

curl -XGET 'localhost:9600/_node/logging?pretty'

示例响应

{
...
  "loggers" : {
    "logstash.agent" : "INFO",
    "logstash.api.service" : "INFO",
    "logstash.basepipeline" : "INFO",
    "logstash.codecs.plain" : "INFO",
    "logstash.codecs.rubydebug" : "INFO",
    "logstash.filters.grok" : "INFO",
    "logstash.inputs.beats" : "INFO",
    "logstash.instrument.periodicpoller.jvm" : "INFO",
    "logstash.instrument.periodicpoller.os" : "INFO",
    "logstash.instrument.periodicpoller.persistentqueue" : "INFO",
    "logstash.outputs.stdout" : "INFO",
    "logstash.pipeline" : "INFO",
    "logstash.plugins.registry" : "INFO",
    "logstash.runner" : "INFO",
    "logstash.shutdownwatcher" : "INFO",
    "org.logstash.Event" : "INFO",
    "slowlog.logstash.codecs.plain" : "TRACE",
    "slowlog.logstash.codecs.rubydebug" : "TRACE",
    "slowlog.logstash.filters.grok" : "TRACE",
    "slowlog.logstash.inputs.beats" : "TRACE",
    "slowlog.logstash.outputs.stdout" : "TRACE"
  }
}

更新日志级别

编辑

在子系统、模块或插件的名称前添加 logger.

这是一个使用 outputs.elasticsearch 的示例

curl -XPUT 'localhost:9600/_node/logging?pretty' -H 'Content-Type: application/json' -d'
{
    "logger.logstash.outputs.elasticsearch" : "DEBUG"
}
'

在此设置生效期间,Logstash 会为您的配置中指定的所有 Elasticsearch 输出发出 DEBUG 级别的日志。请注意,此新设置是临时的,不会在重新启动后保留。

如果您希望日志更改在重新启动后仍然存在,请将其添加到 log4j2.properties 中。

重置动态日志级别

编辑

要重置可能通过日志 API 动态更改的任何日志级别,请向 _node/logging/reset 发送 PUT 请求。所有日志级别将恢复为 log4j2.properties 文件中指定的值。

curl -XPUT 'localhost:9600/_node/logging/reset?pretty'

日志文件位置

编辑

您可以使用 --path.logs 设置指定日志文件位置。

慢日志

编辑

Logstash 的慢日志添加了在特定事件通过管道花费异常长时间时进行记录的功能。就像正常的应用程序日志一样,您可以在 --path.logs 目录中找到慢日志。慢日志在 logstash.yml 设置文件中配置,选项如下

slowlog.threshold.warn (default: -1)
slowlog.threshold.info (default: -1)
slowlog.threshold.debug (default: -1)
slowlog.threshold.trace (default: -1)

默认情况下,禁用慢日志。默认的阈值设置为 -1nanos,表示无限阈值。不会调用慢日志。

启用慢日志

编辑

slowlog.threshold 字段使用时间值格式,该格式允许广泛的触发间隔。您可以使用以下时间单位指定范围:nanos(纳秒)、micros(微秒)、ms(毫秒)、s(秒)、m(分钟)、h(小时)、d(天)。

当您提高日志级别时,慢日志会变得更加敏感,并记录更多事件。

示例

slowlog.threshold.warn: 2s
slowlog.threshold.info: 1s
slowlog.threshold.debug: 500ms
slowlog.threshold.trace: 100ms

在此示例中

  • 如果日志级别设置为 warn,则日志会显示处理时间超过 2 秒的事件。
  • 如果日志级别设置为 info,则日志会显示处理时间超过 1 秒的事件。
  • 如果日志级别设置为 debug,则日志会显示处理时间超过 500 毫秒的事件。
  • 如果日志级别设置为 trace,则日志会显示处理时间超过 100 毫秒的事件。

日志包括导致缓慢的完整事件和过滤器配置。