Context
Python logging provides useful facilities to inject arbitrary contextual information into log records. I.e. the core logger's methods like debug, info, etc. can be provided with an optional parameter called extra. Reference to the doc. There are also more sophisticated techniques. It sounds extremely useful given stackdriver is quite friendly to structured data.
Problem
Unfortunately, google.cloud.logging.handlers.CloudLoggingHandler (or, strictly saying, underlying transports) disregards whatever is passed in extra parameter and sends further only message. Code reference 1 and 2. This is quite sad since log_struct does let us pass arbitrary structured entries.
Proposed solution
Although a bit hacky, it would probably be the easiest to pass the whole __dict__ of LogRecord object to log_struct here. I mean smth. like this:
self.batch.log_struct(record.__dict__, severity=record.levelname)
A property called message will automatically be there as well (LogRecord attributes).
Ideally, such useful log_struct's parameters as labels, insert_id, etc. should be recognized as well.
self.batch.log_struct(
record.__dict__,
severity=record.levelname,
labels=getattr(record, 'labels', None),
insert_id=getattr(record, 'insert_id', None)
)
Context
Python logging provides useful facilities to inject arbitrary contextual information into log records. I.e. the core logger's methods like
debug,info, etc. can be provided with an optional parameter calledextra. Reference to the doc. There are also more sophisticated techniques. It sounds extremely useful given stackdriver is quite friendly to structured data.Problem
Unfortunately,
google.cloud.logging.handlers.CloudLoggingHandler(or, strictly saying, underlying transports) disregards whatever is passed inextraparameter and sends further onlymessage. Code reference 1 and 2. This is quite sad sincelog_structdoes let us pass arbitrary structured entries.Proposed solution
Although a bit hacky, it would probably be the easiest to pass the whole
__dict__ofLogRecordobject tolog_structhere. I mean smth. like this:A property called
messagewill automatically be there as well (LogRecord attributes).Ideally, such useful
log_struct's parameters aslabels,insert_id, etc. should be recognized as well.