İçeriğe geç →

SOLID VE PSR – 3 Logger Sınıfı Yazmak

Logger sınıfımızı yazarken psr -3 logger standartlarını göz önünde bulunduruyoruz ve FactoryDesignPattern’ı kullanıyoruz.

Structure

  • Factory/
    • Abstracts/
      • FactoryInterface.php
    • LoggerFactory.php
  • Level/
    • LogLevel.php
  • Logger/
    • Abstracts/
      • LoggerInterface.php
      • AbstractLogger.php
    • FileLogger.php
  • public
    • logs.log

GİTHUB

https://github.com/emexxRepo/PHPLogger

Kullanım

<?php
require 'vendor/autoload.php';
use MLogger\Logger\FileLogger;
use MLogger\Factory\LoggerFactory;

$logpath = __DIR__ . '/public/logs.log'; // Loglarımızın kaydedileceği dosya
$logger = (new LoggerFactory())->setLogger(new FileLogger); // LoggerFactory Aracılığı ile File Logger Sınıfımızı oluşturuyoruz
$logger->setPath($logpath); // pathimizi setliyoruz
$logger->emergency('User {username} created', ['username' => 'test']); // logumuzu oluşturuyoruz context parametresi boş geçilebilir

// result = User test created

LoggerInterface.php



// daha fazla detay için// https://www.php-fig.org/psr/psr-3/
namespace MLogger\Logger\Abstracts;
interface LoggerInterface{    public function emergency(string $message, array $context = []) : void;
    public function alert(string $message, array $context = []) : void;
    public function critical(string $message, array $context = []) : void;
    public function error(string $message, array $context = []) : void;
    public function warning(string $message, array $context = []) : void;
    public function notice(string $message, array $context = []) : void;
    public function info(string $message, array $context = []) : void;
    public function debug(string $message, array $context = []) : void;
    public function log(string $level, string $message, array $context = []) : void;}

LoggerInterface herhangi bir logger sınıfında bulunacak methodları zoraki kılar.


AbstractLogger.php

<?php

namespace MLogger\Logger\Abstracts;

abstract class AbstractLogger implements LoggerInterface
{
    
    protected $message = '';

    // context parametresinde verilen süslü parantezlerin içerisindeki keyi vale set ediyoruz
    protected function interpolate(string $message, array $context = []):string
    {
        $replace = [];
        if (empty($context)) {
            return $message;
        } else {
            foreach ($context as $key => $val) {
                if (!is_array($val) && (!is_object($val) || method_exists($val, '__toString'))) {
                    $replace['{' . $key . '}'] = $val;
                }
            }

            return strtr($message, $replace);
        }
    }

    // TARİH DÖNDÜRÜYORUZ
    protected function getDate() : string
    {
        return (new \DateTime('now'))->format('Y-m-d H:i:s');
    }

    // SAVE METHODUNU TÜM LOGGER SINIFLARINA ZORAKİ KILIYORUZ
    abstract protected function save(string $level) : void;
}

AbstractLogger sınıfı interpolate methodu aracılığı ile verilen mesaj parametresinde süslü paranterzlerle belirtilmiş {key} değerini $context dizisinden aldığı key=> value değerine set eder.

FileLogger.php

<?php

namespace MLogger\Logger;

use MLogger\Logger\Abstracts\AbstractLogger;
use MLogger\Level\LogLevel;

final class FileLogger extends AbstractLogger
{
    private $path = '';

    public function setPath(string $path)
    {
        // dosya varmı yokmu kontrol ediyoruz
        if (!file_exists($path)) {
            throw new \Exception('File Not Found !');
        }

        $this->path = $path;
    }

    public function emergency(string $message, array $context = []) : void
    {
        // aldığımız mesajı set ediyoruz
        $this->message = $this->interpolate($message, $context);
        // ve kayıt ediyoruz
        $this->save(LogLevel::EMERGENCY);
    }

