可在thinkphp中通过monolog集成邮件告警:先用composer安装monolog和swiftmailer,再配置nativemailerhandler或swiftmailerhandler发送错误邮件,结合rotatingfilehandler实现本地归档与远程通知双通道,并在异常处理器report()方法中统一注入。

如果您在ThinkPHP项目中希望实现错误发生时自动发送邮件告警,Monolog可作为独立日志处理组件接入,替代或扩展原生Log类行为。以下是配置Monolog实现邮件报警的具体步骤:
一、安装Monolog并引入依赖
Monolog需通过Composer安装,并确保项目能正确加载其命名空间。该方式不依赖ThinkPHP内置日志通道,具备更高自由度与兼容性。
1、在项目根目录执行命令安装Monolog:composer require monolog/monolog
2、确认vendor/autoload.php已在入口文件(如public/index.php)中被引入。
3、在需要触发告警的逻辑位置(例如全局异常处理器),手动实例化Monolog Logger对象。
二、配置NativeMailerHandler发送错误邮件
NativeMailerHandler是Monolog原生支持的邮件处理器,适用于轻量级告警场景,无需额外邮件驱动,直接调用PHP mail() 函数。
1、确保服务器已配置可用的SMTP服务或本地sendmail路径,且mail()函数可正常执行。
2、在异常捕获处添加如下代码片段:
$logger = new \Monolog\Logger('error_alert');
$handler = new \Monolog\Handler\NativeMailerHandler('admin@example.com', 'ThinkPHP错误告警', 'noreply@example.com');
$handler->setLevel(\Monolog\Logger::ERROR);
$logger->pushHandler($handler);
$logger->error('接口异常:' . $e->getMessage(), ['file' => $e->getFile(), 'line' => $e->getLine()]);
三、集成SwiftMailerHandler增强邮件可靠性
SwiftMailerHandler依赖Swift Mailer库,支持SMTP认证、SSL/TLS加密及附件等高级功能,适合生产环境稳定投递。
1、执行命令安装Swift Mailer:composer require swiftmailer/swiftmailer
2、构建SMTP传输实例,指定主机、端口、用户名与密码:
$transport = (new \Swift_SmtpTransport('smtp.example.com', 587))->setUsername('user@example.com')->setPassword('app_password');
3、创建邮件处理器并绑定到Logger:
$mailer = new \Swift_Mailer($transport);
$handler = new \Monolog\Handler\SwiftMailerHandler($mailer, (new \Swift_Message())->setSubject('[TP8 ERROR] 错误告警')->setFrom(['noreply@example.com' => 'ThinkPHP系统']), \Monolog\Logger::ERROR);
$logger->pushHandler($handler);
四、通过RotatingFileHandler同步落盘并触发邮件
为兼顾可追溯性与实时性,可将RotatingFileHandler与邮件处理器共存于同一Logger实例,实现“本地归档+远程通知”双通道。
1、添加轮转文件处理器,按日期分割日志:
$fileHandler = new \Monolog\Handler\RotatingFileHandler('/runtime/logs/monolog_error.log', 0, \Monolog\Logger::ERROR);
2、设置日志格式为标准结构化内容:
$formatter = new \Monolog\Formatter\LineFormatter(null, null, true, true); $fileHandler->setFormatter($formatter);
3、将文件处理器与邮件处理器同时推入Logger:
$logger->pushHandler($fileHandler); $logger->pushHandler($handler);
五、在ThinkPHP异常处理器中统一注入
为避免重复初始化,推荐在app/exception/Handle.php的report()方法中完成Monolog实例化与错误分发。
1、在report()方法开头判断异常级别是否达到告警阈值:
if ($exception instanceof \Exception && in_array(get_class($exception), ['ErrorException', 'ParseError', 'TypeError'])) {
2、复用已配置好的Monolog实例(建议单例模式或静态属性缓存):
self::$monologLogger ??= self::buildMonologLogger();
3、调用error()方法记录完整上下文:
self::$monologLogger->error($exception->getMessage(), ['trace' => $exception->getTraceAsString(), 'uri' => $_SERVER['REQUEST_URI'] ?? 'CLI']);
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











