Tiny Logger PHP

Log4php を使うほどではない場合の、簡単な PHP class。

<?php
namespace Tiny;

use \Exception as Exception;
use \DateTime as DateTime;

class Logger {
  public $loglevel;
  public $path;
  public $filename;

  public function __construct(string $level, string $path, string $filename) {
    if (! $level) {
      throw new Exception('ログレベルが設定されていません。');
    }
    if (! $this->loglevel_exists($level)) {
      throw new Exception('存在しないログレベルが設定されています。');
    }
    if (! $path) {
      throw new Exception('出力パスが設定されていません。');
    }
    if (! $filename) {
      throw new Exception('出力ファイル名が設定されていません。');
    }
    if (! file_exists($path)) {
      throw new Exception('出力パスが存在しません。');
    }
    $this->loglevel = $this->loglevel_exists($level);
    $this->path = $path;
    $this->filename = $filename;
  }

  function loglevel_exists(string $level): int {
    $loglevel = [
      'ERROR' => 4,
      'WARN' => 3,
      'INFO' => 2,
      'DEBUG' => 1,
    ];
    if (array_key_exists($level, $loglevel)) {
      return $loglevel[$level];
    }
    return 0;
  }

  function output_log(string $level, $msg) {
    if ($this->loglevel > $this->loglevel_exists($level)) {
      return;
    }

    # 深さを固定
    $trace = debug_backtrace()[2];
    $files = explode('/', $trace['file']);
    $file = end($files);
    $line = $trace['line'];
    $func = $trace['function'];

    $d = new DateTime();

    $output_file = $this->path ."/" .$this->filename;
    # ログ インクリメント
    $dstr = "".$d->format('Y-m-d');
    $ftstr = "".date('Y-m-d', filemtime($output_file));
    if (strcmp($dstr, $ftstr) != 0) {
      $inc_file = $this->path ."/" .$ftstr ."_" .$this->filename;
      rename($output_file, $inc_file);
    }
    # ログ出力
    file_put_contents(
      $output_file,
      "time:" .$d->format('Y-m-d h:i:s')
        ."\t" ."file:" .$file
        ."\t" ."line:" .$line
        ."\t" ."func:" .$func
        ."\t" ."msg:" .$msg
        ."\n"
      ,
      FILE_APPEND | LOCK_EX
    );
  }

  public function debug($msg) {
    $level = 'DEBUG';
    $this->output_log($level, $msg);
  }

  public function info($msg) {
    $level = 'INFO';
    $this->output_log($level, $msg);
  }

  public function warn($msg) {
    $level = 'WARN';
    $this->output_log($level, $msg);
  }

  public function error($msg) {
    $level = 'ERROR';
    $this->output_log($level, $msg);
  }
}
?>