Skip to content

Commit b8151b1

Browse files
committed
Merge pull request #1574 from tseaver/logging-logger_list_entries
Add 'Logger.list_entries'.
2 parents 68baa1b + e4b4b0d commit b8151b1

File tree

3 files changed

+101
-1
lines changed

3 files changed

+101
-1
lines changed

docs/logging-usage.rst

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ Sort entries in descending timestamp order.
9898
>>> client = logging.Client()
9999
>>> entries, token = client.list_entries(order_by=logging.DESCENDING) # API call
100100

101-
Retrieve entities in batches of 10, iterating until done.
101+
Retrieve entries in batches of 10, iterating until done.
102102

103103
.. doctest::
104104

@@ -112,6 +112,14 @@ Retrieve entities in batches of 10, iterating until done.
112112
... if token is None:
113113
... break
114114

115+
Retrieve entries for a single logger, sorting in descending timestamp order:
116+
117+
.. doctest::
118+
119+
>>> from gcloud import logging
120+
>>> client = logging.Client()
121+
>>> logger = client.logger('log_name')
122+
>>> entries, token = logger.list_entries(order_by=logging.DESCENDING) # API call
115123

116124
Delete all entries for a logger
117125
-------------------------------

gcloud/logging/logger.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,3 +128,46 @@ def delete(self, client=None):
128128
client = self._require_client(client)
129129
client.connection.api_request(
130130
method='DELETE', path='/%s' % self.full_name)
131+
132+
def list_entries(self, projects=None, filter_=None, order_by=None,
133+
page_size=None, page_token=None):
134+
"""Return a page of log entries.
135+
136+
See:
137+
https://cloud.google.com/logging/docs/api/ref_v2beta1/rest/v2beta1/entries/list
138+
139+
:type projects: list of strings
140+
:param projects: project IDs to include. If not passed,
141+
defaults to the project bound to the client.
142+
143+
:type filter_: string
144+
:param filter_: a filter expression. See:
145+
https://cloud.google.com/logging/docs/view/advanced_filters
146+
147+
:type order_by: string
148+
:param order_by: One of :data:`gcloud.logging.ASCENDING` or
149+
:data:`gcloud.logging.DESCENDING`.
150+
151+
:type page_size: int
152+
:param page_size: maximum number of topics to return, If not passed,
153+
defaults to a value set by the API.
154+
155+
:type page_token: string
156+
:param page_token: opaque marker for the next "page" of topics. If not
157+
passed, the API will return the first page of
158+
topics.
159+
160+
:rtype: tuple, (list, str)
161+
:returns: list of :class:`gcloud.logging.entry.TextEntry`, plus a
162+
"next page token" string: if not None, indicates that
163+
more topics can be retrieved with another call (pass that
164+
value as ``page_token``).
165+
"""
166+
log_filter = 'logName:%s' % (self.name,)
167+
if filter_ is not None:
168+
filter_ = '%s AND %s' % (filter_, log_filter)
169+
else:
170+
filter_ = log_filter
171+
return self.client.list_entries(
172+
projects=projects, filter_=filter_, order_by=order_by,
173+
page_size=page_size, page_token=page_token)

gcloud/logging/test_logger.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,48 @@ def test_delete_w_alternate_client(self):
152152
self.assertEqual(req['method'], 'DELETE')
153153
self.assertEqual(req['path'], '/%s' % PATH)
154154

155+
def test_list_entries_defaults(self):
156+
LISTED = {
157+
'projects': None,
158+
'filter_': 'logName:%s' % (self.LOGGER_NAME),
159+
'order_by': None,
160+
'page_size': None,
161+
'page_token': None,
162+
}
163+
TOKEN = 'TOKEN'
164+
conn = _Connection()
165+
client = _Client(self.PROJECT, conn)
166+
client._token = TOKEN
167+
logger = self._makeOne(self.LOGGER_NAME, client=client)
168+
entries, token = logger.list_entries()
169+
self.assertEqual(len(entries), 0)
170+
self.assertEqual(token, TOKEN)
171+
self.assertEqual(client._listed, LISTED)
172+
173+
def test_list_entries_explicit(self):
174+
from gcloud.logging import DESCENDING
175+
PROJECT1 = 'PROJECT1'
176+
PROJECT2 = 'PROJECT2'
177+
FILTER = 'resource.type:global'
178+
TOKEN = 'TOKEN'
179+
PAGE_SIZE = 42
180+
LISTED = {
181+
'projects': ['PROJECT1', 'PROJECT2'],
182+
'filter_': '%s AND logName:%s' % (FILTER, self.LOGGER_NAME),
183+
'order_by': DESCENDING,
184+
'page_size': PAGE_SIZE,
185+
'page_token': TOKEN,
186+
}
187+
conn = _Connection()
188+
client = _Client(self.PROJECT, conn)
189+
logger = self._makeOne(self.LOGGER_NAME, client=client)
190+
entries, token = logger.list_entries(
191+
projects=[PROJECT1, PROJECT2], filter_=FILTER, order_by=DESCENDING,
192+
page_size=PAGE_SIZE, page_token=TOKEN)
193+
self.assertEqual(len(entries), 0)
194+
self.assertEqual(token, None)
195+
self.assertEqual(client._listed, LISTED)
196+
155197

156198
class _Connection(object):
157199

@@ -167,6 +209,13 @@ def api_request(self, **kw):
167209

168210
class _Client(object):
169211

212+
_listed = _token = None
213+
_entries = ()
214+
170215
def __init__(self, project, connection=None):
171216
self.project = project
172217
self.connection = connection
218+
219+
def list_entries(self, **kw):
220+
self._listed = kw
221+
return self._entries, self._token

0 commit comments

Comments
 (0)