加载中

日志记录

Logstash 在运行期间会发出内部日志,这些日志保存在 LS_HOME/logs(对于 DEB/RPM 安装则在 /var/log/logstash)中。默认的日志级别是 INFO。Logstash 的日志框架基于 Log4j 2 框架,其大部分功能都直接向用户公开。

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

当你需要排查问题(尤其是插件相关的问题)时,可以考虑将日志级别提高到 DEBUG 以获取更详细的消息。例如,如果你在调试 Elasticsearch Output 的问题,则可以仅针对该组件提高日志级别。这种方法可以减少来自过多日志的干扰,并帮助你专注于问题区域。

你可以使用 log4j2.properties 文件或 Logstash API 来配置日志记录。

  • log4j2.properties 文件。 通过 log4j2.properties 文件所做的更改需要重启 Logstash 才能生效。更改会在后续重启中保持持久化
  • 日志 API。 通过日志 API 所做的更改会立即生效,无需重启。这些更改在 Logstash 重启后不会持久保留

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。对于像 LogStash::Outputs::Elasticsearch 这样的 Ruby 类,记录器名称是通过将完整类名转换为小写并将双冒号替换为单点来获取的。

注意

建议使用随 Logstash 附带的默认 log4j 配置,因为它针对大多数部署都进行了良好的配置。下一节介绍了滚动策略的工作原理,以防你需要进行调整。

log4j2.properties 文件具有三个用于写入日志文件的追加器(appender):一个用于纯文本,一个用于 JSON 格式,还有一个用于在你设置了 pipeline.separate_logs 值时按管道拆分日志行。

这些追加器定义了

  • 用于确定是否应该执行滚动的触发策略(triggering policies),以及
  • 用于定义如何执行滚动的滚动策略(rollover strategy)

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

  • 时间策略每天创建一个文件。
  • 当文件大小超过 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
		
  1. 用于滚动旧日志文件的追加器类型。
  2. 当前日志文件的名称。
  3. 滚动文件的名称格式定义,在此情况下为日期后跟一个递增数字,最多 30 个(默认)。
  4. 在一天结束时触发滚动的时间策略。
  5. 一旦纯文本文件达到 100 MB 大小就触发滚动的大小策略。
  6. 定义最多 30 个文件的滚动策略。
  7. 在滚动期间执行的操作。
  8. 操作所要考虑的文件集。
  9. 执行滚动操作的条件:早于 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
		
  1. 如果累计的压缩文件总大小超过 5MB,则删除文件。

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

注意

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

要检索在运行时可用的日志子系统列表,可以向 _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 毫秒的事件。

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

© . This website operates independently and is not affiliated with or endorsed by Elasticsearch B.V. All brand names, logos, and trademarks are the property of their respective owners.