In this tutorial we will try to send email using custom logger
First of all we need to create a channel for our custom log in config/logging.php
'channels' => [
'email' => [
'driver' => 'custom',
'via' => \App\Logging\CustomLogger::class
],
],
Once you have configured the custom driver channel, you're ready to define the class that will create your Monolog instance. This class only needs a single __invoke method which should return the Monolog logger instance. The method will receive the channels configuration array as its only argument:
Next we need to create out custom logger and handler. I create a new directory under app called Logging and in there I have CustomLogger.php
<?php
namespace App\Logging;
use Monolog\Logger;
class CustomLogger
{
/**
* Create a custom Monolog instance.
*/
public function __invoke(array $config): Logger
{
return new Logger(
env('APP_NAME'),
[
new CustomLoggerHandler(),
]
);
}
}
and CustomLoggerHandler.php
<?php
namespace App\Logging;
use Monolog\Handler\AbstractProcessingHandler;
use Snowfire\Beautymail\BeautymailFacade;
class CustomLoggerHandler extends AbstractProcessingHandler
{
public function write(array $record)
{
BeautymailFacade::send('emails.my_mail', ['record' => $record], function ($message) {
$message->from('privacy@gmail.com')
->to("hello@gmail.com")
->subject("Email Log");
});
\Log::info("yoyo");
\Log::info($record['message']);
\Log::info(json_encode($record));
\Log::info("yoyo");
}
}
Now we need a blade file for email. Lett's create a blade file inside resources/views/emails/my_mail.blade.php
<html>
<head>
<!-- Your title goes here -->
<title>Email</title>
<!-- End title -->
</head>
<!-- You can change background colour here -->
<body style="text-align: center; margin: 0; padding-top: 10px; padding-bottom: 10px; padding-left: 0; padding-right: 0; -webkit-text-size-adjust: 100%;background-color: #f2f4f6; color: #000000" align="center">
<!-- Fallback force center content -->
<div style="text-align: center;">
<h1> {{$record['message']}} </h2>
</div>
</body>
</html>
That's it. Now I can call. For testing purpose I am using api route.
Route::get('/test-email-log', function () {
Log::channel('email')->info('Bug');
});
For more information check
https://laravel.com/docs/10.x/logging#monolog-channel-customization
https://laracasts.com/discuss/channels/laravel/logging-to-mattermost-custom-driver
Thanks