def emit(self, record): """Actually log the specified logging record. Overrides the default emit behavior of ``StreamHandler``. See https://docs.python.org/2/library/logging.html#handler-objects Args: record (logging.LogRecord): The record to be logged. """ message = super(AppEngineHandler, self).format(record) inferred_http, inferred_trace, _, _ = get_request_data() if inferred_trace is not None: inferred_trace = f"projects/{self.project_id}/traces/{inferred_trace}" # allow user overrides trace = getattr(record, "trace", inferred_trace) span_id = getattr(record, "span_id", None) http_request = getattr(record, "http_request", inferred_http) resource = getattr(record, "resource", self.resource) user_labels = getattr(record, "labels", {}) # merge labels gae_labels = self.get_gae_labels() gae_labels.update(user_labels) # send off request self.transport.send( record, message, resource=resource, labels=gae_labels, trace=trace, span_id=span_id, http_request=http_request, )
def filter(self, record): """ Add new Cloud Logging data to each LogRecord as it comes in """ user_labels = getattr(record, "labels", {}) # infer request data from the environment inferred_http, inferred_trace, inferred_span = get_request_data() if inferred_http is not None: # filter inferred_http to include only well-supported fields inferred_http = { k: v for (k, v) in inferred_http.items() if k in self._supported_http_fields and v is not None } if inferred_trace is not None and self.project is not None: # add full path for detected trace inferred_trace = f"projects/{self.project}/traces/{inferred_trace}" # set new record values record._resource = getattr(record, "resource", None) record._trace = getattr(record, "trace", inferred_trace) or None record._span_id = getattr(record, "span_id", inferred_span) or None record._http_request = getattr(record, "http_request", inferred_http) record._source_location = CloudLoggingFilter._infer_source_location( record) record._labels = {**self.default_labels, **user_labels} or None # create string representations for structured logging record._trace_str = record._trace or "" record._span_id_str = record._span_id or "" record._http_request_str = json.dumps(record._http_request or {}) record._source_location_str = json.dumps(record._source_location or {}) record._labels_str = json.dumps(record._labels or {}) # break quotes for parsing through structured logging record._msg_str = str(record.msg).replace('"', '\\"') if record.msg else "" return True
def get_gae_labels(self): """Return the labels for GAE app. If the trace ID can be detected, it will be included as a label. Currently, no other labels are included. Returns: dict: Labels for GAE app. """ gae_labels = {} _, trace_id, _, _ = get_request_data() if trace_id is not None: gae_labels[_TRACE_ID_LABEL] = trace_id return gae_labels
def filter(self, record): """ Add new Cloud Logging data to each LogRecord as it comes in """ user_labels = getattr(record, "labels", {}) # infer request data from the environment ( inferred_http, inferred_trace, inferred_span, inferred_sampled, ) = get_request_data() if inferred_trace is not None and self.project is not None: # add full path for detected trace inferred_trace = f"projects/{self.project}/traces/{inferred_trace}" # set new record values record._resource = getattr(record, "resource", None) record._trace = getattr(record, "trace", inferred_trace) or None record._span_id = getattr(record, "span_id", inferred_span) or None record._trace_sampled = bool( getattr(record, "trace_sampled", inferred_sampled)) record._http_request = getattr(record, "http_request", inferred_http) record._source_location = CloudLoggingFilter._infer_source_location( record) # add logger name as a label if possible logger_label = {"python_logger": record.name} if record.name else {} record._labels = { **logger_label, **self.default_labels, **user_labels } or None # create string representations for structured logging record._trace_str = record._trace or "" record._span_id_str = record._span_id or "" record._trace_sampled_str = "true" if record._trace_sampled else "false" record._http_request_str = json.dumps(record._http_request or {}, ensure_ascii=False) record._source_location_str = json.dumps(record._source_location or {}, ensure_ascii=False) record._labels_str = json.dumps(record._labels or {}, ensure_ascii=False) return True
def _call_fut(): from google.cloud.logging_v2.handlers import _helpers return _helpers.get_request_data()
def _call_fut(): from google.cloud.logging_v2.handlers import _helpers http, trace, span, sampled = _helpers.get_request_data() return http, trace, span, sampled