You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Odoo中添加自定义日志处理器及错误触发自定义事件?

嘿,这个思路完全可行!Odoo的日志系统本身就基于Python标准库的logging模块,所以你完全可以通过自定义Handler的方式,给错误日志绑定自定义动作(比如发送邮件),和你提到的logging.getLogger().addHandler()逻辑一致。下面给你详细拆解实现方式:

1. 自定义日志Handler

首先你需要写一个继承自logging.Handler的自定义类,重写emit()方法——这个方法就是日志触发时会执行的逻辑,你可以在这里实现发送邮件的功能。

import logging
from odoo import api, _

class ErrorAlertEmailHandler(logging.Handler):
    def emit(self, record):
        # 只处理ERROR及以上级别的日志,避免冗余邮件
        if record.levelno < logging.ERROR:
            return
        
        # 构建邮件内容,把日志信息格式化
        error_subject = _("Odoo Critical Error Alert")
        error_body = f"""
        <div style="font-family: Arial, sans-serif;">
            <h3>🚨 Odoo Error Occurred</h3>
            <p><strong>Error Message:</strong> {record.getMessage()}</p>
            <p><strong>Source Module:</strong> {record.name}</p>
            <p><strong>Error Level:</strong> {logging.getLevelName(record.levelno)}</p>
            <p><strong>Traceback:</strong><br>
            <pre style="background-color: #f5f5f5; padding: 10px; border-radius: 4px;">{record.exc_text or 'No traceback details available'}</pre>
            </p>
        </div>
        """
        
        # 用Odoo的邮件API发送邮件
        try:
            # 获取Odoo环境,用admin用户确保权限
            env = api.Environment(self._cr, 1, {})
            # 创建邮件记录并发送
            env['mail.mail'].create({
                'subject': error_subject,
                'body_html': error_body,
                'email_to': 'tech-support@yourcompany.com',  # 替换成你的接收邮箱
                'auto_delete': True,  # 发送后自动清理邮件记录
            }).send()
        except Exception as e:
            # 防止邮件发送失败触发新的日志循环,用独立的logger记录
            fallback_logger = logging.getLogger('odoo.error_alert_fallback')
            fallback_logger.error(f"Failed to send error alert email: {str(e)}")
2. 注册自定义Handler到Odoo日志器

接下来你需要在模块加载时,把这个自定义Handler添加到Odoo的日志器中——可以选择全局日志器(监听所有Odoo错误),或者只监听你的业务模块日志。

比如在模块的__init__.py里添加这段代码:

import logging
from .handlers import ErrorAlertEmailHandler

def setup_error_alert():
    # 获取Odoo全局日志器
    odoo_root_logger = logging.getLogger('odoo')
    
    # 避免重复添加同一个Handler(模块重载时会触发多次)
    for handler in odoo_root_logger.handlers:
        if isinstance(handler, ErrorAlertEmailHandler):
            return
    
    # 初始化自定义Handler并设置日志级别
    email_handler = ErrorAlertEmailHandler()
    email_handler.setLevel(logging.ERROR)
    
    # 添加到日志器
    odoo_root_logger.addHandler(email_handler)

# 模块加载时自动执行注册
setup_error_alert()
3. 关键注意事项
  • 依赖声明:确保你的模块在__manifest__.py中依赖mail模块,否则邮件API会无法使用:
    'depends': ['mail'],
    
  • 环境权限:发送邮件需要足够的权限,尽量用admin用户(ID=1)的环境来执行,避免权限不足的问题。
  • 避免日志循环:如果邮件发送失败,不要用同一个全局日志器记录错误,否则会触发无限循环,建议用独立的子日志器(比如上面的odoo.error_alert_fallback)。
  • 精准过滤:如果只需要监听特定模块的错误,把logging.getLogger('odoo')换成logging.getLogger('odoo.addons.your_module_name')即可。

这样一来,每当Odoo触发ERROR及以上级别的日志时,你的自定义Handler就会自动发送告警邮件啦!

内容的提问来源于stack exchange,提问作者StackUser

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:01:22