Skip to content

Commit b04eaa6

Browse files
committed
Merge pull request #1567 from tseaver/logging-logger_log_text
Add 'Logger.log_text' method.
2 parents 95238be + b466893 commit b04eaa6

File tree

2 files changed

+98
-0
lines changed

2 files changed

+98
-0
lines changed

gcloud/logging/logger.py

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,3 +41,49 @@ def client(self):
4141
def project(self):
4242
"""Project bound to the logger."""
4343
return self._client.project
44+
45+
@property
46+
def full_name(self):
47+
"""Fully-qualified name used in logging APIs"""
48+
return 'projects/%s/logs/%s' % (self.project, self.name)
49+
50+
def _require_client(self, client):
51+
"""Check client or verify over-ride.
52+
53+
:type client: :class:`gcloud.logging.client.Client` or ``NoneType``
54+
:param client: the client to use. If not passed, falls back to the
55+
``client`` stored on the current topic.
56+
57+
:rtype: :class:`gcloud.logging.client.Client`
58+
:returns: The client passed in or the currently bound client.
59+
"""
60+
if client is None:
61+
client = self._client
62+
return client
63+
64+
def log_text(self, text, client=None):
65+
"""API call: log a text message via a POST request
66+
67+
See:
68+
https://cloud.google.com/logging/docs/api/ref_v2beta1/rest/v2beta1/entries/write
69+
70+
:type text: text
71+
:param text: the log message.
72+
73+
:type client: :class:`gcloud.logging.client.Client` or ``NoneType``
74+
:param client: the client to use. If not passed, falls back to the
75+
``client`` stored on the current logger.
76+
"""
77+
client = self._require_client(client)
78+
79+
data = {
80+
'entries': [{
81+
'logName': self.full_name,
82+
'textPayload': text,
83+
'resource': {
84+
'type': 'global',
85+
},
86+
}],
87+
}
88+
client.connection.api_request(
89+
method='POST', path='/entries:write', data=data)

gcloud/logging/test_logger.py

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,53 @@ def test_ctor(self):
3434
self.assertEqual(logger.name, self.LOGGER_NAME)
3535
self.assertTrue(logger.client is client)
3636
self.assertEqual(logger.project, self.PROJECT)
37+
self.assertEqual(logger.full_name, 'projects/%s/logs/%s'
38+
% (self.PROJECT, self.LOGGER_NAME))
39+
40+
def test_log_text_w_str_implicit_client(self):
41+
TEXT = 'TEXT'
42+
conn = _Connection({})
43+
client = _Client(self.PROJECT, conn)
44+
logger = self._makeOne(self.LOGGER_NAME, client=client)
45+
logger.log_text(TEXT)
46+
self.assertEqual(len(conn._requested), 1)
47+
req = conn._requested[0]
48+
SENT = {
49+
'entries': [{
50+
'logName': 'projects/%s/logs/%s' % (
51+
self.PROJECT, self.LOGGER_NAME),
52+
'textPayload': TEXT,
53+
'resource': {
54+
'type': 'global',
55+
},
56+
}],
57+
}
58+
self.assertEqual(req['method'], 'POST')
59+
self.assertEqual(req['path'], '/entries:write')
60+
self.assertEqual(req['data'], SENT)
61+
62+
def test_log_text_w_unicode_explicit_client(self):
63+
TEXT = u'TEXT'
64+
conn = _Connection({})
65+
client1 = _Client(self.PROJECT, object())
66+
client2 = _Client(self.PROJECT, conn)
67+
logger = self._makeOne(self.LOGGER_NAME, client=client1)
68+
logger.log_text(TEXT, client=client2)
69+
self.assertEqual(len(conn._requested), 1)
70+
req = conn._requested[0]
71+
SENT = {
72+
'entries': [{
73+
'logName': 'projects/%s/logs/%s' % (
74+
self.PROJECT, self.LOGGER_NAME),
75+
'textPayload': TEXT,
76+
'resource': {
77+
'type': 'global',
78+
},
79+
}],
80+
}
81+
self.assertEqual(req['method'], 'POST')
82+
self.assertEqual(req['path'], '/entries:write')
83+
self.assertEqual(req['data'], SENT)
3784

3885

3986
class _Connection(object):
@@ -42,6 +89,11 @@ def __init__(self, *responses):
4289
self._responses = responses
4390
self._requested = []
4491

92+
def api_request(self, **kw):
93+
self._requested.append(kw)
94+
response, self._responses = self._responses[0], self._responses[1:]
95+
return response
96+
4597

4698
class _Client(object):
4799

0 commit comments

Comments
 (0)