Skip to content

Commit db0d14a

Browse files
author
Kareem Zidane
committed
use separate logger for cs50.sql
1 parent f3750c7 commit db0d14a

File tree

2 files changed

+24
-9
lines changed

2 files changed

+24
-9
lines changed

src/cs50/cs50.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414

1515
# Configure default logging handler and formatter
16+
# Prevent flask, werkzeug, etc from adding default handler
1617
logging.basicConfig(format="%(levelname)s: %(message)s", level=logging.DEBUG)
1718

1819
try:

src/cs50/sql.py

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,3 @@
1-
import logging
2-
3-
41
class SQL(object):
52
"""Wrap SQLAlchemy to provide a simple SQL API."""
63

@@ -21,6 +18,8 @@ def __init__(self, url, **kwargs):
2118
import sqlalchemy
2219
import sqlite3
2320

21+
from .cs50 import _formatException
22+
2423
# Require that file already exist for SQLite
2524
matches = re.search(r"^sqlite:///(.+)$", url)
2625
if matches:
@@ -51,17 +50,32 @@ def connect(dbapi_connection, connection_record):
5150
# Register listener
5251
sqlalchemy.event.listen(self._engine, "connect", connect)
5352

53+
# Configure logger
54+
self._logger = logging.getLogger(__name__)
55+
self._logger.setLevel(logging.DEBUG)
56+
57+
# Log messages once
58+
self._logger.propagate = False
59+
60+
ch = logging.StreamHandler()
61+
ch.setLevel(logging.DEBUG)
62+
63+
formatter = logging.Formatter("%(levelname)s: %(message)s")
64+
formatter.formatException = lambda exc_info: _formatException(*exc_info)
65+
ch.setFormatter(formatter)
66+
self._logger.addHandler(ch)
67+
5468
# Test database
55-
disabled = logging.root.disabled
56-
logging.root.disabled = True
69+
disabled = self._logger.disabled
70+
self._logger.disabled = True
5771
try:
5872
self.execute("SELECT 1")
5973
except sqlalchemy.exc.OperationalError as e:
6074
e = RuntimeError(_parse_exception(e))
6175
e.__cause__ = None
6276
raise e
6377
finally:
64-
logging.root.disabled = disabled
78+
self._logger.disabled = disabled
6579

6680
def __del__(self):
6781
"""Disconnect from database."""
@@ -342,22 +356,22 @@ def shutdown_session(exception=None):
342356

343357
# If constraint violated, return None
344358
except sqlalchemy.exc.IntegrityError as e:
345-
logging.debug(termcolor.colored(statement, "yellow"))
359+
self._logger.debug(termcolor.colored(statement, "yellow"))
346360
e = ValueError(e.orig)
347361
e.__cause__ = None
348362
raise e
349363

350364
# If user error
351365
except (sqlalchemy.exc.OperationalError, sqlalchemy.exc.ProgrammingError) as e:
352366
self._disconnect()
353-
logging.debug(termcolor.colored(statement, "red"))
367+
self._logger.debug(termcolor.colored(statement, "red"))
354368
e = RuntimeError(e.orig)
355369
e.__cause__ = None
356370
raise e
357371

358372
# Return value
359373
else:
360-
logging.debug(termcolor.colored(_statement, "green"))
374+
self._logger.debug(termcolor.colored(_statement, "green"))
361375
return ret
362376

363377
def _escape(self, value):

0 commit comments

Comments
 (0)