Logging

Elasticsearchのアプリケーションログを使用して、クラスターを監視し、問題を診断できます。Elasticsearchをサービスとして実行する場合、ログのデフォルトの場所はプラットフォームとインストール方法によって異なります:

Dockerでは、ログメッセージはコンソールに送信され、構成されたDockerロギングドライバーによって処理されます。ログにアクセスするには、docker logsを実行します。

Debianインストールでは、Elasticsearchはログを/var/log/elasticsearchに書き込みます。

RPMインストールでは、Elasticsearchはログを/var/log/elasticsearchに書き込みます。

macOS .tar.gzインストールでは、Elasticsearchはログを$ES_HOME/logsに書き込みます。

  1. [Linux `````.tar.gz`````](/read/elasticsearch-8-15/8b6655e704b5b083.md)インストールでは、Elasticsearchはログを`````$ES_HOME/logs`````に書き込みます。
  2. `````$ES_HOME`````内のファイルは、アップグレード中に削除されるリスクがあります。本番環境では、`````path.logs``````````$ES_HOME`````の外部の場所に設定することを強くお勧めします。[パス設定](ee39e0dfe4f583f3.md#path-settings)を参照してください。
  3. [Windows `````.zip`````](/read/elasticsearch-8-15/efdae4f75acce08d.md)インストールでは、Elasticsearchはログを`````%ES_HOME%\logs`````に書き込みます。
  4. `````%ES_HOME%`````内のファイルは、アップグレード中に削除されるリスクがあります。本番環境では、`````path.logs``````````%ES_HOME%` `````の外部の場所に設定することを強くお勧めします。[パス設定](ee39e0dfe4f583f3.md#path-settings)を参照してください。
  5. コマンドラインからElasticsearchを実行する場合、Elasticsearchは標準出力(`````stdout`````)にログを出力します。
  6. ## Logging configuration
  7. Elasticは、デフォルトで提供されるLog4j 2構成を使用することを強く推奨します。
  8. 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}`````はノード名(ノード名が明示的に設定されている場合)に解決されます。
  9. たとえば、ログディレクトリ(`````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`````に解決されます。
  10. #### Properties
  11. ``````properties
  12. ######## Server JSON ############################
  13. appender.rolling.type = RollingFile
  14. appender.rolling.name = rolling
  15. appender.rolling.fileName = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}_server.json
  16. appender.rolling.layout.type = ECSJsonLayout
  17. appender.rolling.layout.dataset = elasticsearch.server
  18. appender.rolling.filePattern = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}-%d{yyyy-MM-dd}-%i.json.gz
  19. appender.rolling.policies.type = Policies
  20. appender.rolling.policies.time.type = TimeBasedTriggeringPolicy
  21. appender.rolling.policies.time.interval = 1
  22. appender.rolling.policies.time.modulate = true
  23. appender.rolling.policies.size.type = SizeBasedTriggeringPolicy
  24. appender.rolling.policies.size.size = 256MB
  25. appender.rolling.strategy.type = DefaultRolloverStrategy
  26. appender.rolling.strategy.fileIndex = nomax
  27. appender.rolling.strategy.action.type = Delete
  28. appender.rolling.strategy.action.basepath = ${sys:es.logs.base_path}
  29. appender.rolling.strategy.action.condition.type = IfFileName
  30. appender.rolling.strategy.action.condition.glob = ${sys:es.logs.cluster_name}-*
  31. appender.rolling.strategy.action.condition.nested_condition.type = IfAccumulatedFileSize
  32. appender.rolling.strategy.action.condition.nested_condition.exceeds = 2GB
  33. ################################################
  34. `
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

  1. ######## Server - old style pattern ###########
  2. appender.rolling_old.type = RollingFile
  3. appender.rolling_old.name = rolling_old
  4. appender.rolling_old.fileName = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}_server.log
  5. appender.rolling_old.layout.type = PatternLayout
  6. appender.rolling_old.layout.pattern = [%d{ISO8601}][%-5p][%-25c{1.}] [%node_name]%marker %m%n
  7. 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構成を入力する場合は、先頭と末尾の空白をトリムしてください。

  1. 指定された期間ログファイルを保持したい場合は、削除アクションを伴うロールオーバーストラテジーを使用できます。
  2. #### Properties
  3. ``````properties
  4. appender.rolling.strategy.type = DefaultRolloverStrategy
  5. appender.rolling.strategy.action.type = Delete
  6. appender.rolling.strategy.action.basepath = ${sys:es.logs.base_path}
  7. appender.rolling.strategy.action.condition.type = IfFileName
  8. appender.rolling.strategy.action.condition.glob = ${sys:es.logs.cluster_name}-*
  9. appender.rolling.strategy.action.condition.nested_condition.type = IfLastModified
  10. appender.rolling.strategy.action.condition.nested_condition.age = 7D
  11. `
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はINFOWARNERRORFATALのレベルのすべてのメッセージをログに含めますが、DEBUGおよびTRACEのレベルのメッセージはフィルタリングされます。これは推奨される構成です。INFO以上のログレベルのメッセージをフィルタリングしないでください。そうしないと、クラスターの動作を理解したり、一般的な問題をトラブルシューティングしたりできなくなる可能性があります。DEBUGまたはTRACEのレベルでのログ記録を有効にしないでください。これらは、より詳細なログ記録を要求する他の指示に従っている場合、またはElasticsearchのソースコードを読み取ってログの意味を理解する専門家ユーザーでない限り、使用しないでください。

