日志

编辑

您可以使用 Elasticsearch 的应用程序日志来监控您的集群并诊断问题。如果您以服务方式运行 Elasticsearch,日志的默认位置会因您的平台和安装方法而异。

Docker 上,日志消息会输出到控制台并由配置的 Docker 日志驱动程序处理。要访问日志,请运行 docker logs

如果您从命令行运行 Elasticsearch,Elasticsearch 会将日志打印到标准输出 (stdout)。

日志配置

编辑

Elastic 强烈建议使用默认提供的 Log4j 2 配置。

Elasticsearch 使用 Log4j 2 进行日志记录。可以使用 log4j2.properties 文件配置 Log4j 2。Elasticsearch 公开了三个属性,${sys:es.logs.base_path}${sys:es.logs.cluster_name}${sys:es.logs.node_name},可以在配置文件中引用这些属性来确定日志文件的位置。属性 ${sys:es.logs.base_path} 将解析为日志目录,${sys:es.logs.cluster_name} 将解析为集群名称(在默认配置中用作日志文件名的前缀),${sys:es.logs.node_name} 将解析为节点名称(如果显式设置了节点名称)。

例如,如果您的日志目录 (path.logs) 是 /var/log/elasticsearch,并且您的集群名为 production,则 ${sys:es.logs.base_path} 将解析为 /var/log/elasticsearch${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}.log 将解析为 /var/log/elasticsearch/production.log

######## Server JSON ############################
appender.rolling.type = RollingFile 
appender.rolling.name = rolling
appender.rolling.fileName = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}_server.json 
appender.rolling.layout.type = ECSJsonLayout 
appender.rolling.layout.dataset = elasticsearch.server 
appender.rolling.filePattern = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}-%d{yyyy-MM-dd}-%i.json.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.policies.size.type = SizeBasedTriggeringPolicy 
appender.rolling.policies.size.size = 256MB 
appender.rolling.strategy.type = DefaultRolloverStrategy
appender.rolling.strategy.fileIndex = nomax
appender.rolling.strategy.action.type = Delete 
appender.rolling.strategy.action.basepath = ${sys:es.logs.base_path}
appender.rolling.strategy.action.condition.type = IfFileName 
appender.rolling.strategy.action.condition.glob = ${sys:es.logs.cluster_name}-* 
appender.rolling.strategy.action.condition.nested_condition.type = IfAccumulatedFileSize 
appender.rolling.strategy.action.condition.nested_condition.exceeds = 2GB 
################################################

配置 RollingFile appender

将日志记录到 /var/log/elasticsearch/production_server.json

使用 JSON 布局。

dataset 是一个标志,用于在 ECSJsonLayout 中填充 event.dataset 字段。它可以用于在解析日志时更容易地区分不同类型的日志。

将日志滚动到 /var/log/elasticsearch/production-yyyy-MM-dd-i.json;每次滚动时都会压缩日志,并且 i 将会递增

使用基于时间的滚动策略

每天滚动日志

在每天的边界处对齐滚动(而不是每二十四小时滚动)

使用基于大小的滚动策略

在 256 MB 后滚动日志

在滚动日志时使用删除操作

仅删除匹配文件模式的日志

模式是仅删除主日志

仅在我们累积了太多压缩日志时才删除

压缩日志的大小条件为 2 GB

######## Server -  old style pattern ###########
appender.rolling_old.type = RollingFile
appender.rolling_old.name = rolling_old
appender.rolling_old.fileName = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}_server.log 
appender.rolling_old.layout.type = PatternLayout
appender.rolling_old.layout.pattern = [%d{ISO8601}][%-5p][%-25c{1.}] [%node_name]%marker %m%n
appender.rolling_old.filePattern = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}-%d{yyyy-MM-dd}-%i.old_log.gz

用于 旧样式 模式附加器的配置。这些日志将保存在 *.log 文件中,如果存档,则将保存在 *.log.gz 文件中。请注意,这些应被视为已弃用,并且将来会被删除。

Log4j 的配置解析器会被任何多余的空格弄糊涂;如果您复制并粘贴此页面上的任何 Log4j 设置,或者通常输入任何 Log4j 配置,请务必删除任何前导和尾随空格。

请注意,您可以在 appender.rolling.filePattern 中将 .gz 替换为 .zip,以使用 zip 格式压缩滚动的日志。如果您删除 .gz 扩展名,则在滚动日志时不会压缩日志。

如果要将日志文件保留指定的时间段,可以使用带有删除操作的滚动策略。

