logging_json: enhance logging output by splitting levels into stdout and stderr

This commit is contained in:
Andrés Zacchino
2025-09-24 15:24:46 +00:00
committed by Iván Todorovich
parent 9b31b7c235
commit 1d68c883a7
2 changed files with 37 additions and 1 deletions
+4
View File
@@ -12,3 +12,7 @@ The json logging is activated with the environment variable
In order to have the logs from the start of the server, you should add
``logging_json`` in the ``--load`` flag or in the ``server_wide_modules``
option in the configuration file.
You can split the logs in stderr and stdout with the environment variable
``ODOO_LOGGING_JSON_STDERR`` set to ``1``. In this case, the logs with a level
of WARNING or above will be sent to stderr, the others to stdout.
+32
View File
@@ -3,6 +3,7 @@
import logging
import os
import sys
import threading
import uuid
@@ -38,6 +39,37 @@ if is_true(os.environ.get("ODOO_LOGGING_JSON")):
"%(asctime)s %(pid)s %(levelname)s %(dbname)s %(name)s: %(message)s"
)
formatter = OdooJsonFormatter(formatted_message)
if is_true(os.environ.get("ODOO_LOGGING_JSON_STDERR")):
class MaxLevelFilter(logging.Filter):
def __init__(self, max_level):
self.max_level = max_level
def filter(self, record):
return record.levelno < self.max_level
# keep the original level
root_logger = logging.getLogger()
original_level = root_logger.level
# Split lower levels into stdout
stdout_handler = logging.StreamHandler(sys.stdout)
stdout_handler.setLevel(logging.NOTSET)
stdout_handler.addFilter(MaxLevelFilter(logging.WARNING))
stdout_handler.setFormatter(formatter)
# Split WARNING and upper into stderr
stderr_handler = logging.StreamHandler(sys.stderr)
stderr_handler.setLevel(logging.WARNING)
stderr_handler.setFormatter(formatter)
# Replace handlers
root_logger.handlers = []
root_logger.setLevel(original_level)
root_logger.addHandler(stdout_handler)
root_logger.addHandler(stderr_handler)
else:
logging.getLogger().handlers[0].formatter = formatter