Skip to content

Commit 48437c1

Browse files
committed
Add record's __dict__ to structPayload
1 parent 930342a commit 48437c1

File tree

4 files changed

+67
-38
lines changed

4 files changed

+67
-38
lines changed

gcloud/logging/handlers/handlers.py

Lines changed: 41 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
"""Python :mod:`logging` handlers for Google Cloud Logging."""
1616

17+
import itertools
1718
import logging
1819

1920
from gcloud.logging.handlers.transports import BackgroundThreadTransport
@@ -52,6 +53,12 @@ class CloudLoggingHandler(logging.StreamHandler, object):
5253
Defaults to BackgroundThreadTransport. The other
5354
option is SyncTransport.
5455
56+
:type extra_fields: iterable, e.g. tuple, list, set
57+
:param extra_fields: the container with LogRecord.__dict__ fields which
58+
are forcefully submitted. Please note that some
59+
whitelisted fields like process or threadName are
60+
included by default.
61+
5562
Example:
5663
5764
.. doctest::
@@ -70,22 +77,54 @@ class CloudLoggingHandler(logging.StreamHandler, object):
7077
7178
"""
7279

80+
LOG_RECORD_DATA_WHITELIST = {
81+
'process', 'processName', 'thread', 'threadName', 'created',
82+
'relativeCreated', 'pathname', 'filename', 'lineno', 'module',
83+
'funcName', 'levelno'
84+
}
85+
7386
def __init__(self, client,
7487
name=DEFAULT_LOGGER_NAME,
75-
transport=BackgroundThreadTransport):
88+
transport=BackgroundThreadTransport,
89+
extra_fields=tuple()):
7690
super(CloudLoggingHandler, self).__init__()
7791
self.name = name
7892
self.client = client
93+
self.extra_fields = extra_fields
7994
self.transport = transport(client, name)
8095

96+
def generate_log_struct_kwargs(self, record, message):
97+
"""Produces the dictionary of chosen LogRecord fields. extra_fields
98+
are taken into account.
99+
100+
:type record: :class:`logging.LogRecord`
101+
:param record: Python log record
102+
103+
:type message: str
104+
:param message: The formatted log message
105+
106+
:return: dict with keyword arguments for
107+
:method:`gcloud.logging.Logger.log_struct()`.
108+
"""
109+
return {
110+
'info': {
111+
'message': message,
112+
'python_logger': record.name,
113+
'data': {k: getattr(record, k, None) for k in itertools.chain(
114+
self.LOG_RECORD_DATA_WHITELIST, self.extra_fields)}
115+
},
116+
'severity': record.levelname
117+
}
118+
81119
def emit(self, record):
82120
"""
83121
Overrides the default emit behavior of StreamHandler.
84122
85123
See: https://docs.python.org/2/library/logging.html#handler-objects
86124
"""
87125
message = super(CloudLoggingHandler, self).format(record)
88-
self.transport.send(record, message)
126+
kwargs = self.generate_log_struct_kwargs(record, message)
127+
self.transport.send(kwargs)
89128

90129

91130
def setup_logging(handler, excluded_loggers=EXCLUDE_LOGGER_DEFAULTS):

gcloud/logging/handlers/transports/background_thread.py

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -120,16 +120,14 @@ def _stop(self):
120120
self._stop_condition.release()
121121
self.stopped = True
122122

123-
def enqueue(self, record, message):
123+
def enqueue(self, kwargs):
124124
"""enqueue queues up a log entry to be written by the background
125125
thread. """
126126
try:
127127
self._entries_condition.acquire()
128128
if self.stopping:
129129
return
130-
self.batch.log_struct({"message": message,
131-
"python_logger": record.name},
132-
severity=record.levelname)
130+
self.batch.log_struct(**kwargs)
133131
self._entries_condition.notify()
134132
finally:
135133
self._entries_condition.release()
@@ -149,15 +147,13 @@ def __init__(self, client, name):
149147
logger = self.client.logger(name)
150148
self.worker = _Worker(logger)
151149

152-
def send(self, record, message):
153-
"""Overrides Transport.send(). record is the LogRecord
154-
the handler was called with, message is the message from LogRecord
155-
after being formatted by associated log formatters.
150+
def send(self, kwargs):
151+
"""Overrides Transport.send(). kwargs is the dictionary
152+
with keyword arguments which will be passed to
153+
:method:`gcloud.logging.Logger.log_struct()`.
156154
157-
:type record: :class:`logging.LogRecord`
158-
:param record: Python log record
159-
160-
:type message: str
161-
:param message: The formatted log message
155+
:type kwargs: dict
156+
:param kwargs: {'info': ..., 'severity': ...} - keyword arguments
157+
passed to :method:`gcloud.logging.Logger.log_struct()`.
162158
"""
163-
self.worker.enqueue(record, message)
159+
self.worker.enqueue(kwargs)

gcloud/logging/handlers/transports/base.py

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,13 @@ class Transport(object):
2424
def __init__(self, client, name):
2525
pass # pragma: NO COVER
2626

27-
def send(self, record, message):
28-
"""Must be overriden by transport options. record is the LogRecord
29-
the handler was called with, message is the message from LogRecord
30-
after being formatted by associated log formatters.
27+
def send(self, kwargs):
28+
"""Must be overriden by transport options. kwargs is the dictionary
29+
with keyword arguments which will be passed to
30+
:method:`gcloud.logging.Logger.log_struct()`.
3131
32-
:type record: :class:`logging.LogRecord`
33-
:param record: Python log record
34-
35-
:type message: str
36-
:param message: The formatted log message
32+
:type kwargs: dict
33+
:param kwargs: {'info': ..., 'severity': ...} - keyword arguments
34+
passed to :method:`gcloud.logging.Logger.log_struct()`.
3735
"""
3836
raise NotImplementedError()

gcloud/logging/handlers/transports/sync.py

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -26,17 +26,13 @@ def __init__(self, client, name):
2626
super(SyncTransport, self).__init__(client, name)
2727
self.logger = client.logger(name)
2828

29-
def send(self, record, message):
30-
"""Overrides transport.send(). record is the LogRecord
31-
the handler was called with, message is the message from LogRecord
32-
after being formatted by associated log formatters.
33-
34-
:type record: :class:`logging.LogRecord`
35-
:param record: Python log record
36-
37-
:type message: str
38-
:param message: The formatted log message
29+
def send(self, kwargs):
30+
"""Overrides transport.send(). kwargs is the dictionary
31+
with keyword arguments which will be passed to
32+
:method:`gcloud.logging.Logger.log_struct()`.
33+
34+
:type kwargs: dict
35+
:param kwargs: {'info': ..., 'severity': ...} - keyword arguments
36+
passed to :method:`gcloud.logging.Logger.log_struct()`.
3937
"""
40-
self.logger.log_struct({"message": message,
41-
"python_logger": record.name},
42-
severity=record.levelname)
38+
self.logger.log_struct(**kwargs)

0 commit comments

Comments
 (0)