    public function alert(string $message, array $context = []) : void
    {
        // aldığımız mesajı set ediyoruz
        $this->message = $this->interpolate($message, $context);
        // ve kayıt ediyoruz
        $this->save(LogLevel::EMERGENCY);
    }

    public function critical(string $message, array $context = []) : void
    {
        // aldığımız mesajı set ediyoruz
        $this->message = $this->interpolate($message, $context);
        // ve kayıt ediyoruz
        $this->save(LogLevel::EMERGENCY);
    }

    public function error(string $message, array $context = []) : void
    {
        // aldığımız mesajı set ediyoruz
        $this->message = $this->interpolate($message, $context);
        // ve kayıt ediyoruz
        $this->save(LogLevel::EMERGENCY);
    }

    public function warning(string $message, array $context = []) : void
    {
        // aldığımız mesajı set ediyoruz
        $this->message = $this->interpolate($message, $context);
        // ve kayıt ediyoruz
        $this->save(LogLevel::WARNING);
    }

    public function notice(string $message, array $context = []) : void
    {
        // aldığımız mesajı set ediyoruz
        $this->message = $this->interpolate($message, $context);
        // ve kayıt ediyoruz
        $this->save(LogLevel::NOTICE);
    }

    public function info(string $message, array $context = []) : void
    {
        // aldığımız mesajı set ediyoruz
        $this->message = $this->interpolate($message, $context);
        // ve kayıt ediyoruz
        $this->save(LogLevel::INFO);
    }

    public function debug(string $message, array $context = []) : void
    {
        // aldığımız mesajı set ediyoruz
        $this->message = $this->interpolate($message, $context);
        // ve kayıt ediyoruz
        $this->save(LogLevel::DEBUG);
    }

    public function log(string $level, string $message, array $context = []) : void
    {
        // aldığımız mesajı set ediyoruz
        $this->message = $this->interpolate($message, $context);
        // ve kayıt ediyoruz
        $this->save($level);
    }

    protected function save(string $level) : void
    {
        file_put_contents($this->path, $this->getDate() . ' ' . $this->message . ' ' . $level . PHP_EOL, FILE_APPEND);
    }
}

FileLogger Sınıfımız Dosyalarımıza log tutacağımız sınıftır AbstractLogger dan extend eder ve save methodu + bütün logger interface ‘i zoraki kılar böylelikle Bir DbLogger sınıfı yazmak istediğimizde AbstractLogger’dan extend ettirerek tüm interface deki methodları zoraki kılıyoruz

LoggerFactoryInterface.php

<?php

namespace MLogger\Factory\Abstracts;

use MLogger\Logger\Abstracts\LoggerInterface;

interface LoggerFactoryInterface
{
    //logger interface'i implement eden herhangi bir logger sınıfı
    public function setLogger(LoggerInterface $logger) : LoggerInterface;
}

LoggerFactoryInterface , LoggerFactory sınıfımıza setlogger methodunu zorunlu kılar

LoggerFactory.php

<?php

namespace MLogger\Factory;

use \MLogger\Factory\Abstracts\LoggerFactoryInterface;
use MLogger\Logger\Abstracts\LoggerInterface;

class LoggerFactory implements LoggerFactoryInterface
{
    public function setLogger(LoggerInterface $logger): LoggerInterface
    {
        return new $logger();
    }
}

LoggerFactory, LoggerInterfaceden implement etmiş Logger Sınıfımızı set eder.

LogLevel.php

<?php

namespace MLogger\Level;

class LogLevel
{
    //LOGLARIMIZIN LEVEL 'LARININ BULUNDUĞU SINIF
    const EMERGENCY = 'emergency';
    const ALERT = 'alert';
    const CRITICAL = 'critical';
    const ERROR = 'error';
    const WARNING = 'warning';
    const NOTICE = 'notice';
    const INFO = 'info';
    const DEBUG = 'debug';
}

LogLevel Sınıfı Loglarımızın seviyelerini belirler.

Public/logs.log

Loglarımızın tutulacağı dosya

Kategori: php

Yorumlar

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir