Skip to content

Commit

Permalink
feat(db): Make dirty query logging available in production
Browse files Browse the repository at this point in the history
Signed-off-by: Christoph Wurst <christoph@winzerhof-wurst.at>
  • Loading branch information
ChristophWurst committed Jan 30, 2024
1 parent 063c051 commit 911ab39
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 1 deletion.
9 changes: 9 additions & 0 deletions config/config.sample.php
Original file line number Diff line number Diff line change
Expand Up @@ -994,6 +994,15 @@
*/
'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
Expand Down
10 changes: 9 additions & 1 deletion lib/private/DB/Connection.php
Original file line number Diff line number Diff line change
Expand Up @@ -276,7 +276,15 @@ public function executeQuery(string $sql, array $params = [], $types = [], Query
} 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);
Expand Down

0 comments on commit 911ab39

Please sign in to comment.