feat(db): Make dirty query logging available in production

Signed-off-by: Christoph Wurst <christoph@winzerhof-wurst.at>
pull/43185/head
Christoph Wurst 2024-01-29 11:41:45 +07:00
parent 063c051cdc
commit 911ab393c0
No known key found for this signature in database
GPG Key ID: CC42AC2A7F0E56D8
2 changed files with 18 additions and 1 deletions

@ -994,6 +994,15 @@ $CONFIG = [
*/
'loglevel_frontend' => 2,
/**
* Loglevel used by the dirty database query detection. Useful to identify
* potential database bugs in production. Set this to loglevel or higher to
* see dirty queries in the logs.
*
* Defaults to ``0`` (debug)
*/
'loglevel_dirty_database_queries' => 0,
/**
* If you maintain different instances and aggregate the logs, you may want
* to distinguish between them. ``syslog_tag`` can be set per instance

@ -276,7 +276,15 @@ class Connection extends PrimaryReadReplicaConnection {
} else {
// Read to a table that has been written to previously
// While this might not necessarily mean that we did a read after write it is an indication for a code path to check
$this->logger->debug('dirty table reads: ' . $sql, ['tables' => $this->tableDirtyWrites, 'reads' => $tables, 'exception' => new \Exception()]);
$this->logger->log(
(int) ($this->systemConfig->getValue('loglevel_dirty_database_queries', null) ?? 0),
'dirty table reads: ' . $sql,
[
'tables' => $this->tableDirtyWrites,
'reads' => $tables,
'exception' => new \Exception(),
],
);
}
$sql = $this->replaceTablePrefix($sql);