1
# -*- encoding: utf-8 -*-
2
##############################################################################
4
# OpenERP, Open Source Management Solution
5
# Copyright (C) 2011 Smile (<http://www.smile.fr>). All Rights Reserved
7
# This program is free software: you can redistribute it and/or modify
8
# it under the terms of the GNU General Public License as published by
9
# the Free Software Foundation, either version 3 of the License, or
10
# (at your option) any later version.
12
# This program is distributed in the hope that it will be useful,
13
# but WITHOUT ANY WARRANTY; without even the implied warranty of
14
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
# GNU General Public License for more details.
17
# You should have received a copy of the GNU General Public License
18
# along with this program. If not, see <http://www.gnu.org/licenses/>.
20
##############################################################################
30
class SmileExportDBHandler(logging.Handler):
32
def __init__(self, level=logging.NOTSET):
33
logging.Handler.__init__(self, level)
34
self._dbname_to_cr = {}
36
def emit(self, record):
37
dbname = getattr(threading.currentThread(), 'dbname', '')
38
db, pool = pooler.get_db_and_pool(dbname, update_module=tools.config['init'] or tools.config['update'], pooljobs=False)
39
cr = self._dbname_to_cr.get(dbname, False)
41
cr = self._dbname_to_cr[dbname] = db.cursor()
42
export_id = record.args and isinstance(record.args, dict) and record.args.get('export_id', False) or False
43
uid = record.args and isinstance(record.args, dict) and record.args.get('uid', False) or False
45
if uid and pool.get('res.users').exists(cr, 1, uid):
46
pool.get('ir.model.export.log').create(cr, uid, {
47
'export_id': export_id,
48
'level': record.levelname,
49
'message': record.msg,
52
cr.execute("INSERT INTO ir_model_export_log (create_date, export_id, level, message) VALUES (now(), %s, %s, %s)",
60
logging.Handler.close(self)
61
for cr in self._dbname_to_cr.values():
63
self._dbname_to_cr = {}
65
logger = logging.getLogger("smile_export")
66
handler = SmileExportDBHandler()
67
logger.addHandler(handler)
69
def add_timing(original_method):
70
def new_method(self, msg):
71
delay = datetime.datetime.now() - self.export_start
72
msg += " after %sh %smin %ss" % tuple(str(delay).split(':'))
73
return original_method(self, msg)
76
def add_trace(original_method):
77
def new_method(self, msg):
78
stack = traceback.format_exc()
80
return original_method(self, msg)
83
class SmileExportLogger():
85
def __init__(self, uid, export_id):
86
assert isinstance(uid, (int, long)), 'uid should be an integer'
87
self.logger = logging.getLogger("smile_export")
89
self.export_id = export_id
90
self.export_start = datetime.datetime.now()
91
self.logger_args = {'export_id': self.export_id, 'uid': self.uid}
94
self.logger.debug(msg, self.logger_args)
97
self.logger.info(msg, self.logger_args)
99
def warning(self, msg):
100
self.logger.warning(msg, self.logger_args)
103
self.logger.log(msg, self.logger_args)
106
def error(self, msg):
107
self.logger.error(msg, self.logger_args)
110
def critical(self, msg):
111
self.logger.critical(msg, self.logger_args)
114
def exception(self, msg):
115
self.logger.exception(msg, self.logger_args)
118
def time_info(self, msg):
119
self.logger.info(msg, self.logger_args)
122
def time_debug(self, msg):
123
self.logger.debug(msg, self.logger_args)