17
17
import copy
18
18
import functools
19
19
import grpc
20
+ import logging
20
21
import re
21
22
import threading
22
23
@@ -95,11 +96,19 @@ class Database(object):
95
96
:param pool: (Optional) session pool to be used by database. If not
96
97
passed, the database will construct an instance of
97
98
: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.
98
105
"""
99
106
100
107
_spanner_api = None
101
108
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
+ ):
103
112
self .database_id = database_id
104
113
self ._instance = instance
105
114
self ._ddl_statements = _check_ddl_statements (ddl_statements )
@@ -109,6 +118,8 @@ def __init__(self, database_id, instance, ddl_statements=(), pool=None):
109
118
self ._restore_info = None
110
119
self ._version_retention_period = None
111
120
self ._earliest_version_time = None
121
+ self .log_commit_stats = False
122
+ self ._logger = logger
112
123
113
124
if pool is None :
114
125
pool = BurstyPool ()
@@ -237,6 +248,25 @@ def ddl_statements(self):
237
248
"""
238
249
return self ._ddl_statements
239
250
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
+
240
270
@property
241
271
def spanner_api (self ):
242
272
"""Helper for session-related API calls."""
@@ -647,8 +677,13 @@ def __exit__(self, exc_type, exc_val, exc_tb):
647
677
"""End ``with`` block."""
648
678
try :
649
679
if exc_type is None :
650
- self ._batch .commit ()
680
+ self ._batch .commit (return_commit_stats = self . _database . log_commit_stats )
651
681
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
+ )
652
687
self ._database ._pool .put (self ._session )
653
688
654
689
0 commit comments