日志记录
编辑日志记录编辑
您可以使用 Elasticsearch 的应用程序日志来监控您的集群并诊断问题。如果您将 Elasticsearch 作为服务运行,日志的默认位置会根据您的平台和安装方法而有所不同。
在 Docker 上,日志消息会发送到控制台,并由配置的 Docker 日志驱动程序处理。要访问日志,请运行 docker logs
。
对于 Debian 安装,Elasticsearch 会将日志写入 /var/log/elasticsearch
。
对于 RPM 安装,Elasticsearch 会将日志写入 /var/log/elasticsearch
。
对于 macOS .tar.gz
安装,Elasticsearch 会将日志写入 $ES_HOME/logs
。
在升级期间,$ES_HOME
中的文件有被删除的风险。在生产环境中,我们强烈建议您将 path.logs
设置为 $ES_HOME
之外的某个位置。请参阅 路径设置。
对于 Linux .tar.gz
安装,Elasticsearch 会将日志写入 $ES_HOME/logs
。
在升级期间,$ES_HOME
中的文件有被删除的风险。在生产环境中,我们强烈建议您将 path.logs
设置为 $ES_HOME
之外的某个位置。请参阅 路径设置。
对于 Windows .zip
安装,Elasticsearch 会将日志写入 %ES_HOME%\logs
。
在升级期间,%ES_HOME%
中的文件有被删除的风险。在生产环境中,我们强烈建议您将 path.logs
设置为 %ES_HOME%`
之外的某个位置。请参阅 路径设置。
如果您从命令行运行 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 ################################################
配置 |
|
将日志记录到 |
|
使用 JSON 布局。 |
|
|
|
将日志滚动到 |
|
使用基于时间的滚动策略 |
|
每天滚动一次日志 |
|
将滚动与日期边界对齐(而不是每 24 小时滚动一次) |
|
使用基于大小的滚动策略 |
|
在达到 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
Log4j 的配置解析会因任何多余的空格而感到困惑;如果您复制并粘贴此页面上的任何 Log4j 设置,或者一般情况下输入任何 Log4j 配置,请确保修剪任何前导和尾随空格。
请注意,您可以将 .gz
替换为 .zip
,在 appender.rolling.filePattern
中使用 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
配置 |
|
配置用于处理滚动的 |
|
Elasticsearch 日志的基路径 |
|
处理滚动时要应用的条件 |
|
从基路径中删除与 glob |
|
要应用于与 glob 匹配的文件的嵌套条件 |
|
保留日志 7 天 |
可以加载多个配置文件(在这种情况下,它们将被合并),只要它们名为 log4j2.properties
并且具有 Elasticsearch 配置目录作为祖先;这对于公开其他记录器的插件很有用。记录器部分包含 Java 包及其相应的日志级别。附加器部分包含日志的目标位置。有关如何自定义日志记录以及所有受支持的附加器的详细信息,请参阅 Log4j 文档。
配置日志级别编辑
Elasticsearch 源代码 中的每个 Java 包都具有一个相关的记录器。例如,org.elasticsearch.discovery
包具有 logger.org.elasticsearch.discovery
,用于与 发现 过程相关的日志。
要获取更多或更少的详细日志,请使用 集群更新设置 API 更改相关记录器的日志级别。每个记录器都接受 Log4j 2 的内置日志级别,从最低到最高:OFF
、FATAL
、ERROR
、WARN
、INFO
、DEBUG
和 TRACE
。默认日志级别为 INFO
。以更高详细程度级别 (DEBUG
和 TRACE
) 记录的消息仅供专家使用。为了防止在日志中泄露敏感信息,Elasticsearch 将拒绝将某些记录器设置为更高的详细程度级别,除非启用了 不安全的网络跟踪日志记录。
resp = client.cluster.put_settings( body={"persistent": {"logger.org.elasticsearch.discovery": "DEBUG"}}, ) print(resp)
response = client.cluster.put_settings( body: { persistent: { 'logger.org.elasticsearch.discovery' => 'DEBUG' } } ) puts response
PUT /_cluster/settings { "persistent": { "logger.org.elasticsearch.discovery": "DEBUG" } }
要将记录器的详细程度重置为其默认级别,请将记录器设置设置为 null
resp = client.cluster.put_settings( body={"persistent": {"logger.org.elasticsearch.discovery": None}}, ) print(resp)
response = client.cluster.put_settings( body: { persistent: { 'logger.org.elasticsearch.discovery' => nil } } ) puts response
PUT /_cluster/settings { "persistent": { "logger.org.elasticsearch.discovery": null } }
更改日志级别的其他方法包括
-
elasticsearch.yml
:logger.org.elasticsearch.discovery: DEBUG
这最适合在单个节点上调试问题时使用。
-
log4j2.properties
:logger.discovery.name = org.elasticsearch.discovery logger.discovery.level = debug
当您需要出于其他原因更改 Log4j 2 配置时,这最适合使用。例如,您可能希望将特定记录器的日志发送到另一个文件。但是,这些用例很少见。
Elasticsearch 的应用程序日志旨在供人类阅读和解释。不同版本的 Elasticsearch 可能会以不同的方式报告这些日志中的信息,例如添加额外的详细信息、删除不必要的信息、以不同的方式格式化相同的信息、重命名记录器或调整特定消息的日志级别。不要依赖于不同版本之间应用程序日志的内容保持完全相同。
弃用日志记录编辑
Elasticsearch 还会将弃用日志写入日志目录。这些日志会在您使用已弃用的 Elasticsearch 功能时记录一条消息。您可以使用弃用日志在将 Elasticsearch 升级到新的主要版本之前更新您的应用程序。
默认情况下,Elasticsearch 会在 1 GB 时滚动和压缩弃用日志。默认配置最多保留 5 个日志文件:4 个已滚动的日志和 1 个活动日志。
Elasticsearch 以 CRITICAL
级别发出弃用日志消息。这些消息表明在下一个主要版本中将删除使用的弃用功能。以 WARN
级别发出的弃用日志消息表明使用了不太重要的功能,它不会在下一个主要版本中被删除,但可能会在将来被删除。
要停止写入弃用日志消息,请在 log4j2.properties
中将 logger.deprecation.level
设置为 OFF
logger.deprecation.level = OFF
或者,您可以动态更改日志级别
resp = client.cluster.put_settings( body={"persistent": {"logger.org.elasticsearch.deprecation": "OFF"}}, ) print(resp)
response = client.cluster.put_settings( body: { persistent: { 'logger.org.elasticsearch.deprecation' => 'OFF' } } ) puts 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" }
弃用日志可以被索引到 .logs-deprecation.elasticsearch-default
数据流中,如果 cluster.deprecation_indexing.enabled
设置为 true。
弃用日志节流编辑
弃用日志基于弃用功能键和 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