Logging
=======

EDB Postgres for
Kubernetesは、セキュリティ上の理由からストレージに永続化せずに、PostgreSQLログを含む標準出力にJSON形式でログを直接出力します。このデザインにより、
`stern <https://github.com/stern/stern>`_ のようなコマンドラインのものを含む、ほとんどのKubernetes互換ログ管理ツールとのシームレスな統合が促進されます。

..  Important::
   ログの長期保存と管理はオペレーターの範囲外であり、Kubernetesインフラストラクチャレベルで処理する必要があります。詳細については、 :ref:`Kubernetes Logging Architecture <Logging>` を参照してください。

ドキュメント。

各ログエントリには、次のフィールドが含まれます。

- ``level`` – ログレベルたとえば ``info`` 、\ ``notice`` 。

- ``ts`` – タイムスタンプ。

- ``logger`` – ログのタイプ\ ``postgres`` 、\ ``pg_controldata`` など。

- ``msg`` –
  ログメッセージ、またはメッセージがJSON形式の場合はキーワード\ ``record``

- ``record`` – 実際のレコード。\ ``logger`` タイプに応じて異なる構造。

- ``logging_pod`` – ログが生成されたポッドの名前。

..  Note::
   ログ取り込みシステムでカスタムフィールド名が必要な場合、オペレーターコントローラの`log-field-level` および`log-field-timestamp` フラグを使用して、`level` および`ts` フィールドの名前を変更できます。これは、 `cloudnative-pg` オペレーターの`Deployment` 定義を編集することにより構成できます。

クラスターログ
--------------

``logLevel``
オプションを使用して、クラスター仕様でインスタンスポッドのログレベルを構成できます。使用可能なログレベルは\ ``error``
、\ ``warning`` 、\ ``info`` デフォルト、\ ``debug`` 、および\ ``trace``
です。

..  Important::
   現在、ログレベルはインスタンスの起動時にのみ設定できます。クラスターが起動した後のクラスター仕様のログレベルの変更は、新しいポッドにのみ適用され、既存のポッドには適用されません。

オペレーターログ
----------------

オペレーターポッドによって生成されるログは、インスタンスポッドと同じログレベルで構成できます。\ ``error``
、\ ``warning`` 、\ ``info`` デフォルト、\ ``debug`` 、および\ ``trace``
。

オペレーターのログレベルは、オペレーターの\ ``Deployment``
定義を編集し、\ ``--log-level``
コマンドライン引数を目的の値に設定することにより、構成できます。

PostgreSQLログ
--------------

各PostgreSQLログエントリは、 ``logger`` キーが\ ``postgres``
に設定されたJSONオブジェクトです。ログエントリの構造は次のとおりです。

.. code:: json

   {
     "level": "info",
     "ts": 1619781249.7188137,
     "logger": "postgres",
     "msg": "record",
     "record": {
       "log_time": "2021-04-30 11:14:09.718 UTC",
       "user_name": "",
       "database_name": "",
       "process_id": "25",
       "connection_from": "",
       "session_id": "608be681.19",
       "session_line_num": "1",
       "command_tag": "",
       "session_start_time": "2021-04-30 11:14:09 UTC",
       "virtual_transaction_id": "",
       "transaction_id": "0",
       "error_severity": "LOG",
       "sql_state_code": "00000",
       "message": "database system was interrupted; last known up at 2021-04-30 11:14:07 UTC",
       "detail": "",
       "hint": "",
       "internal_query": "",
       "internal_query_pos": "",
       "context": "",
       "query": "",
       "query_pos": "",
       "location": "",
       "application_name": "",
       "backend_type": "startup"
     },
     "logging_pod": "cluster-example-1"
   }

..  Note::
   内部的に、オペレーターはPostgreSQLのCSVログ形式を使用します。詳細については、 :ref:`PostgreSQL documentation on CSV log format <Logging>`  を参照してください。

PG監査ログ
----------

KubernetesのEDB Postgresは、
PostgreSQLクラスターで `PGAudit <https://www.pgaudit.org/>`_ のシームレスなネイティブサポートを提供します。

PGAuditを有効にするには、クラスター構成の\ ``postgresql``
セクションに必要な\ ``pgaudit`` パラメーターを追加します。

..  Important::
   PGAuditライブラリを`shared_preload_libraries` に追加する必要があります。 KubernetesのEDB Postgresは、PostgreSQL構成内の`pgaudit.*` パラメーターの存在に基づいて、これを自動的に管理します。オペレーターは、`shared_preload_libraries` からのライブラリの追加と削除の両方を処理します。

さらに、オペレーターは、クラスター内のすべてのデータベースでPGAudit拡張機能の作成と削除を管理します。

..  Important::
   Kubernetes用EDB Postgresは、接続を受け入れるクラスター内のすべてのデータベースで`CREATE EXTENSION` および`DROP EXTENSION` コマンドを実行します。

次の例は、PGAuditが有効および構成されたPostgreSQL ``Cluster``
展開を示しています。

.. code:: yaml

   apiVersion: postgresql.k8s.enterprisedb.io/v1
   kind: Cluster
   metadata:
     name: cluster-example
   spec:
     instances: 3

     postgresql:
       parameters:
         "pgaudit.log": "all, -misc"
         "pgaudit.log_catalog": "off"
         "pgaudit.log_parameter": "on"
         "pgaudit.log_relation": "on"

     storage:
       size: 1Gi

PGAuditによって生成された監査CSVログエントリは解析され、他のすべてのログと同様に、JSON形式で標準出力にルーティングされます。

- ``.logger`` は\ ``pgaudit`` に設定されます。

- ``.msg`` は\ ``record`` に設定されます。

