-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsetup_structured_logging.py
More file actions
39 lines (32 loc) · 1.41 KB
/
setup_structured_logging.py
File metadata and controls
39 lines (32 loc) · 1.41 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import logging
from datetime import datetime
from typing import Optional
from opentelemetry.instrumentation.logging import LoggingInstrumentor
from pythonjsonlogger.json import JsonFormatter as PyJsonFormatter
# We override JsonFormatter.formatTime() instead of using the datefmt strftime parameter
# because it does not support microsecond precision.
# [START opentelemetry_instrumentation_setup_logging]
class JsonFormatter(PyJsonFormatter):
def formatTime(self, record: logging.LogRecord, datefmt: Optional[str] = None):
# Format the timestamp as RFC 3339 with microsecond precision
isoformat = datetime.fromtimestamp(record.created).isoformat()
return f"{isoformat}Z"
def setup_structured_logging() -> None:
LoggingInstrumentor().instrument()
log_handler = logging.StreamHandler()
formatter = JsonFormatter(
"%(asctime)s %(levelname)s $(component) %(message)s %(otelTraceID)s %(otelSpanID)s %(otelTraceSampled)s",
rename_fields={
"levelname": "severity",
"asctime": "timestamp",
"component": "type",
"otelTraceID": "logging.googleapis.com/trace",
"otelSpanID": "logging.googleapis.com/spanId",
"otelTraceSampled": "logging.googleapis.com/trace_sampled",
},
)
log_handler.setFormatter(formatter)
logging.basicConfig(
level=logging.INFO,
handlers=[log_handler],
)