I want to print out root logs in logfmt
format. structlog
also should print logs in the same format. I tried this example for JSON format and looks like it doesn’t work with logfmt
.
Here is a first try:
import logging
import sys
import logfmter
import structlog
handler = logging.StreamHandler(sys.stdout)
handler.setFormatter(logfmter.Logfmter())
root_logger = logging.getLogger()
root_logger.addHandler(handler)
structlog.get_logger("test").warning("hello")
logging.getLogger("test").warning("hello")
It prints:
2024-06-04 22:11:01 [warning ] hello
at=WARNING msg=hello
Here is structlog
is definitely not a logfmt
formatted.
I tried to add logfmt
render then:
import logging
import sys
import logfmter
import structlog
handler = logging.StreamHandler(sys.stdout)
handler.setFormatter(logfmter.Logfmter())
root_logger = logging.getLogger()
root_logger.addHandler(handler)
structlog.configure(
processors=[
structlog.stdlib.filter_by_level,
structlog.stdlib.add_logger_name,
structlog.stdlib.add_log_level,
structlog.stdlib.PositionalArgumentsFormatter(),
structlog.processors.TimeStamper(fmt='iso'),
structlog.processors.StackInfoRenderer(),
structlog.processors.format_exc_info,
# ADD LOGFMT RENDER
structlog.processors.LogfmtRenderer(),
],
logger_factory=structlog.stdlib.LoggerFactory(),
wrapper_class=structlog.stdlib.BoundLogger,
cache_logger_on_first_use=True,
)
structlog.get_logger("test").warning("hello")
logging.getLogger("test").warning("hello")
And fail again:
at=WARNING msg="event=hello logger=test level=warning timestamp=2024-06-04T13:12:54.637931Z"
at=WARNING msg=hello
Obviously correct log line should be like:
at=WARNING msg=hello logger=test level=warning timestamp=2024-06-04T13:12:54.637931Z
Is it possible to format both structlog
and logging
as logfmt
?