日志记录

编辑

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 文件包含三个 appender 用于写入日志文件:一个用于纯文本,一个使用 json 格式,另一个在您设置 pipeline.separate_logs 值时用于按管道拆分日志行。

这些 appender 定义了

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

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

  • 时间”策略每天创建一个文件。
  • 大小”策略在文件大小超过 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 

轮转较旧日志文件的 appender 类型。

当前日志文件的名称。

轮转文件的名称格式定义,在本例中为日期后跟一个增量数字,最多 30 个(默认为 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 文件中指定的 value。

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 毫秒的事件。

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