This morning I noticed this error in my PG CSV log file.

2022-05-25 23:59:17.776 JST,,,117110,,628cf2c5.1c976,1,,2022-05-25 23:59:17 JST,9/611296,0,ERROR,XX001,"uncommitted xmin 16395356 from before xid cutoff 144683296 needs to be frozen",,,,,"while scanning block 19267 of relation ""relation_name""

This was a data corruption error that I resolved by truncating the table and reloading it. However, I was curious why this message was not sent to my syslog.

My logging configuration in the postgresql.conf is as follows:

# Logging settings
# ----------------
log_destination = 'csvlog,syslog'
logging_collector = on
log_directory = 'pg_log'
log_filename = 'postgresql_%Y%m%d.log'
log_truncate_on_rotation = off
log_rotation_age = 1h
log_rotation_size = 0

log_timezone = 'Japan'
log_line_prefix = '%t [%p]: [%l-1] %h:%u@%d:[PG]:CODE:%e '

log_statement = 'all'
log_min_messages = info         # DEBUG5
log_min_error_statement = info  # DEBUG5
log_error_verbosity = default
log_checkpoints = on
log_lock_waits = on
log_temp_files = 0
log_connections = on
log_disconnections = on
log_duration = off
log_min_duration_statement = 1000
log_autovacuum_min_duration = 3000ms

The OS info for the server on which this DB is running is as follows:

LSB Version:    :core-4.1-amd64:core-4.1-noarch
Distributor ID: CentOS
Description:    CentOS Linux release 7.9.2009 (Core)
Release:        7.9.2009
Codename:       Core

And there is a filter defined for the rsyslog messages as follows:

if $programname == 'postgres' and \
($msg contains 'CODE:28000'    or \
$msg contains 'CODE:28P01'     or \
$msg contains 'CODE:3D000'     or \
$msg contains 'CODE:08006'     or \
$msg contains 'CODE:42501'        \
) then /xxxx/xxxx/xxx/pg_log/postgres_filter.log

if $programname == 'postgres' and \
(                                 \
not ($msg contains '[PG]') or \
$msg contains 'CODE:00000'     or \
$msg contains 'CODE:28000'     or \
$msg contains 'CODE:28P01'     or \
$msg contains 'CODE:3D000'     or \
$msg contains 'CODE:42501'     or \
$msg contains 'CODE:42601'     or \
$msg contains 'CODE:42P01'     or \
$msg contains 'CODE:42P02'     or \
$msg contains 'CODE:08006'     or \
$msg contains  'CODE:42703'       \
) then stop

syslog_ident and syslog_facility is as follows:

postgres=# show syslog_ident ;
(1 row)

postgres=# show syslog_facility ;
(1 row)

I was thinking that such an error message would be sent to the /var/log/message, from where it would be picked, but this wasn't the case. Could someone explain why this is so and what can I change for these messages to be sent to syslog?

  • What do the messages that are getting through to syslog look like?
    – jjanes
    May 26, 2022 at 15:19
  • That has been answered on the mailing list. Do other error get logged by syslog? May 27, 2022 at 7:02
  • If there are no filters, this is how it gets logged in the /var/log/messages 2022-05-26T16:33:12.680318+09:00 node03 postgres[2157]: [12-1] 2022-05-26 16:33:12 JST [2157]: [5-1] [local]:postgres@testdb:[PG]:CODE:58P01ERROR: could not open file "base/16384/16387": No such file or directory On the mailing list too my question is that when the error code XX001 doesn't match the string, why is it skipped? Also, is there a way to reproduce the XX001 error? I can try it on the testdb and print it on the syslog, and then add the filters.
    – Abhishek B
    May 27, 2022 at 7:19


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Browse other questions tagged or ask your own question.