ロギング
========

オペレーターは、PostgreSQLログを含む標準出力にJSON形式で直接ログを記録するように設計されています。

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

-  ``level`` ログレベル ``info`` , ``notice`` , …

-  ``ts`` タイムスタンプマイクロ秒のエポック

-  ``logger`` レコードのタイプたとえば ``postgres``
   または\ ``pg_controldata``

-  ``msg`` 実際のメッセージまたはキーワード ``record``
   メッセージがJSON形式で解析される場合

-  ``record`` 実際のレコード ``logger`` タイプによって異なる構造

-  ``logging_podName`` ログが作成されたPodが生成

..  Warning::
   ログの長期保存と管理はオペレーターの範囲外であり、Kubernetesインストールのレベルで提供される必要があります。 :ref:`Kubernetes Logging Architecture <ロギング>` を参照してください。

ドキュメント。

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

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

ログレベルは、クラスター仕様でオプション\ ``logLevel``
を使用して指定でき、 ``error`` 、\ ``warning`` 、\ ``info``
default、\ ``debug`` 、または\ ``trace`` のいずれかに設定できます。

現時点では、ログレベルはインスタンスの起動時にのみ設定でき、実行時に変更することはできません。クラスターが起動された後にクラスター仕様の値が変更された場合、これは新しいポッドでのみ有効になり、古いポッドではありません。

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

PostgreSQLログの各エントリは、\ ``postgres`` に設定された\ ``logger``
キーと次の例で説明する構造を持つ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",
   }

内部的には、オペレーターはPostgreSQL CSVログ形式に依存しています。 `CSV
log
format <https://www.postgresql.org/docs/current/runtime-config-logging.html>`__\ の詳細については、PostgreSQLドキュメントを参照してください。

PGAuditログ
-----------

CloudNativePGは、PostgreSQLクラスターで `PGAudit <https://www.pgaudit.org/>`_ の透過的かつネイティブサポートを備えています。

必要な作業は、必要な\ ``pgaudit``
パラメーターをクラスターの構成の\ ``postgresql``
セクションに追加するだけです。

..  Important::
   PGAuditライブラリを`shared_preload_libraries` に追加する必要はありません。ライブラリは、postgresql構成内の`pgaudit.*` パラメーターの存在に基づいて、CloudNativePGによって自動的に追加されます。オペレーターは、`shared_preload_libraries` からのライブラリの追加と削除を検出および管理します。

オペレーターは、クラスター内の使用可能なすべてのデータベースから拡張機能の作成と削除も行います。

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

次に、PostgreSQL 13 ``Cluster``
展開の例を示します。これにより、要求された構成で\ ``pgaudit``
が有効になります。

.. code:: yaml

   apiVersion: postgresql.cnpg.io/v1
   kind: Cluster
   metadata:
     name: cluster-example
   spec:
     instances: 3
     imageName: ghcr.io/cloudnative-pg/postgresql:13

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

     storage:
       size: 1Gi

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

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

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

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

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

.. 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>`_ を参照してください。

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

オペレーターとそのインスタンスによって生成されるすべてのログはJSON形式であり、\ ``logger``
は、それらを生成したプロセスに応じて設定されます。したがって、考えられるすべての\ ``logger``
値は次のとおりです。

-  ``barman-cloud-wal-archive`` ``barman-cloud-wal-archive`` から直接

-  ``barman-cloud-wal-restore`` ``barman-cloud-wal-restore`` から直接

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

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

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

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

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

-  ``pgaudit`` PGAudit拡張機能から

-  ``postgres`` ``postgres`` インスタンスから ``record``
   とは異なる\ ``msg`` を持っています

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

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

前述の構造を持つ\ ``postgres`` を除き
、他のすべての考えられる値は\ ``msg``
をログに記録されるエスケープメッセージに設定するだけです。
