From 1cb94cf2183dc3462af9b008a92b8c6d37346d87 Mon Sep 17 00:00:00 2001 From: Abhinav Tarigoppula Date: Sun, 27 Sep 2026 20:24:36 +0530 Subject: [PATCH] Remove the query logger when the query_logger() block raises query_logger() removed its callback after a bare yield, so any exception in the with-block, such as a failing query, left the logger attached to the connection. Pooled connections then kept reporting later, unrelated queries to it. --- asyncpg/connection.py | 6 ++++-- tests/test_logging.py | 12 ++++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/asyncpg/connection.py b/asyncpg/connection.py index e3186bc3..4a72307b 100644 --- a/asyncpg/connection.py +++ b/asyncpg/connection.py @@ -1932,8 +1932,10 @@ def __call__(self, record): .. versionadded:: 0.29.0 """ self.add_query_logger(callback) - yield - self.remove_query_logger(callback) + try: + yield + finally: + self.remove_query_logger(callback) @contextlib.contextmanager def _time_and_log(self, query, args, timeout): diff --git a/tests/test_logging.py b/tests/test_logging.py index a9af94c4..f66db159 100644 --- a/tests/test_logging.py +++ b/tests/test_logging.py @@ -49,3 +49,15 @@ async def test_error_logging(self): type(log.records[0].exception), exceptions.UndefinedColumnError ) + + async def test_logging_context_removed_on_error(self): + log = LogCollector() + with self.assertRaises(exceptions.UndefinedColumnError): + with self.con.query_logger(log): + await self.con.execute("SELECT x") + + self.assertEqual(len(self.con._query_loggers), 0) + + await self.con.execute("SELECT 1") + await asyncio.sleep(0) # wait for logging + self.assertEqual(len(log.records), 1)