如何在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
相关产品推荐
相关产品推荐