appender.rolling.strategy.type = DefaultRolloverStrategy 
appender.rolling.strategy.action.type = Delete 
appender.rolling.strategy.action.basepath = ${sys:es.logs.base_path} 
appender.rolling.strategy.action.condition.type = IfFileName 
appender.rolling.strategy.action.condition.glob = ${sys:es.logs.cluster_name}-* 
appender.rolling.strategy.action.condition.nested_condition.type = IfLastModified 
appender.rolling.strategy.action.condition.nested_condition.age = 7D 

配置 DefaultRolloverStrategy

配置用于处理滚动的 Delete 操作

Elasticsearch 日志的基本路径

处理滚动时应用的条件

从与 glob ${sys:es.logs.cluster_name}-* 匹配的基本路径中删除文件;这是日志文件滚动到的 glob;这是为了仅删除滚动的 Elasticsearch 日志,而不是同时删除弃用和慢日志

要应用于与 glob 匹配的文件的嵌套条件

保留日志七天

只要多个配置文件被命名为 log4j2.properties 并且将 Elasticsearch 配置目录作为祖先,就可以加载(在这种情况下它们将被合并);这对于暴露额外记录器的插件很有用。记录器部分包含 Java 包及其相应的日志级别。附加器部分包含日志的目标。有关如何自定义日志记录以及所有受支持的附加器的详细信息,可以在 Log4j 文档 中找到。

配置日志级别

编辑

Log4J 2 日志消息包括一个级别字段,它是以下之一(按详细程度递增的顺序)

  • FATAL
  • ERROR
  • WARN
  • INFO
  • DEBUG
  • TRACE

默认情况下,Elasticsearch 在其日志中包含级别为 INFOWARNERRORFATAL 的所有消息,但会过滤掉级别为 DEBUGTRACE 的消息。这是推荐的配置。不要过滤掉 INFO 或更高级别的日志消息,否则您可能无法理解集群的行为或排除常见问题。除非您正在遵循本手册中其他地方要求更详细日志记录的说明,或者您是会阅读 Elasticsearch 源代码以确定日志含义的专家用户,否则不要在 DEBUGTRACE 级别启用日志记录。

消息由与 Elasticsearch 源代码 中 Java 包和类的层次结构相匹配的记录器层次结构记录。每个记录器都有一个相应的 动态设置,可用于控制其日志的详细程度。该设置的名称是包或类的完全限定名称,前缀为 logger.

您可以将每个记录器的详细程度设置为日志级别的名称,例如 DEBUG,这意味着来自此记录器且级别达到指定级别的消息将包含在日志中。您还可以使用值 OFF 来抑制来自记录器的所有消息。

例如,org.elasticsearch.discovery 包包含与 发现 过程相关的功能,您可以使用 logger.org.elasticsearch.discovery 设置控制其日志的详细程度。要为此包启用 DEBUG 日志记录,请使用 集群更新设置 API,如下所示

resp = client.cluster.put_settings(
    persistent={
        "logger.org.elasticsearch.discovery": "DEBUG"
    },
)
print(resp)
response = client.cluster.put_settings(
  body: {
    persistent: {
      'logger.org.elasticsearch.discovery' => 'DEBUG'
    }
  }
)
puts response
const response = await client.cluster.putSettings({
  persistent: {
    "logger.org.elasticsearch.discovery": "DEBUG",
  },
});
console.log(response);
PUT /_cluster/settings
{
  "persistent": {
    "logger.org.elasticsearch.discovery": "DEBUG"
  }
}

要将此包的日志详细程度重置为其默认级别,请将记录器设置设置为 null

resp = client.cluster.put_settings(
    persistent={
        "logger.org.elasticsearch.discovery": None
    },
)
print(resp)
response = client.cluster.put_settings(
  body: {
    persistent: {
      'logger.org.elasticsearch.discovery' => nil
    }
  }
)
puts response
const response = await client.cluster.putSettings({
  persistent: {
    "logger.org.elasticsearch.discovery": null,
  },
});
console.log(response);
PUT /_cluster/settings
{
  "persistent": {
    "logger.org.elasticsearch.discovery": null
  }
}

其他更改日志级别的方法包括

  1. elasticsearch.yml:

    logger.org.elasticsearch.discovery: DEBUG

    当在单个节点上调试问题时,这是最合适的。

  2. log4j2.properties:

    logger.discovery.name = org.elasticsearch.discovery
    logger.discovery.level = debug

    当您出于其他原因需要更改 Log4j 2 配置时,这是最合适的。例如,您可能希望将特定记录器的日志发送到另一个文件。但是,这些用例很少见。

Elasticsearch 的应用程序日志旨在供人类阅读和解释。不同版本的 Elasticsearch 可能会以不同的方式在这些日志中报告信息,可能会添加额外的细节,删除不必要的信息,以不同的方式格式化相同的信息,重命名记录器或调整特定消息的日志级别。不要依赖应用程序日志的内容在版本之间保持完全相同。