メッセージは、Elasticsearchソースコード内のJavaパッケージおよびクラスの階層に一致するロガーの階層によってログ記録されます。各ロガーには、そのログの冗長性を制御するために使用できる対応する動的設定があります。設定の名前は、logger.でプレフィックスされたパッケージまたはクラスの完全修飾名です。

各ロガーの冗長性をログレベルの名前に設定できます。たとえば、DEBUGは、このロガーからのメッセージが指定されたレベルまで含まれることを意味します。OFFの値を使用して、ロガーからのすべてのメッセージを抑制することもできます。

たとえば、org.elasticsearch.discoveryパッケージには、ディスカバリープロセスに関連する機能が含まれており、logger.org.elasticsearch.discovery設定でそのログの冗長性を制御できます。このパッケージのDEBUGログを有効にするには、クラスター更新設定APIを次のように使用します:

Python

  1. resp = client.cluster.put_settings(
  2. persistent={
  3. "logger.org.elasticsearch.discovery": "DEBUG"
  4. },
  5. )
  6. print(resp)

Ruby

  1. response = client.cluster.put_settings(
  2. body: {
  3. persistent: {
  4. 'logger.org.elasticsearch.discovery' => 'DEBUG'
  5. }
  6. }
  7. )
  8. puts response

Js

  1. const response = await client.cluster.putSettings({
  2. persistent: {
  3. "logger.org.elasticsearch.discovery": "DEBUG",
  4. },
  5. });
  6. console.log(response);

Console

  1. PUT /_cluster/settings
  2. {
  3. "persistent": {
  4. "logger.org.elasticsearch.discovery": "DEBUG"
  5. }
  6. }

このパッケージのログの冗長性をデフォルトレベルにリセットするには、ロガー設定をnullに設定します:

Python

  1. resp = client.cluster.put_settings(
  2. persistent={
  3. "logger.org.elasticsearch.discovery": None
  4. },
  5. )
  6. print(resp)

Ruby

  1. response = client.cluster.put_settings(
  2. body: {
  3. persistent: {
  4. 'logger.org.elasticsearch.discovery' => nil
  5. }
  6. }
  7. )
  8. puts response

Js

  1. const response = await client.cluster.putSettings({
  2. persistent: {
  3. "logger.org.elasticsearch.discovery": null,
  4. },
  5. });
  6. console.log(response);

Console

  1. PUT /_cluster/settings
  2. {
  3. "persistent": {
  4. "logger.org.elasticsearch.discovery": null
  5. }
  6. }

ログレベルを変更する他の方法には、

  • 1. elasticsearch.yml:

