Skip to content

Commit 937890d

Browse files
committed
More docs, test multiple loggers
1 parent ab61adf commit 937890d

File tree

2 files changed

+38
-4
lines changed

2 files changed

+38
-4
lines changed

asyncpg/connection.py

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,7 @@ def add_query_logger(self, callback):
231231
**query**: a LoggedQuery containing the query, args, timeout, and
232232
elapsed.
233233
234-
.. versionadded:: 0.28.0
234+
.. versionadded:: 0.29.0
235235
"""
236236
self._query_loggers.add(_Callback.from_callable(callback))
237237

@@ -242,7 +242,7 @@ def remove_query_logger(self, callback):
242242
The callable or coroutine function that was passed to
243243
:meth:`Connection.add_query_logger`.
244244
245-
.. versionadded:: 0.28.0
245+
.. versionadded:: 0.29.0
246246
"""
247247
self._query_loggers.discard(_Callback.from_callable(callback))
248248

@@ -1696,6 +1696,31 @@ async def _execute(
16961696
return result
16971697

16981698
def logger(self, callback):
1699+
"""Context manager that adds `callback` to the list of query loggers,
1700+
and removes it upon exit.
1701+
1702+
:param callable callback:
1703+
A callable or a coroutine function receiving two arguments:
1704+
**connection**: a Connection the callback is registered with.
1705+
**query**: a LoggedQuery containing the query, args, timeout, and
1706+
elapsed.
1707+
1708+
Example:
1709+
1710+
.. code-block:: pycon
1711+
1712+
>>> class QuerySaver:
1713+
def __init__(self):
1714+
self.queries = []
1715+
def __call__(self, conn, record):
1716+
self.queries.append(record.query)
1717+
>>> with con.logger(QuerySaver()) as log:
1718+
>>> await con.execute("SELECT 1")
1719+
>>> print(log.queries)
1720+
['SELECT 1']
1721+
1722+
.. versionadded:: 0.29.0
1723+
"""
16991724
return _LoggingContext(self, callback)
17001725

17011726
def _log_query(self, query, args, timeout, elapsed):
@@ -2389,7 +2414,7 @@ def __init__(self, conn, callback):
23892414

23902415
def __enter__(self):
23912416
self._conn.add_query_logger(self._cb)
2392-
return self
2417+
return self._cb
23932418

23942419
def __exit__(self, *exc_info):
23952420
self._conn.remove_query_logger(self._cb)

tests/test_logging.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,19 @@ async def test_logging_context(self):
1111
def query_saver(conn, record):
1212
queries.put_nowait(record)
1313

14+
class QuerySaver:
15+
def __init__(self):
16+
self.queries = []
17+
def __call__(self, conn, record):
18+
self.queries.append(record.query)
19+
1420
with self.con.logger(query_saver):
1521
self.assertEqual(len(self.con._query_loggers), 1)
16-
await self.con.execute("SELECT 1")
22+
with self.con.logger(QuerySaver()) as log:
23+
self.assertEqual(len(self.con._query_loggers), 2)
24+
await self.con.execute("SELECT 1")
1725

1826
record = await queries.get()
1927
self.assertEqual(record.query, "SELECT 1")
28+
self.assertEqual(log.queries, ["SELECT 1"])
2029
self.assertEqual(len(self.con._query_loggers), 0)

0 commit comments

Comments
 (0)