Logging
Elasticsearchのアプリケーションログを使用して、クラスターを監視し、問題を診断できます。Elasticsearchをサービスとして実行する場合、ログのデフォルトの場所はプラットフォームとインストール方法によって異なります:
Dockerでは、ログメッセージはコンソールに送信され、構成されたDockerロギングドライバーによって処理されます。ログにアクセスするには、docker logs
を実行します。
Debianインストールでは、Elasticsearchはログを/var/log/elasticsearch
に書き込みます。
RPMインストールでは、Elasticsearchはログを/var/log/elasticsearch
に書き込みます。
macOS .tar.gz
インストールでは、Elasticsearchはログを$ES_HOME/logs
に書き込みます。
[Linux `````.tar.gz`````](/read/elasticsearch-8-15/8b6655e704b5b083.md)インストールでは、Elasticsearchはログを`````$ES_HOME/logs`````に書き込みます。
`````$ES_HOME`````内のファイルは、アップグレード中に削除されるリスクがあります。本番環境では、`````path.logs`````を`````$ES_HOME`````の外部の場所に設定することを強くお勧めします。[パス設定](ee39e0dfe4f583f3.md#path-settings)を参照してください。
[Windows `````.zip`````](/read/elasticsearch-8-15/efdae4f75acce08d.md)インストールでは、Elasticsearchはログを`````%ES_HOME%\logs`````に書き込みます。
`````%ES_HOME%`````内のファイルは、アップグレード中に削除されるリスクがあります。本番環境では、`````path.logs`````を`````%ES_HOME%` `````の外部の場所に設定することを強くお勧めします。[パス設定](ee39e0dfe4f583f3.md#path-settings)を参照してください。
コマンドラインからElasticsearchを実行する場合、Elasticsearchは標準出力(`````stdout`````)にログを出力します。
## Logging configuration
Elasticは、デフォルトで提供されるLog4j 2構成を使用することを強く推奨します。
Elasticsearchは[Log4j 2](https://logging.apache.org/log4j/2.x/)を使用してログを記録します。Log4j 2はlog4j2.propertiesファイルを使用して構成できます。Elasticsearchは、ログファイルの場所を決定するために構成ファイルで参照できる`````${sys:es.logs.base_path}`````、`````${sys:es.logs.cluster_name}`````、`````${sys:es.logs.node_name}`````の3つのプロパティを公開しています。プロパティ`````${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`````に解決されます。
#### Properties
``````properties
######## 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 アペンダーを構成する |
|
/var/log/elasticsearch/production_server.json にログを記録する |
|
JSONレイアウトを使用する。 | |
dataset は、event.dataset フィールドをECSJsonLayout に埋め込むフラグです。それは、解析時に異なる種類のログをより簡単に区別するために使用できます。 |
|
/var/log/elasticsearch/production-yyyy-MM-dd-i.json にログをロールする; ログは圧縮され、 i がインクリメントされます |
|
時間ベースのロールポリシーを使用する | |
毎日ログをロールする | |
日境界でロールを整列させる(24時間ごとにロールするのではなく) | |
サイズベースのロールポリシーを使用する | |
256MB後にログをロールする | |
ログをロールする際に削除アクションを使用する | |
ファイルパターンに一致するログのみを削除する | |
パターンは、メインログのみを削除するためのものです | |
圧縮されたログが多すぎる場合にのみ削除する | |
圧縮されたログのサイズ条件は2GBです |
Properties
######## 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
old style パターンアペンダーの構成。これらのログは*.log ファイルに保存され、アーカイブされる場合は*<br>.log.gz ファイルに保存されます。これらは非推奨と見なされ、将来的に削除されることに注意してください。 |
Log4jの構成解析は、余分な空白によって混乱します。このページのLog4j設定をコピー&ペーストする場合、または一般的にLog4j構成を入力する場合は、先頭と末尾の空白をトリムしてください。
指定された期間ログファイルを保持したい場合は、削除アクションを伴うロールオーバーストラテジーを使用できます。
#### Properties
``````properties
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ログのベースパス | |
ロールオーバー処理時に適用する条件 | |
グロブ${sys:es.logs.cluster_name}-* に一致するベースパスからファイルを削除する; これは、ロールされたElasticsearchログのみを削除するために必要であり、非推奨および遅延ログも削除しないようにします |
|
グロブに一致するファイルに適用するネストされた条件 | |
7日間ログを保持する |
複数の構成ファイルを読み込むことができます(この場合、マージされます)が、log4j2.properties
と名付けられ、Elasticsearch構成ディレクトリを祖先として持つ必要があります。これは、追加のロガーを公開するプラグインに便利です。ロガーセクションには、Javaパッケージとそれに対応するログレベルが含まれています。アペンダーセクションには、ログの宛先が含まれています。ログのカスタマイズ方法やすべてのサポートされているアペンダーに関する詳細情報は、Log4jドキュメントで確認できます。
Configuring logging levels
Log4J 2のログメッセージにはレベルフィールドが含まれており、次のいずれかです(冗長性が増す順):
FATAL
ERROR
WARN
INFO
DEBUG
TRACE
デフォルトでは、ElasticsearchはINFO
、WARN
、ERROR
、FATAL
のレベルのすべてのメッセージをログに含めますが、DEBUG
およびTRACE
のレベルのメッセージはフィルタリングされます。これは推奨される構成です。INFO
以上のログレベルのメッセージをフィルタリングしないでください。そうしないと、クラスターの動作を理解したり、一般的な問題をトラブルシューティングしたりできなくなる可能性があります。DEBUG
またはTRACE
のレベルでのログ記録を有効にしないでください。これらは、より詳細なログ記録を要求する他の指示に従っている場合、またはElasticsearchのソースコードを読み取ってログの意味を理解する専門家ユーザーでない限り、使用しないでください。
メッセージは、Elasticsearchソースコード内のJavaパッケージおよびクラスの階層に一致するロガーの階層によってログ記録されます。各ロガーには、そのログの冗長性を制御するために使用できる対応する動的設定があります。設定の名前は、logger.
でプレフィックスされたパッケージまたはクラスの完全修飾名です。
各ロガーの冗長性をログレベルの名前に設定できます。たとえば、DEBUG
は、このロガーからのメッセージが指定されたレベルまで含まれることを意味します。OFF
の値を使用して、ロガーからのすべてのメッセージを抑制することもできます。
たとえば、org.elasticsearch.discovery
パッケージには、ディスカバリープロセスに関連する機能が含まれており、logger.org.elasticsearch.discovery
設定でそのログの冗長性を制御できます。このパッケージのDEBUG
ログを有効にするには、クラスター更新設定APIを次のように使用します:
Python
resp = client.cluster.put_settings(
persistent={
"logger.org.elasticsearch.discovery": "DEBUG"
},
)
print(resp)
Ruby
response = client.cluster.put_settings(
body: {
persistent: {
'logger.org.elasticsearch.discovery' => 'DEBUG'
}
}
)
puts response
Js
const response = await client.cluster.putSettings({
persistent: {
"logger.org.elasticsearch.discovery": "DEBUG",
},
});
console.log(response);
Console
PUT /_cluster/settings
{
"persistent": {
"logger.org.elasticsearch.discovery": "DEBUG"
}
}
このパッケージのログの冗長性をデフォルトレベルにリセットするには、ロガー設定をnull
に設定します:
Python
resp = client.cluster.put_settings(
persistent={
"logger.org.elasticsearch.discovery": None
},
)
print(resp)
Ruby
response = client.cluster.put_settings(
body: {
persistent: {
'logger.org.elasticsearch.discovery' => nil
}
}
)
puts response
Js
const response = await client.cluster.putSettings({
persistent: {
"logger.org.elasticsearch.discovery": null,
},
});
console.log(response);
Console
PUT /_cluster/settings
{
"persistent": {
"logger.org.elasticsearch.discovery": null
}
}
ログレベルを変更する他の方法には、
- 1.
elasticsearch.yml
:
Yaml
logger.org.elasticsearch.discovery: DEBUG
これは、単一ノードの問題をデバッグする際に最も適切です。
- 2.
log4j2.properties
:
Properties
logger.discovery.name = org.elasticsearch.discovery
logger.discovery.level = debug
これは、他の理由でLog4j 2構成を変更する必要がある場合に最も適切です。たとえば、特定のロガーのログを別のファイルに送信したい場合があります。ただし、これらのユースケースはまれです。
Elasticsearchのアプリケーションログは、人間が読み取り解釈することを目的としています。Elasticsearchの異なるバージョンは、これらのログに情報を異なる方法で報告する場合があり、追加の詳細を追加したり、不要な情報を削除したり、同じ情報を異なる方法でフォーマットしたり、ロガーの名前を変更したり、特定のメッセージのログレベルを調整したりすることがあります。バージョン間でアプリケーションログの内容が正確に同じであることに依存しないでください。
ログに機密情報が漏洩するのを防ぐために、Elasticsearchはデフォルトで特定のログメッセージを抑制します。ノードでこの保護を無効にするには、Javaシステムプロパティes.insecure_network_trace_enabled
をtrue
に設定します。この機能は、機密情報を含まないテストシステムを主に対象としています。このプロパティを機密情報を含むシステムに設定する場合は、ログを不正アクセスから保護する必要があります。
Deprecation logging
Elasticsearchは、非推奨のログもログディレクトリに書き込みます。これらのログは、非推奨のElasticsearch機能を使用したときにメッセージを記録します。非推奨のログを使用して、Elasticsearchを新しいメジャーバージョンにアップグレードする前にアプリケーションを更新できます。
デフォルトでは、Elasticsearchは1GBで非推奨のログをロールおよび圧縮します。デフォルトの構成では、最大5つのログファイルを保持します:4つのロールされたログと1つのアクティブなログ。
Elasticsearchは、CRITICAL
レベルで非推奨のログメッセージを発信します。これらのメッセージは、使用されている非推奨機能が次のメジャーバージョンで削除されることを示しています。WARN
レベルの非推奨ログメッセージは、あまり重要でない機能が使用されたことを示しており、次のメジャーバージョンで削除されることはありませんが、将来的に削除される可能性があります。
非推奨のログメッセージの記録を停止するには、logger.deprecation.level
をOFF
に設定しますlog4j2.properties
:
Properties
logger.deprecation.level = OFF
また、ログレベルを動的に変更することもできます:
Python
resp = client.cluster.put_settings(
persistent={
"logger.org.elasticsearch.deprecation": "OFF"
},
)
print(resp)
Ruby
response = client.cluster.put_settings(
body: {
persistent: {
'logger.org.elasticsearch.deprecation' => 'OFF'
}
}
)
puts response
Js
const response = await client.cluster.putSettings({
persistent: {
"logger.org.elasticsearch.deprecation": "OFF",
},
});
console.log(response);
Console
PUT /_cluster/settings
{
"persistent": {
"logger.org.elasticsearch.deprecation": "OFF"
}
}
ログレベルの構成を参照してください。
非推奨機能をトリガーしているものを特定できます。X-Opaque-Id
がHTTPヘッダーとして使用された場合。ユーザーIDは、非推奨のJSONログのX-Opaque-ID
フィールドに含まれています。
Js
{
"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に設定されている場合。
Deprecation logs throttling
非推奨のログは、非推奨機能キーとx-opaque-idに基づいて重複排除されます。これにより、機能が繰り返し使用される場合、非推奨のログが過負荷になることはありません。これは、インデックスされた非推奨のログとログファイルに出力されたログの両方に適用されます。x-opaque-id
の使用をスロットリングで無効にするには、cluster.deprecation_indexing.x_opaque_id_used.enabled
をfalseに変更します。このクラスのjavadocを参照して、詳細を確認してください。
JSON log format
Elasticsearchログの解析を容易にするために、ログは現在JSON形式で出力されます。これは、Log4Jレイアウトプロパティappender.rolling.layout.type = ECSJsonLayout
によって構成されます。このレイアウトでは、解析時にログストリームを区別するために使用されるdataset
属性を設定する必要があります。
Properties
appender.rolling.layout.type = ECSJsonLayout
appender.rolling.layout.dataset = elasticsearch.server
各行には、ECSJsonLayout
で構成された単一のJSONドキュメントが含まれています。このクラスのjavadocを参照して、詳細を確認してください。ただし、JSONドキュメントに例外が含まれている場合、複数行にわたって出力されます。最初の行には通常のプロパティが含まれ、次の行にはスタックトレースがJSON配列としてフォーマットされて含まれます。
独自のカスタムレイアウトを使用することもできます。そのためには、appender.rolling.layout.type
の行を別のレイアウトに置き換えます。以下のサンプルを参照してください:
Properties
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