如何在Monolog触发ERROR级别日志时通过PHPMailer发送邮件
在Monolog中通过SMTP服务器发送ERROR级别日志邮件的解决方案
我明白你现在的需求——项目里Monolog日志正常工作,但只想在触发ERROR级别(及更高级别,比如CRITICAL、ALERT)时通过自己的SMTP服务器发送告警邮件,之前用NativeMailHandler没成功,那咱们直接用Monolog自带的SmtpHandler来搞定,这完全适配你的SMTP服务器配置,稳定性也更高。
第一步:安装必要依赖
如果你的项目用Composer管理,首先要根据Monolog版本安装对应的邮件依赖:
- 若使用Monolog 2.x及以上版本,安装
symfony/mailer:composer require symfony/mailer - 若使用Monolog 1.x版本,安装
swiftmailer/swiftmailer:composer require swiftmailer/swiftmailer
第二步:配置SmtpHandler并关联到Logger
直接上可运行的代码示例,把你的SMTP服务器信息填进去即可,同时我们会明确设置只触发ERROR级别的日志:
use Monolog\Logger; use Monolog\Handler\SmtpHandler; use Symfony\Component\Mailer\Transport; use Symfony\Component\Mime\Email; // 初始化你的Logger实例 $logger = new Logger('my_app_logger'); // 配置SMTP传输(替换成你的服务器信息) // 格式:smtp://用户名:密码@SMTP主机:端口?encryption=tls(如果需要加密的话) $dsn = 'smtp://your_smtp_username:your_smtp_password@smtp.yourdomain.com:587?encryption=tls'; $transport = Transport::fromDsn($dsn); // 构建邮件模板 $email = (new Email()) ->from('app-alerts@yourdomain.com') // 发件人邮箱 ->to('your-notification-email@example.com') // 收件人邮箱 ->subject('【重要】应用触发ERROR级别告警'); // 邮件主题 // 初始化SmtpHandler,设置仅处理ERROR及以上级别日志 $smtpHandler = new SmtpHandler( $transport, $email, Logger::ERROR // 关键:只有级别≥ERROR的日志才会触发邮件 ); // 将Handler添加到Logger $logger->pushHandler($smtpHandler); // 测试验证: $logger->debug('这条调试日志不会触发邮件'); // DEBUG级别低于ERROR,不会发邮件 $logger->error('数据库连接失败,无法加载用户数据'); // ERROR级别,会发送告警邮件
关键细节说明
- 日志级别控制:
Logger::ERROR表示只有ERROR、CRITICAL、ALERT、EMERGENCY这些高级别日志才会触发邮件,完美匹配你“仅ERROR级别及以上”的需求。 - SMTP配置灵活性:如果你的SMTP服务器用SSL加密(端口465),可以把DSN改成
smtps://username:password@smtp.yourdomain.com:465;如果不需要加密,直接去掉?encryption=tls即可。 - 为什么放弃NativeMailHandler:NativeMailHandler依赖PHP内置的
mail()函数,这个函数经常受服务器php.ini配置限制(比如sendmail路径、禁用函数等),容易出现发送失败的情况。而SmtpHandler直接对接SMTP服务器,更可控也更稳定,完全符合你想用自有SMTP的需求。
额外优化:自定义邮件内容格式
如果你想让邮件内容更详细(比如包含日志时间、上下文信息、堆栈追踪),可以给SmtpHandler添加HTML格式化器:
use Monolog\Formatter\HtmlFormatter; // 创建HTML格式化器,让邮件内容更清晰易读 $formatter = new HtmlFormatter(); $smtpHandler->setFormatter($formatter);
这样收到的邮件会是HTML格式,包含完整的日志详情,方便你快速定位问题。
内容的提问来源于stack exchange,提问作者Steven
相关产品推荐
相关产品推荐

