# Copyright 2016-2019 Camptocamp SA # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html) import logging import os import threading import uuid from odoo import http from .strtobool import strtobool _logger = logging.getLogger(__name__) # Module ``jsonlogger`` of package ``python-json-logger`` is deprecated since version # 3.1.0, keep it for backward compatibility try: # python-json-logger>=3.1.0 from pythonjsonlogger.json import JsonFormatter as _JsonFormatter except ImportError: # python-json-logger<3.1.0 from pythonjsonlogger.jsonlogger import ( JsonFormatter as _JsonFormatter, ) def is_true(strval): return bool(strtobool(strval or "0".lower())) class OdooJsonFormatter(_JsonFormatter): def add_fields(self, log_record, record, message_dict): record.pid = os.getpid() record.dbname = getattr(threading.currentThread(), "dbname", "?") record.request_id = getattr(threading.current_thread(), "request_uuid", None) record.uid = getattr(threading.current_thread(), "uid", None) _super = super() return _super.add_fields(log_record, record, message_dict) if is_true(os.environ.get("ODOO_LOGGING_JSON")): formatted_message = ( "%(asctime)s %(pid)s %(levelname)s %(dbname)s %(name)s: %(message)s" ) formatter = OdooJsonFormatter(formatted_message) logging.getLogger().handlers[0].formatter = formatter # monkey patch Request constructor to store request_uuid org_init = http.Request.__init__ def new_init(self, httprequest): org_init(self, httprequest) threading.current_thread().request_uuid = uuid.uuid4() http.Request.__init__ = new_init