为了防止在日志中泄露敏感信息,Elasticsearch 默认会抑制某些日志消息,即使在最高的详细级别也是如此。要在节点上禁用此保护,请将 Java 系统属性 es.insecure_network_trace_enabled 设置为 true。此功能主要用于不包含任何敏感信息的测试系统。如果在包含敏感信息的系统上设置此属性,则必须保护您的日志免受未经授权的访问。

弃用日志记录

编辑

Elasticsearch 还会将弃用日志写入日志目录。当您使用已弃用的 Elasticsearch 功能时,这些日志会记录一条消息。您可以使用弃用日志在将 Elasticsearch 升级到新的主要版本之前更新您的应用程序。

默认情况下,Elasticsearch 会在 1GB 时滚动和压缩弃用日志。默认配置最多保留五个日志文件:四个滚动日志和一个活动日志。

Elasticsearch 以 CRITICAL 级别发出弃用日志消息。这些消息表明使用的弃用功能将在下一个主要版本中删除。WARN 级别的弃用日志消息表明使用了不太重要的功能,该功能不会在下一个主要版本中删除,但将来可能会删除。

要停止写入弃用日志消息,请在 log4j2.properties 中将 logger.deprecation.level 设置为 OFF

logger.deprecation.level = OFF

或者,您可以动态更改日志记录级别。

resp = client.cluster.put_settings(
    persistent={
        "logger.org.elasticsearch.deprecation": "OFF"
    },
)
print(resp)
response = client.cluster.put_settings(
  body: {
    persistent: {
      'logger.org.elasticsearch.deprecation' => 'OFF'
    }
  }
)
puts response
const response = await client.cluster.putSettings({
  persistent: {
    "logger.org.elasticsearch.deprecation": "OFF",
  },
});
console.log(response);
PUT /_cluster/settings
{
  "persistent": {
    "logger.org.elasticsearch.deprecation": "OFF"
  }
}

请参阅配置日志记录级别

如果使用了 X-Opaque-Id 作为 HTTP 标头,您可以识别触发弃用功能的原因。用户 ID 包含在弃用 JSON 日志的 X-Opaque-ID 字段中。

{
  "type": "deprecation",
  "timestamp": "2019-08-30T12:07:07,126+02:00",
  "level": "WARN",
  "component": "o.e.d.r.a.a.i.RestCreateIndexAction",
  "cluster.name": "distribution_run",
  "node.name": "node-0",
  "message": "[types removal] Using include_type_name in create index requests is deprecated. The parameter will be removed in the next major version.",
  "x-opaque-id": "MY_USER_ID",
  "cluster.uuid": "Aq-c-PAeQiK3tfBYtig9Bw",
  "node.id": "D7fUYfnfTLa2D7y-xw6tZg"
}

如果 cluster.deprecation_indexing.enabled 设置为 true,则可以将弃用日志索引到 .logs-deprecation.elasticsearch-default 数据流中。

弃用日志限制

编辑

弃用日志会基于弃用功能键和 x-opaque-id 进行去重,以便如果重复使用某个功能,它不会使弃用日志过载。这适用于已索引的弃用日志和发送到日志文件的日志。您可以通过将 cluster.deprecation_indexing.x_opaque_id_used.enabled 更改为 false 来禁用在限制中使用 x-opaque-id,有关更多详细信息,请参阅此 javadoc 类。

JSON 日志格式

编辑

为了更容易解析 Elasticsearch 日志,现在以 JSON 格式打印日志。这是由 Log4J 布局属性 appender.rolling.layout.type = ECSJsonLayout 配置的。此布局需要设置一个 dataset 属性,该属性用于在解析时区分日志流。

appender.rolling.layout.type = ECSJsonLayout
appender.rolling.layout.dataset = elasticsearch.server

每一行都包含一个 JSON 文档,其中包含 ECSJsonLayout 中配置的属性。有关更多详细信息,请参阅此 javadoc 类。但是,如果 JSON 文档包含异常,则会跨多行打印。第一行将包含常规属性,随后的行将包含格式化为 JSON 数组的堆栈跟踪。

您仍然可以使用自己的自定义布局。为此,请将行 appender.rolling.layout.type 替换为不同的布局。请参阅下面的示例

appender.rolling.type = RollingFile
appender.rolling.name = rolling
appender.rolling.fileName = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}_server.log
appender.rolling.layout.type = PatternLayout
appender.rolling.layout.pattern = [%d{ISO8601}][%-5p][%-25c{1.}] [%node_name]%marker %.-10000m%n
appender.rolling.filePattern = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}-%d{yyyy-MM-dd}-%i.log.gz