Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions logging_json/README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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.
34 changes: 33 additions & 1 deletion logging_json/json_log.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

import logging
import os
import sys
import threading
import uuid

Expand Down Expand Up @@ -38,7 +39,38 @@ def add_fields(self, log_record, record, message_dict):
"%(asctime)s %(pid)s %(levelname)s %(dbname)s %(name)s: %(message)s"
)
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
Expand Down