Symfony Custom Monolog Handler

By | 29 August 2017

Custom handler yazarak loglama işlemini soyutlamak istiyorum. Yani Monolog sınıfından instance alıp, log yazdırdığımda ben ne işlem yapmak istiyorsam, o şekilde çalışmasını istiyorum. Benim senaryomda log oluşturulduğunda bunu alıp, Guzzle ile http isteği atarak, Google Cloud Logging servisine yazması. Google Cloud tarafında Google Cloud Functions var ve Http Request ile tetikleniyor, tek yapmam gereken buraya belli bir formatta post isteği atarak, yazdırmak. Bunun için öncelikle Symfony içindeki config.yml dosyasını aşağıdaki gibi satırları ekliyorum.

 

monolog:
    channels: [custom_channel]   # log atarken bunları kategorilendirebiliyoruz, channel ile custom adında kategori oluşturdum.
    handlers:    # handler tanımlanan yer
        custom:   # custom adında handler set ediyorum.
            type: service   # service sınıfından oluşuyor.
            channels: [custom_channel]   #custom channel'i kullanıyor. bunu kod içinde alıp kullanacağız
            id: custom.handler   # services.yml içindeki servisin adı

Konfigürasyoumuzu yaptıktan sonra servis sınıfımızı aşağıdaki gibi services.yml dosyası içinde tanımlıyoruz.

custom.handler:
    class: AppBundle\Service\CustomHandler
    arguments: ["@http_client"]

Burada argüman olarak attığımız http_client sınıfı Guzzle Client oluyor ve bununla birlikte Http Request işlemlerimizi gerçekleştireceğiz. Service dizini içinde CustomHandler sınıfımızı oluşturuyoruz ve aşağıdaki gibi düzenliyoruz.

class Custom Handler extends AbstractProcessingHandler {
    private $client;
    private $host = "https://us-central1-mertblog-monitor.cloudfunctions.net/publish";

    public function __construct(Client $client){
        parent::__construct();
        $this->client = $client;
    }

    protected function write (array $record) {
        $postData = [
          'form_params' => [
          'project' => 'mertblog',
          'data' => $record['message'],
          'level' => $record['level_name']
        ];
        $this->send($postData);
    }

    public function send ($postData = NULL) {
        $this->client->post($this->host, $postData);
    }
}

Burada Monolog ile bir log yazıldığında write methoduna düşüyor ve $record array’i içindeki verileri alarak http request işlemi gerçekleştiriyoruz.

Aşağıda da kullanım örneğini görebilirsiniz;

$this->get('monolog.logger.custom_channel')->info('It is info log.');

$this->get('monolog.logger.custom_channel')->alert('ALERT!', array('https://mertblog.net'));

Bu yazıda anlatacaklarım şimdilik bu kadar, bir dahaki yazımda görüşmek üzere… 🙂

Leave a Reply

Your email address will not be published. Required fields are marked *

*