Snowflake Postgres-Protokollierung¶
Abrufen von Postgres-Protokolldaten¶
Alle Postgres-Server auf Snowflake Postgres-Instanzen protokollieren lokal im syslog. Die Protokolldaten werden dort gesammelt und an die aktive Ereignistabelle Ihres Kontos gesendet.
Um die Postgres-Protokolle für eine bestimmte Instanz anzuzeigen, fragen Sie die Ereignistabelle nach dem Feld TIMESTAMP und dem MESSAGE-Teil des Felds VALUE der Datensätze mit record_type = 'LOG' ab. Verwenden Sie dafür den ersten Teil des Hostnamens der Instanz, d. h. die Instanz-ID (oder cluster_id). So werden beispielsweise die letzten 10 Minuten der Protokolleinträge für eine Instanz mit der ID oyrpb2cwtvbu5al5vtbyrsnkgy abgerufen:
SELECT TIMESTAMP, VALUE:MESSAGE as log_line
FROM SNOWFLAKE.TELEMETRY.EVENTS
WHERE resource_attributes['snowflake.o11y.logtype'] = 'postgres-otelcol-vm-agent'
AND resource_attributes['instance.id'] = 'oyrpb2cwtvbu5al5vtbyrsnkgy'
AND record_type = 'LOG'
AND TIMESTAMP > CURRENT_TIMESTAMP() - INTERVAL '10 MINUTES'
LIMIT 100;
Bemerkung
Die obige Abfrage verwendet die Standard-Ereignistabelle des Kontos: SNOWFLAKE.TELEMETRY.EVENTS. Wenn Sie eine kundenspezifische Ereignistabelle eingerichtet haben, sollten Sie die Abfrage entsprechend anpassen.
Jede Zeile der Ausgabe enthält einen einzelnen Protokollzeileneintrag, der vom Postgres-Server auf der angegebenen Snowflake Postgres-Instanz mit dem Zeitstempel protokolliert wurde, an dem er ursprünglich protokolliert wurde. Beachten Sie, dass es einige Minuten dauern kann, bis Postgres einen Protokolleintrag erstellt und dieser in der Ereignistabelle verfügbar ist.
Erläuterungen zur Verschachtelung von Postgres-Protokollzeilen¶
Beachten Sie, dass Postgres die mehrzeilige Protokollierung verwendet. Da mehrere Postgres-Serverprozesse gleichzeitig Protokolleinträge vornehmen, sind vollständige Protokolleinträge von verschiedenen Postgres-Serverprozessen häufig verschachtelt. Nehmen wir zum Beispiel diese Protokollzeileneinträge:
Zeitstempel |
log_line |
2025-12-09 23:16:38.760 |
„[14-1] [1592908][client backend][27/2][0] [user=snowflake_admin,db=postgres,app=psql] [34.214.158.144] ERROR: canceling statement due to user request“ |
2025-12-09 23:16:38.760 |
„[10-1] [1593992][not initialized][][0] [user=[unknown],db=[unknown],app=[unknown]] [34.214.158.144] LOG: connection received: host=34.214.158.144 port=46114“ |
2025-12-09 23:16:38.760 |
„[14-2] [1592908][client backend][27/2][0] [user=snowflake_admin,db=postgres,app=psql] [34.214.158.144] STATEMENT: select pg_sleep(10);“ |
2025-12-09 23:16:43.007 |
„[15-1] [1592908][client backend][27/3][0] [user=snowflake_admin,db=postgres,app=psql] [34.214.158.144] LOG: AUDIT: SESSION,2,1,MISC,SHOW,,,show log_min_duration_statement,<not logged>“ |
Für jeden Protokollzeileneintrag gilt:
Die ersten Werte in Klammern sind die Befehlsnummer der Sitzung, in der der Befehl ausgeführt wurde, und die Protokollzeile für diesen Befehl, getrennt durch einen Bindestrich. Beispielsweise sind [1-1] und [1-2] zwei Protokollzeilen von der ersten Befehlsausführung in einer Sitzung.
Der zweite Wert in Klammern ist die Prozess-ID (PID) für die Sitzung, die die Zeile protokolliert hat. Postgres verwendet ein prozessbasiertes (statt Thread-basiertes) Parallelitätsmodell, sodass jede Sitzung auf einem eigenen Serverprozess ausgeführt wird.
In diesem Beispiel können Sie Folgendes sehen:
Befehl 14 wurde von der Sitzung mit PID
1592908als Abbruch einerselect pg_sleep(10);-Abfrage ausgeführt.Protokollierung von Befehl 14 durch PID
1592908hat zwei Protokollzeilen hinzugefügt, [14-1] und [14-2].Eine einzelne Protokollzeile aus dem 10. Befehl, der von der Sitzung mit PID
1593992ausgeführt wird, endete zwischen den beiden Zeilen von Befehl 14 in ID1592908.Der nächste Befehl, der von der Sitzung mit PID
1592908ausgeführt wird, war eineshow log_min_duration_statement-Abfrage und benötigte nur eine Protokollzeile, [15-1].
Tipp
Das Format der Postgres-Protokollzeile wird durch die Servereinstellung log_line_prefix bestimmt, die bei Snowflake Postgres-Instanzen standardmäßig ‚[%p][%b][%v][%x] %q[user=%u,db=%d,app=%a] [%h]‘ lautet.