diff --git a/yuthon_base/models/system_logs.py b/yuthon_base/models/system_logs.py
index a7c2a165d..3c51ee424 100644
--- a/yuthon_base/models/system_logs.py
+++ b/yuthon_base/models/system_logs.py
@@ -1,11 +1,51 @@
# -*- coding: utf-8 -*-
-from odoo import models, fields
+import logging
+from odoo import models, fields, api, SUPERUSER_ID
class SystemLogs(models.Model):
_name = 'system.logs'
_description = '系统日志'
+ _order = 'date desc'
name = fields.Char(string="标题")
- date = fields.Datetime(string="时间")
+ date = fields.Datetime(string="时间", default=fields.Datetime.now)
+ level = fields.Char(string="级别")
+ logger_name = fields.Char(string="来源")
content = fields.Text(string="内容")
+
+
+class OdooDBLogHandler(logging.Handler):
+ """将日志写入 system.logs 模型"""
+
+ def emit(self, record):
+ if record.levelno < logging.INFO:
+ return
+ try:
+ import odoo
+ db_name = getattr(odoo.tools.config, 'db_name', None)
+ if not db_name:
+ return
+ db = odoo.sql_db.db_connect(db_name)
+ with db.cursor() as cr:
+ env = api.Environment(cr, SUPERUSER_ID, {})
+ env['system.logs'].create({
+ 'name': record.getMessage()[:80] if record.getMessage() else '',
+ 'date': fields.Datetime.now(),
+ 'level': record.levelname,
+ 'logger_name': record.name,
+ 'content': record.getMessage(),
+ })
+ cr.commit()
+ except Exception:
+ pass
+
+
+# 注册 Handler(只注册一次)
+_handler_key = 'odoo_db_log_handler'
+_root_logger = logging.getLogger()
+if not any(getattr(h, 'name', None) == _handler_key for h in _root_logger.handlers):
+ handler = OdooDBLogHandler()
+ handler.name = _handler_key
+ handler.setLevel(logging.INFO)
+ _root_logger.addHandler(handler)
diff --git a/yuthon_base/views/system_logs_views.xml b/yuthon_base/views/system_logs_views.xml
index c0b0ff679..f410d74fd 100644
--- a/yuthon_base/views/system_logs_views.xml
+++ b/yuthon_base/views/system_logs_views.xml
@@ -4,17 +4,36 @@
系统日志
system.logs
tree
+ {'search_default_today': 1, 'group_by': 'logger_name'}
system.logs.tree
system.logs
-
-
+
-
+
+
+
+
+
+ system.logs.search
+ system.logs
+
+
+
+
+
+
+
+
+
+
+
+