Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Question?. Strange behavior using Logtail in Queues with Laravel. #11

Open
bashman opened this issue Apr 14, 2023 · 3 comments
Open

Question?. Strange behavior using Logtail in Queues with Laravel. #11

bashman opened this issue Apr 14, 2023 · 3 comments

Comments

@bashman
Copy link

bashman commented Apr 14, 2023

I am using Laravel 10 and for logs delivery I am using queues. The log system works fine, for example if I run it from a command, or a controller:

$logger = new Logger('mychannel);
$logger->pushHandler(new LogtailHandler('xxxx'));
$logger->info('message', $array_data);

To improve the user experience, I decided to use queues for log management:

<?php

namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldBeUnique;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;

use Monolog\Logger;
use Logtail\Monolog\LogtailHandler;

class LogJob implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    /**
     * Create a new job instance.
     */
    public function __construct(
        public string $channel,
        public string $level,
        public string $message,
        public array $data
    ) {
    }

    /**
     * Execute the job.
     */
    public function handle(): void
    {

        if ($this->channel == 'ychannel') {
            $logger = new Logger($this->channel);
            $logger->pushHandler(new LogtailHandler('dddd'));
        }

        if ($this->channel == 'xchanel') {
            $logger = new Logger($this->channel);
            $logger->pushHandler(new LogtailHandler('zxy'));
        }

        if ($this->level == 'INFO') {
            $logger->info($this->message, $this->data);
        }

        if ($this->level == 'ERROR') {
            $logger->error($this->message, $this->data);
        }

        if ($this->level == 'WARNING') {
            $logger->warning($this->message, $this->data);
        }

    }
}


// dispatch a log on los queue
 LogJob::dispatch('ychannel', 'INFO', 'User Added now',
             ['data' => ['email' => 'xx@xx.com', 'country_id' => 456], ])->onQueue('log_queue');

The queue runs correctly, but the logs do not be delivered to the logtail server.
Looking at how the queue works, it seems that the queue finishes the job first, before monolog finishes sending the log.

monolog-logtail 3.0 
php 8.2
Laravel 10.x

Any tips on how to handle this situation?

@mabar
Copy link

mabar commented Apr 17, 2023

That's because logs are written in batch and buffer automatically writes only when php terminates on end of the request.
You can you synchronous handler, but better solution is to call Monolog\Logger->reset() when logs should be written.
It may make sense to add this feature even into Laravel queing system internally, to reset logger after each message

@curusarn
Copy link
Contributor

Hi @bashman,

Thank you for reaching out.

Does calling Monolog\Logger->reset() flush the logs and resolve the issue?
I will be happy to look into this more if the problem persists.

Let me know if I can help you to resolve this. 🙏

Thanks again for raising this!

@michaelrimbach
Copy link

I had the same issue, changing the handler to "synchronous handler" fixed it.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants