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 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`` ``logging_json`` in the ``--load`` flag or in the ``server_wide_modules``
option in the configuration file. 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.
+33 -1
View File
@@ -3,6 +3,7 @@
import logging import logging
import os import os
import sys
import threading import threading
import uuid import uuid
@@ -38,7 +39,38 @@ if is_true(os.environ.get("ODOO_LOGGING_JSON")):
"%(asctime)s %(pid)s %(levelname)s %(dbname)s %(name)s: %(message)s" "%(asctime)s %(pid)s %(levelname)s %(dbname)s %(name)s: %(message)s"
) )
formatter = OdooJsonFormatter(formatted_message) formatter = OdooJsonFormatter(formatted_message)
logging.getLogger().handlers[0].formatter = formatter
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
# monkey patch Request constructor to store request_uuid # monkey patch Request constructor to store request_uuid