Skip to content

Commit 2d63cda

Browse files
author
Jon Wayne Parrott
authored
Implement flush for cloud logging handlers (googleapis#3413)
1 parent 2844703 commit 2d63cda

File tree

5 files changed

+38
-0
lines changed

5 files changed

+38
-0
lines changed

logging/google/cloud/logging/handlers/transports/background_thread.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,10 @@ def enqueue(self, record, message):
221221
'severity': record.levelname,
222222
})
223223

224+
def flush(self):
225+
"""Submit any pending log records."""
226+
self._queue.join()
227+
224228

225229
class BackgroundThreadTransport(Transport):
226230
"""Asynchronous transport that uses a background thread.
@@ -260,3 +264,7 @@ def send(self, record, message):
260264
formatted by the associated log formatters.
261265
"""
262266
self.worker.enqueue(record, message)
267+
268+
def flush(self):
269+
"""Submit any pending log records."""
270+
self.worker.flush()

logging/google/cloud/logging/handlers/transports/base.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,3 +33,9 @@ def send(self, record, message):
3333
formatted by the associated log formatters.
3434
"""
3535
raise NotImplementedError
36+
37+
def flush(self):
38+
"""Submit any pending log records.
39+
40+
For blocking/sync transports, this is a no-op.
41+
"""

logging/tests/system.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,7 @@ def test_log_handler_async(self):
247247
cloud_logger = logging.getLogger(handler.name)
248248
cloud_logger.addHandler(handler)
249249
cloud_logger.warn(LOG_MESSAGE)
250+
handler.flush()
250251
entries = _list_entries(logger)
251252
expected_payload = {
252253
'message': LOG_MESSAGE,

logging/tests/unit/handlers/transports/test_background_thread.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import unittest
1717

1818
import mock
19+
from six.moves import queue
1920

2021

2122
class TestBackgroundThreadHandler(unittest.TestCase):
@@ -61,6 +62,16 @@ def test_send(self):
6162

6263
transport.worker.enqueue.assert_called_once_with(record, message)
6364

65+
def test_flush(self):
66+
client = _Client(self.PROJECT)
67+
name = 'python_logger'
68+
69+
transport, _ = self._make_one(client, name)
70+
71+
transport.flush()
72+
73+
transport.worker.flush.assert_called()
74+
6475

6576
class Test_Worker(unittest.TestCase):
6677
NAME = 'python_logger'
@@ -233,6 +244,14 @@ def test__thread_main_batches(self):
233244
self.assertFalse(worker._cloud_logger._batch.commit_called)
234245
self.assertEqual(worker._queue.qsize(), 0)
235246

247+
def test_flush(self):
248+
worker = self._make_one(_Logger(self.NAME))
249+
worker._queue = mock.Mock(spec=queue.Queue)
250+
251+
# Queue is empty, should not block.
252+
worker.flush()
253+
worker._queue.join.assert_called()
254+
236255

237256
class _Thread(object):
238257

logging/tests/unit/handlers/transports/test_base.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,3 +32,7 @@ def test_send_is_abstract(self):
3232
target = self._make_one()
3333
with self.assertRaises(NotImplementedError):
3434
target.send(None, None)
35+
36+
def test_flush_is_abstract_and_optional(self):
37+
target = self._make_one()
38+
target.flush()

0 commit comments

Comments
 (0)