65 lines
2.0 KiB
Python
Executable File
65 lines
2.0 KiB
Python
Executable File
# -*- coding: utf-8 -*-
|
|
# (C) 2020 Smile (<http://www.smile.fr>)
|
|
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
|
|
|
import logging
|
|
|
|
from odoo import registry
|
|
|
|
|
|
class SmileDBHandler(logging.Handler):
|
|
|
|
def __init__(self, level=logging.NOTSET):
|
|
logging.Handler.__init__(self, level)
|
|
self._dbname_to_cr = {}
|
|
|
|
def _get_cursor(self, dbname):
|
|
cr = self._dbname_to_cr.get(dbname)
|
|
if not cr or (cr and cr.closed):
|
|
cr = registry(dbname).cursor()
|
|
cr.autocommit(True)
|
|
self._dbname_to_cr[dbname] = cr
|
|
return cr
|
|
|
|
def emit(self, record):
|
|
if not (record.args and isinstance(record.args, dict)):
|
|
return False
|
|
|
|
dbname = record.args.get('dbname', '')
|
|
cr = self._get_cursor(dbname)
|
|
|
|
res_id = record.args.get('res_id', 0)
|
|
pid = record.args.get('pid', 0)
|
|
uid = record.args.get('uid', 0)
|
|
model_name = record.args.get('model_name', '')
|
|
|
|
request = """INSERT INTO smile_log
|
|
(log_date, log_uid, model_name, res_id, pid, level, message)
|
|
VALUES (now() at time zone 'UTC', %s, %s, %s, %s, %s, %s)"""
|
|
params = (uid, model_name, res_id, pid, record.levelname, record.msg,)
|
|
|
|
try:
|
|
cr.execute(request, params)
|
|
except Exception:
|
|
# retry
|
|
cr = self._get_cursor(dbname)
|
|
cr.execute(request, params)
|
|
return True
|
|
|
|
def close(self):
|
|
logging.Handler.close(self)
|
|
for cr in self._dbname_to_cr.values():
|
|
try:
|
|
cr.execute(
|
|
"INSERT INTO smile_log "
|
|
"(log_date, log_uid, model_name, "
|
|
"res_id, pid, level, message) "
|
|
"VALUES (now() at time zone 'UTC', 0, '', "
|
|
"0, 0, 'INFO', 'Odoo server stopped')")
|
|
finally:
|
|
cr.close()
|
|
self._dbname_to_cr = {}
|
|
|
|
|
|
logging.getLogger('smile_log').addHandler(SmileDBHandler())
|