Bir yazılım projesinin olmazsa olmaz yapı taşlarından birisi Error ve Bug Tracker’dir (hata izleyicileridir). Geliştirdiğiniz bir Symfony2 web projesindeki hata bildirimlerini loglamak, soket servislerine ve bildirim sunucularına rapor göndermek için Monolog kütüphanesini kullanabilirsiniz.
Symfony2 ile default vendor (varsayılan) olarak gelen Monolog kütüphanesini diğer PHP projelerinde kullanmak için composer paket yöneticisini kullanıp doğrudan kurabilirsiniz.
Örnek Senaryo:
Yazılım projemizde 400 ve 500 serisi bir hata aldığımız zaman (401, 403, 404, 500 vs.) bunu istediğiniz bir dizindeki .log dosyasında depolasın ve özel bir formatta belirttiğimiz e-posta adresine iletsin. Bu log dosyasında -eğer oturum açıldıysa- oturum açan kullanıcı hakkında ek bilgiler de yer alsın.
Not: Oturum açan kullanıcının bilgisine ulaşmak için Symfony2 projenizde FOSUserBundle kurulu olmalı ve oturum açmış olmalısınız.
1. Adım: config_prod.yml (Geliştirme aşamasında config_dev.yml’ı kullanmalısınız.)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
monolog: handlers: main: type: stream path: "%kernel.logs_dir%/hata.log" level: error formatter: monolog.formatter.session_request grouped: type: group members: [buffered] buffered: type: buffer handler: swift swift: type: swift_mailer from_email: bildirim@bugrayuksel.com to_email: feedback@bugrayuksel.com subject: Hata Bildirimi level: error content_type: text/html formatter: monolog.formatter.html |
2. Adım: config.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
services: # Monolog mesajı satır formatı monolog.formatter.session_request: class: Monolog\Formatter\LineFormatter arguments: - "[%%datetime%%] [%%extra.token%%] %%channel%%.%%level_name%%: %%message%% %%context%% %%extra%%\n" # Her isteğin sonuna session bilgisi ekleme monolog.processor.session_request: class: AppBundle\Controller\SessionRequestProcessor arguments: ["@session", "@security.token_storage"] tags: - { name: monolog.processor, method: processRecord } monolog.formatter.html: class: Monolog\Formatter\HtmlFormatter |
3. Adım: AppBundle/Controller/SessionRequestProcessor.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
<?php /** * Created by PhpStorm. * User: bugrayuksel * Date: 05/11/15 * Time: 18:37 */ namespace AppBundle\Controller; use Symfony\Component\HttpFoundation\Session\Session; use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface; use AppBundle\Entity\User; class SessionRequestProcessor { private $session; private $token; private $tokenStorage; public function __construct(Session $session, TokenStorageInterface $tokenStorage) { $this->session = $session; $this->tokenStorage = $tokenStorage; } public function processRecord(array $record) { if (null === $this->token) { try { $this->token = substr($this->session->getId(), 0, 8); } catch (\RuntimeException $e) { $this->token = '????????'; } $this->token .= '-' . substr(uniqid(), -8); } if ($this->tokenStorage->getToken()) { $user = $this->tokenStorage->getToken()->getUser(); if ($user instanceof User) { $record['extra']['kullanici'] = [ 'id' => $user->getId(), 'username' => $user->getUsername(), 'email' => $user->getEmail(), 'roles' => $user->getRoles() ]; } } $record['extra']['token'] = $this->token; return $record; } } |
4. Adım: parameters.yml (Swift Mailer ile e-posta gönderimi için)
1 2 3 4 5 |
mailer_transport: smtp mailer_host: mail.bugrayuksel.com mailer_user: bildirim@bugrayuksel.com mailer_password: *************** encryption: ssl |
5. Adım: config.yml (Swift Mailer ile e-posta gönderimi için)
1 2 3 4 5 6 7 8 9 |
# Swiftmailer Configuration swiftmailer: transport: "%mailer_transport%" host: "%mailer_host%" username: "%mailer_user%" password: "%mailer_password%" encryption: ssl auth_mode: login # spool: { type: memory } |
6. Adım: Bir hata yapın!
Her şey yolunda gittiyse belirttiğiniz dizine bir “hata.log” dosyası oluşmuş olacak ve e-posta kutunuzda yeni bir “Hata Bildirimi” göreceksiniz.
Hata bildirim seviyelerini (level) şöyle sıralayabiliriz:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
DEBUG (100): Detaylı debug bilgisi. INFO (200): Bilgilendirme olayları. (Kullanıcı giriş yaptı, SQL sorgusu çalıştı vb.) NOTICE (250): Normal fakat kayda değer olaylar. WARNING (300): Hata olmayan olağanüstü durumlar. ERROR (400): Çalışma zamanı hataları. Yetki yetersiz, sayfa bulunamadı, kötü istek vb. CRITICAL (500): Kriter durumlar, iç sunucu hataları. ALERT (550): Web sitesi çalışmayı durdurdu, veritabanı servis dışı vs. EMERGENCY (600): Acil: Sistem servis dışı. |
Ek olarak Monolog ile elde ettiğiniz hataları log dosyasına yazdığınız gibi:
- Redis, MongoDB, MySQL platformlarında da depolayabilirsiniz,
- AMQB gibi kuyruk protokolllerine gönderebilirsiniz (rabbitmq),
- HipChat, PushOver, Growl gibi yazılım ve servislere entegre edebilirsiniz.
Faydalı olması dileğiyle.
Kaynaklar: