What is this issue?
The log_statement setting controls which SQL statements are logged:
- none: No statements logged (use log_min_duration_statement)
- ddl: Only DDL statements (CREATE, ALTER, DROP)
- mod: DDL + data-modifying statements (INSERT, UPDATE, DELETE)
- all: Every single statement
With log_statement = all:
- Every SELECT is logged (potentially millions per hour)
- Log files grow gigabytes per day
- I/O overhead can be 10-30% of throughput
- Sensitive data may appear in logs
Why it matters
Performance Impact
10-30% throughput reduction from logging I/O
Disk Space
Logs grow rapidly, potentially filling disk
Security Risk
Query parameters may contain sensitive data
Log Noise
Important messages buried in millions of statements
How PG Pilot detects it
```sql SELECT name, setting FROM pg_settings WHERE name = 'log_statement'; ```
How to fix it
Use targeted logging instead
Log slow queries instead of all queries:
ALTER SYSTEM SET log_statement = 'ddl';
ALTER SYSTEM SET log_min_duration_statement = '100ms';
SELECT pg_reload_conf();Consider what you need
Choose the right level:
- ddl: Schema changes only (safest)
- mod: Data modifications (for audit trails)
- Use log_min_duration_statement for slow query analysis
Use pg_stat_statements
For query analysis, use pg_stat_statements instead:
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;This aggregates statistics without logging every query.
Prevention
- Never use log_statement = 'all' in production
- Use log_min_duration_statement for slow query analysis
- Use pg_stat_statements for query statistics
- Reserve verbose logging for debugging specific issues