aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristoph Wurst <christoph@winzerhof-wurst.at>2024-01-29 11:41:45 +0100
committerChristoph Wurst <christoph@winzerhof-wurst.at>2024-01-30 10:31:03 +0100
commit911ab393c07d7e2f29e8949d422b122ca91be354 (patch)
tree1aada03b8bc7c715838f11cf5cb2f2c33962c774
parent063c051cdcfbaf1f623337f6f1239438b35d094c (diff)
downloadnextcloud-server-911ab393c07d7e2f29e8949d422b122ca91be354.tar.gz
nextcloud-server-911ab393c07d7e2f29e8949d422b122ca91be354.zip
feat(db): Make dirty query logging available in production
Signed-off-by: Christoph Wurst <christoph@winzerhof-wurst.at>
-rw-r--r--config/config.sample.php9
-rw-r--r--lib/private/DB/Connection.php10
2 files changed, 18 insertions, 1 deletions
diff --git a/config/config.sample.php b/config/config.sample.php
index 24bed544692..d999b1e39b0 100644
--- a/config/config.sample.php
+++ b/config/config.sample.php
@@ -995,6 +995,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
* with a unique id. Only available if ``log_type`` is set to ``syslog`` or
diff --git a/lib/private/DB/Connection.php b/lib/private/DB/Connection.php
index 09c321aedb8..5affa2c3d48 100644
--- a/lib/private/DB/Connection.php
+++ b/lib/private/DB/Connection.php
@@ -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);