Yaml

  1. logger.org.elasticsearch.discovery: DEBUG

これは、単一ノードの問題をデバッグする際に最も適切です。

  • 2. log4j2.properties:

Properties

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

これは、他の理由でLog4j 2構成を変更する必要がある場合に最も適切です。たとえば、特定のロガーのログを別のファイルに送信したい場合があります。ただし、これらのユースケースはまれです。

Elasticsearchのアプリケーションログは、人間が読み取り解釈することを目的としています。Elasticsearchの異なるバージョンは、これらのログに情報を異なる方法で報告する場合があり、追加の詳細を追加したり、不要な情報を削除したり、同じ情報を異なる方法でフォーマットしたり、ロガーの名前を変更したり、特定のメッセージのログレベルを調整したりすることがあります。バージョン間でアプリケーションログの内容が正確に同じであることに依存しないでください。

ログに機密情報が漏洩するのを防ぐために、Elasticsearchはデフォルトで特定のログメッセージを抑制します。ノードでこの保護を無効にするには、Javaシステムプロパティes.insecure_network_trace_enabledtrueに設定します。この機能は、機密情報を含まないテストシステムを主に対象としています。このプロパティを機密情報を含むシステムに設定する場合は、ログを不正アクセスから保護する必要があります。

Deprecation logging

Elasticsearchは、非推奨のログもログディレクトリに書き込みます。これらのログは、非推奨のElasticsearch機能を使用したときにメッセージを記録します。非推奨のログを使用して、Elasticsearchを新しいメジャーバージョンにアップグレードする前にアプリケーションを更新できます。

デフォルトでは、Elasticsearchは1GBで非推奨のログをロールおよび圧縮します。デフォルトの構成では、最大5つのログファイルを保持します:4つのロールされたログと1つのアクティブなログ。

Elasticsearchは、CRITICALレベルで非推奨のログメッセージを発信します。これらのメッセージは、使用されている非推奨機能が次のメジャーバージョンで削除されることを示しています。WARNレベルの非推奨ログメッセージは、あまり重要でない機能が使用されたことを示しており、次のメジャーバージョンで削除されることはありませんが、将来的に削除される可能性があります。

非推奨のログメッセージの記録を停止するには、logger.deprecation.levelOFFに設定しますlog4j2.properties :

Properties

  1. logger.deprecation.level = OFF

また、ログレベルを動的に変更することもできます:

Python

  1. resp = client.cluster.put_settings(
  2. persistent={
  3. "logger.org.elasticsearch.deprecation": "OFF"
  4. },
  5. )
  6. print(resp)

Ruby

  1. response = client.cluster.put_settings(
  2. body: {
  3. persistent: {
  4. 'logger.org.elasticsearch.deprecation' => 'OFF'
  5. }
  6. }
  7. )
  8. puts response

Js

  1. const response = await client.cluster.putSettings({
  2. persistent: {
  3. "logger.org.elasticsearch.deprecation": "OFF",
  4. },
  5. });
  6. console.log(response);

Console

  1. PUT /_cluster/settings
  2. {
  3. "persistent": {
  4. "logger.org.elasticsearch.deprecation": "OFF"
  5. }
  6. }

ログレベルの構成を参照してください。

非推奨機能をトリガーしているものを特定できます。X-Opaque-IdがHTTPヘッダーとして使用された場合。ユーザーIDは、非推奨のJSONログのX-Opaque-IDフィールドに含まれています。

Js

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

非推奨のログは、.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

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

各行には、ECSJsonLayoutで構成された単一のJSONドキュメントが含まれています。このクラスのjavadocを参照して、詳細を確認してください。ただし、JSONドキュメントに例外が含まれている場合、複数行にわたって出力されます。最初の行には通常のプロパティが含まれ、次の行にはスタックトレースがJSON配列としてフォーマットされて含まれます。

独自のカスタムレイアウトを使用することもできます。そのためには、appender.rolling.layout.typeの行を別のレイアウトに置き換えます。以下のサンプルを参照してください:

Properties

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