1717import copy
1818import functools
1919import grpc
20+ import logging
2021import re
2122import threading
2223
@@ -95,11 +96,19 @@ class Database(object):
9596 :param pool: (Optional) session pool to be used by database. If not
9697 passed, the database will construct an instance of
9798 :class:`~google.cloud.spanner_v1.pool.BurstyPool`.
99+
100+ :type logger: `logging.Logger`
101+ :param logger: (Optional) a custom logger that is used if `log_commit_stats`
102+ is `True` to log commit statistics. If not passed, a logger
103+ will be created when needed that will log the commit statistics
104+ to stdout.
98105 """
99106
100107 _spanner_api = None
101108
102- def __init__ (self , database_id , instance , ddl_statements = (), pool = None ):
109+ def __init__ (
110+ self , database_id , instance , ddl_statements = (), pool = None , logger = None
111+ ):
103112 self .database_id = database_id
104113 self ._instance = instance
105114 self ._ddl_statements = _check_ddl_statements (ddl_statements )
@@ -109,6 +118,8 @@ def __init__(self, database_id, instance, ddl_statements=(), pool=None):
109118 self ._restore_info = None
110119 self ._version_retention_period = None
111120 self ._earliest_version_time = None
121+ self .log_commit_stats = False
122+ self ._logger = logger
112123
113124 if pool is None :
114125 pool = BurstyPool ()
@@ -237,6 +248,25 @@ def ddl_statements(self):
237248 """
238249 return self ._ddl_statements
239250
251+ @property
252+ def logger (self ):
253+ """Logger used by the database.
254+
255+ The default logger will log commit stats at the log level INFO using
256+ `sys.stderr`.
257+
258+ :rtype: :class:`logging.Logger` or `None`
259+ :returns: the logger
260+ """
261+ if self ._logger is None :
262+ self ._logger = logging .getLogger (self .name )
263+ self ._logger .setLevel (logging .INFO )
264+
265+ ch = logging .StreamHandler ()
266+ ch .setLevel (logging .INFO )
267+ self ._logger .addHandler (ch )
268+ return self ._logger
269+
240270 @property
241271 def spanner_api (self ):
242272 """Helper for session-related API calls."""
@@ -647,8 +677,13 @@ def __exit__(self, exc_type, exc_val, exc_tb):
647677 """End ``with`` block."""
648678 try :
649679 if exc_type is None :
650- self ._batch .commit ()
680+ self ._batch .commit (return_commit_stats = self . _database . log_commit_stats )
651681 finally :
682+ if self ._database .log_commit_stats and self ._batch .commit_stats :
683+ self ._database .logger .info (
684+ "CommitStats: {}" .format (self ._batch .commit_stats ),
685+ extra = {"commit_stats" : self ._batch .commit_stats },
686+ )
652687 self ._database ._pool .put (self ._session )
653688
654689
0 commit comments