- ``.record``
  には、解析されたレコード全体がJSONオブジェクトとして含まれています。この構造は、JSONオブジェクトとしてフォーマットされたPGAudit
  CSVメッセージを含む\ ``.record.audit`` を除き ``logging_collector``
  ログの構造に似ています。

この例は、サンプルログエントリを示しています。

.. code:: json

   {
     "level": "info",
     "ts": 1627394507.8814096,
     "logger": "pgaudit",
     "msg": "record",
     "record": {
       "log_time": "2021-07-27 14:01:47.881 UTC",
       "user_name": "postgres",
       "database_name": "postgres",
       "process_id": "203",
       "connection_from": "[local]",
       "session_id": "610011cb.cb",
       "session_line_num": "1",
       "command_tag": "SELECT",
       "session_start_time": "2021-07-27 14:01:47 UTC",
       "virtual_transaction_id": "3/336",
       "transaction_id": "0",
       "error_severity": "LOG",
       "sql_state_code": "00000",
       "backend_type": "client backend",
       "audit": {
         "audit_type": "SESSION",
         "statement_id": "1",
         "substatement_id": "1",
         "class": "READ",
         "command": "SELECT FOR KEY SHARE",
         "statement": "SELECT pg_current_wal_lsn()",
         "parameter": "<none>"
       }
     },
     "logging_pod": "cluster-example-1"
   }

`PGAudit documentation <https://github.com/pgaudit/pgaudit/blob/master/README.md#format>`_ を参照してください。

レコードの各フィールドの詳細については、

EDB Audit log
-------------

EDB Postgres Advanced
Serverで実行されているクラスターは、次のように `EDB Audit <https://www.enterprisedb.com/docs/epas/latest/epas_security_guide/05_edb_audit_logging/>`_ を有効にできます。

.. code:: yaml

   apiVersion: postgresql.k8s.enterprisedb.io/v1
   kind: Cluster
   metadata:
     name: cluster-example
   spec:
     instances: 3
     imageName: quay.io/enterprisedb/edb-postgres-advanced:13
     licenseKey: <LICENSE>

     postgresql:
       epas:
         audit: true

     storage:
       size: 1Gi

``.spec.postgresql.epas.audit: true``
を設定すると、次のパラメーターが適用されます。

.. code:: text

   edb_audit = csv
   edb_audit_destination = file
   edb_audit_directory = /controller/log
   edb_audit_filename = edb_audit
   edb_audit_rotation_day = none
   edb_audit_rotation_seconds = 0
   edb_audit_rotation_size = 0
   edb_audit_tag = 
   edb_log_every_bulk_value = false

他のパラメーターは、通常のように\ ``.spec.postgresql.parameters``
を介して渡すことができます。

監査CSVログは、残りのすべてのログと同様に、解析され、JSON形式でstdoutにルーティングされます。

- ``.logger`` を\ ``edb_audit`` に設定

- ``.msg`` を\ ``record`` に設定

- 解析されたレコード全体をJSONオブジェクトとして含む\ ``.record``

以下の例を参照してください。

.. code:: json

   {
     "level": "info",
     "ts": 1624629110.7641866,
     "logger": "edb_audit",
     "msg": "record",
     "record": {
       "log_time": "2021-06-25 13:51:50.763 UTC",
       "user_name": "postgres",
       "database_name": "postgres",
       "process_id": "68",
       "connection_from": "[local]",
       "session_id": "60d5df76.44",
       "session_line_num": "5",
       "process_status": "idle in transaction",
       "session_start_time": "2021-06-25 13:51:50 UTC",
       "virtual_transaction_id": "3/93",
       "transaction_id": "1183",
       "error_severity": "AUDIT",
       "sql_state_code": "00000",
       "message": "statement: GRANT EXECUTE ON function pg_catalog.pg_read_binary_file(text) TO \"streaming_replica\"",
       "detail": "",
       "hint": "",
       "internal_query": "",
       "internal_query_pos": "",
       "context": "",
       "query": "",
       "query_pos": "",
       "location": "",
       "application_name": "",
       "backend_type": "client backend",
       "command_tag": "GRANT",
       "audit_tag": "",
       "type": "grant"
     },
     "logging_pod": "cluster-example-1"
   }

EDB :ref:`Audit file <Logging>` を参照してください

レコードのフィールドの詳細については、

その他のログ
------------

オペレーターとそのインスタンスによって生成されたすべてのログはJSON形式であり、
``logger``
フィールドは、それらを生成したプロセスを示します。使用可能な\ ``logger``
値は次のとおりです。

- ``barman-cloud-wal-archive`` ``barman-cloud-wal-archive`` からのログ

- ``barman-cloud-wal-restore`` ``barman-cloud-wal-restore`` からのログ

- ``edb_audit`` EDB Audit拡張機能から

- ``initdb`` ``initdb`` の実行からのログ

- ``pg_basebackup`` ``pg_basebackup`` の実行からのログ

- ``pg_controldata`` ``pg_controldata`` の実行からのログ

- ``pg_ctl`` ``pg_ctl`` サブコマンドの実行からのログ

- ``pg_rewind`` ``pg_rewind`` の実行からのログ

- ``pgaudit`` PGAudit拡張機能からのログ

- ``postgres`` ``postgres`` インスタンスからのログ ``msg``
  は\ ``record`` とは異なります

- ``wal-archive`` インスタンスマネージャーの\ ``wal-archive``
  サブコマンドからのログ

- ``wal-restore`` インスタンスマネージャーの\ ``wal-restore``
  サブコマンドからのログ

- ``instance-manager`` :ref:`PostgreSQL instance manager <Postgres instance manager>` から

特定の構造に従う\ ``postgres`` および\ ``edb_audit`` を除き
、他のすべての\ ``logger``
値には、ログに記録されるエスケープメッセージを含む\ ``msg``
フィールドが含まれます。
