diff --git a/opentelemetry-exporter-gcp-logging/src/opentelemetry/exporter/cloud_logging/__init__.py b/opentelemetry-exporter-gcp-logging/src/opentelemetry/exporter/cloud_logging/__init__.py index d1094f7c..51e5d003 100644 --- a/opentelemetry-exporter-gcp-logging/src/opentelemetry/exporter/cloud_logging/__init__.py +++ b/opentelemetry-exporter-gcp-logging/src/opentelemetry/exporter/cloud_logging/__init__.py @@ -140,7 +140,9 @@ def __init__( project_id: Optional[str] = None, default_log_name: Optional[str] = None, client: Optional[LoggingServiceV2Client] = None, + route_logs_to_stdout_as_json: bool = False, ): + self.route_logs_to_stdout_as_json = route_logs_to_stdout_as_json self.project_id: str if not project_id: _, default_project_id = google.auth.default() @@ -151,13 +153,18 @@ def __init__( self.default_log_name = default_log_name else: self.default_log_name = "otel_python_inprocess_log_name_temp" - self.client = client or LoggingServiceV2Client( - transport=LoggingServiceV2GrpcTransport( - channel=LoggingServiceV2GrpcTransport.create_channel( - options=_OPTIONS, + if route_logs_to_stdout_as_json and client: + raise Exception( + "Cannot route logs to stdout and set a logging client to send logs to." + ) + if not route_logs_to_stdout_as_json: + self.client = client or LoggingServiceV2Client( + transport=LoggingServiceV2GrpcTransport( + channel=LoggingServiceV2GrpcTransport.create_channel( + options=_OPTIONS, + ) ) ) - ) def export(self, batch: Sequence[LogData]): now = datetime.datetime.now() @@ -215,11 +222,15 @@ def export(self, batch: Sequence[LogData]): for k, v in attributes.items() } _set_payload_in_log_entry(log_entry, log_record.body) - log_entries.append(log_entry) + if self.route_logs_to_stdout_as_json: + print(LogEntry.to_json(log_entry)) + else: + log_entries.append(log_entry) - self._write_log_entries(log_entries) + if not self.route_logs_to_stdout_as_json: + self._write_log_entries_to_cloud_logging(log_entries) - def _write_log_entries(self, log_entries: list[LogEntry]): + def _write_log_entries_to_cloud_logging(self, log_entries: list[LogEntry]): batch: list[LogEntry] = [] batch_byte_size = 0 for entry in log_entries: diff --git a/opentelemetry-exporter-gcp-logging/tests/test_cloud_logging.py b/opentelemetry-exporter-gcp-logging/tests/test_cloud_logging.py index da1012e4..78279352 100644 --- a/opentelemetry-exporter-gcp-logging/tests/test_cloud_logging.py +++ b/opentelemetry-exporter-gcp-logging/tests/test_cloud_logging.py @@ -67,6 +67,30 @@ def test_too_large_log_raises_warning(caplog) -> None: ) +def test_logs_printed_to_stdout_as_json(capsys) -> None: + exporter = CloudLoggingExporter( + project_id=PROJECT_ID, route_logs_to_stdout_as_json=True + ) + exporter.export( + [ + LogData( + log_record=LogRecord( + body="abc", + resource=Resource({}), + attributes={str(i): "i" * 5 for i in range(5)}, + ), + instrumentation_scope=InstrumentationScope("test"), + ) + ] + ) + stdout = capsys.readouterr().out + assert ( + '"logName": "projects/fakeproject/logs/otel_python_inprocess_log_name_temp"' + in stdout + ) + assert '"textPayload": "abc"' in stdout + + def test_convert_otlp_dict_body( cloudloggingfake: CloudLoggingFake, snapshot_writelogentrycalls: List[WriteLogEntriesCall],