Files
session_redis_public/logging_json/json_log.py
Vincent Van Rossem 830727d925 [FIX] logging_json: no attribute 'JsonFormatter'
Fixes
```
Traceback (most recent call last):
  File "/odoo/src/odoo/modules/registry.py", line 110, in new
    odoo.modules.load_modules(registry, force_demo, status, update_module)
  File "/odoo/src/odoo/modules/loading.py", line 485, in load_modules
    processed_modules += load_marked_modules(env, graph,
  File "/odoo/src/odoo/modules/loading.py", line 366, in load_marked_modules
    loaded, processed = load_module_graph(
  File "/odoo/src/odoo/modules/loading.py", line 187, in load_module_graph
    load_openerp_module(package.name)
  File "/odoo/src/odoo/modules/module.py", line 395, in load_openerp_module
    __import__(qualname)
  File "/odoo/external-src/odoo-cloud-platform/logging_json/__init__.py", line 1, in <module>
    from . import json_log
  File "/odoo/external-src/odoo-cloud-platform/logging_json/json_log.py", line 32, in <module>
    class OdooJsonFormatter(jsonlogger.JsonFormatter):
AttributeError: 'NoneType' object has no attribute 'JsonFormatter'
2026-03-11 10:31:34,072 82 CRITICAL odoodb odoo.service.server: Failed to initialize database `odoodb`.
Traceback (most recent call last):
  File "/odoo/src/odoo/service/server.py", line 1374, in preload_registries
    registry = Registry.new(dbname, update_module=update_module)
  File "/usr/local/lib/python3.10/site-packages/decorator.py", line 232, in fun
    return caller(func, *(extras + args), **kw)
  File "/odoo/src/odoo/tools/func.py", line 87, in locked
    return func(inst, *args, **kwargs)
  File "/odoo/src/odoo/modules/registry.py", line 110, in new
    odoo.modules.load_modules(registry, force_demo, status, update_module)
  File "/odoo/src/odoo/modules/loading.py", line 485, in load_modules
    processed_modules += load_marked_modules(env, graph,
  File "/odoo/src/odoo/modules/loading.py", line 366, in load_marked_modules
    loaded, processed = load_module_graph(
  File "/odoo/src/odoo/modules/loading.py", line 187, in load_module_graph
    load_openerp_module(package.name)
  File "/odoo/src/odoo/modules/module.py", line 395, in load_openerp_module
    __import__(qualname)
  File "/odoo/external-src/odoo-cloud-platform/logging_json/__init__.py", line 1, in <module>
    from . import json_log
  File "/odoo/external-src/odoo-cloud-platform/logging_json/json_log.py", line 32, in <module>
    class OdooJsonFormatter(jsonlogger.JsonFormatter):
AttributeError: 'NoneType' object has no attribute 'JsonFormatter'
```

Inspired by https://github.com/nolar/kopf/pull/1149
2026-03-11 12:41:40 +01:00

59 lines
1.7 KiB
Python

# 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