Skip to content

Latest commit

 

History

History
218 lines (191 loc) · 4.85 KB

15.日志.md

File metadata and controls

218 lines (191 loc) · 4.85 KB

日志实现

  • 抽象类
<?php 

namespace extend;

use extend\log\LogLevel;

/**
 * Class ILog
 * @package extend
 * User Jiang Haiqiang
 */
abstract class ILog
{
    /**
     * @var IFormatter
     * @author Jiang Haiqiang
     * @email  jhq0113@163.com
     */
    public $format = [];

    /**
     * 系统不可用
     *
     * @param string $message
     * @param array $context
     * @return null
     */
    public function emergency($message, array $context = array())
    {
        return $this->log(LogLevel::EMERGENCY,$message,$context);
    }

    /**
     *  **必须** 立刻采取行动
     *
     * 例如:在整个网站都垮掉了、数据库不可用了或者其他的情况下, **应该** 发送一条警报短信把你叫醒。
     *
     * @param string $message
     * @param array $context
     * @return null
     */
    public function alert($message, array $context = array())
    {
        return $this->log(LogLevel::ALERT,$message,$context);
    }

    /**
     * 紧急情况
     *
     * 例如:程序组件不可用或者出现非预期的异常。
     *
     * @param string $message
     * @param array $context
     * @return null
     */
    public function critical($message, array $context = array())
    {
        return $this->log(LogLevel::CRITICAL,$message,$context);
    }

    /**
     * 运行时出现的错误,不需要立刻采取行动,但必须记录下来以备检测。
     *
     * @param string $message
     * @param array $context
     * @return null
     */
    public function error($message, array $context = array())
    {
        return $this->log(LogLevel::ERROR,$message,$context);
    }

    /**
     * 出现非错误性的异常。
     *
     * 例如:使用了被弃用的API、错误地使用了API或者非预想的不必要错误。
     *
     * @param string $message
     * @param array $context
     * @return null
     */
    public function warning($message, array $context = array())
    {
        return $this->log(LogLevel::WARNING,$message,$context);
    }

    /**
     * 一般性重要的事件。
     *
     * @param string $message
     * @param array $context
     * @return null
     */
    public function notice($message, array $context = array())
    {
        return $this->log(LogLevel::NOTICE,$message,$context);
    }

    /**
     * 重要事件
     *
     * 例如:用户登录和SQL记录。
     *
     * @param string $message
     * @param array $context
     * @return null
     */
    public function info($message, array $context = array())
    {
        return $this->log(LogLevel::INFO,$message,$context);
    }

    /**
     * debug 详情
     *
     * @param string $message
     * @param array $context
     * @return null
     */
    public function debug($message, array $context = array())
    {
        return $this->log(LogLevel::DEBUG,$message,$context);
    }

    /**
     * 任意等级的日志记录
     *
     * @param mixed $level
     * @param string $message
     * @param array $context
     * @return null
     */
    abstract public function log($level, $message, array $context = array());
}
?>
  • 实现类
<?php
 namespace extend\log;
 
 use extend\Di;
 use extend\formatter\Json;
 use extend\helpers\HttpHelper;
 use extend\helpers\StringHelper;
 use extend\ILog;
 
 /**
  * Class File
  * @package extend\log
  * User Jiang Haiqiang
  */
 class File extends ILog
 {
     /**
      * @var string
      * @author Jiang Haiqiang
      * @email  jhq0113@163.com
      */
     public $fileName;
 
     /**
      * @var int
      * @author Jiang Haiqiang
      * @email  jhq0113@163.com
      */
     public $mode=0755;
 
     /**
      * @param mixed $level
      * @param string $message
      * @param array $context
      * @return null|void
      * @author Jiang Haiqiang
      * @email  jhq0113@163.com
      */
     public function log($level, $message, array $context = array())
     {
         // TODO: Implement log() method.
         $dir = dirname($this->fileName);
 
         if(!is_dir($dir)) {
             mkdir($dir,$this->mode,true);
         }
 
         $message = StringHelper::interpolate($message,$context);
 
         $data = [
             'message'  => $message,
             'level'    => $level,
             'datetime' => date('Y-m-d H:i:s'),
             'clientIp' => HttpHelper::getClientIp()
         ];
 
         $file = @fopen($this->fileName,'a');
 
         if($file) {
             $this->format = Di::insure($this->format,Json::class);
 
             @fwrite($file,$this->format->convert($data).PHP_EOL);
             @chmod($this->fileName,$this->mode);
             @fclose($file);
         }
     }
 }
 ?>