同福

做个web框架(16)——日志对象TFLog(二)日志模块的实现【20201112】

介绍

介绍

今天福哥将带着大家完成日志对象TFLog的逻辑部分,这个TFLog对象的逻辑相对比较简单。首先通过系统配置设置日志保存路径、日志文件名称、日志格式等等。然后建立不同级别的专用方法用来保存这个级别的日志信息。最复杂的莫过于解析日志格式带入环境参数这一节了,要使用正则表达式进行模式匹配替换。最后就是通过写入文件的函数将解析过的日志信息存入指定日志文件里面就可以了。

代码

TFLog

属性

const T_TRACE = 1;
const T_DEBUG = 2;
const T_INFO = 3;
const T_WARN = 4;
const T_ERROR = 5;
const T_ALL = 10;
const T_OFF = 0;

makeLog

private function makeLog(int $logLevel, string $msg){
    $this->currLogLevel = $logLevel;
    $this->currMsg = $msg;
    $newMsg = preg_replace_callback("/\%\{([^\}]*)\}/", function ($mats){
        switch ($mats[1]){
            case "c":
                return "class";
            case "f":
                return "function";
            case "m":
                return $_SERVER['REQUEST_METHOD'];
            case "ru":
                return $_SERVER['REQUEST_URI'];
            case "ua":
                return $_SERVER['HTTP_USER_AGENT'];
            case "level":
                return $this->levelID2Label($this->currLogLevel);
            case "msg":
                return $this->currMsg;
            default:
                if(substr($mats[1], 0, 5) == "time:"){
                    return date(substr($mats[1], 5));
                }
                break;
        }

        return "";
    }, $this->logFormat);

    return $newMsg;
}

saveLog

protected function saveLog(int $logLevel, string $msg){
    file_put_contents($this->logFilePath, $this->makeLog($logLevel, $msg). $this->CRLF, FILE_APPEND);
}

debug

public function debug(string $msg){
    if($this->systemLogLevel >= TFLog::T_DEBUG){
        $this->saveLog(TFLog::T_DEBUG, $msg);
    }
}

trace

public function trace(string $msg){
    if($this->systemLogLevel >= TFLog::T_TRACE){
        $this->saveLog(TFLog::T_TRACE, $msg);
    }
}

info

public function info(string $msg){
    if($this->systemLogLevel >= TFLog::T_INFO){
        $this->saveLog(TFLog::T_INFO, $msg);
    }
}

warn

public function warn(string $msg){
    if($this->systemLogLevel >= TFLog::T_WARN){
        $this->saveLog(TFLog::T_WARN, $msg);
    }
}

error

public function error(string $msg){
    if($this->systemLogLevel >= TFLog::T_ERROR){
        $this->saveLog(TFLog::T_ERROR, $msg);
    }
}

getDefault

public static function getDefault():TFLog {

    return TFLog::get('default');
}

get

public static function get(string $key):TFLog {
    if(TFLog::$logs[$key] == null){
        TFLog::$logs[$key] = new TFLog();
    }

    return TFLog::$logs[$key];
}

讲解

TFLog

属性

我们通过常量设置了各个日志级别对应的数字。

makeLog

这个方法是用来根据日志格式解析日志信息的,里面还有一些“变量”没有实现对应的解析,我们一步一步来,不要着急哦!

saveLog

这个方法很简单,就是使用file_put_contents函数将makeLog方法返回的日志信息保存到日志文件里。

debug

这个是记录debug级别的日志的方法。

trace

这个是记录trace级别的日志的方法。

info

这个是记录info级别的日志的方法。

warn

这个是记录warn级别的日志的方法。

error

这个是记录error级别的日志的方法。

getDefault

获取默认的日志对象的实例,如果没有初始化过就立即初始化。

get

获取指定的日志对象的实例,如果没有实例化过就立即实例化。

使用

我们在index控制器里写入两天日志,一个是Error级别的,一个是Info级别的。

859496e76c78fed8.jpg

然后我们打开日志文件查看写入的日志信息,看看是不是我们想要的样式。

4a17358696139672.jpg

大家应该发现了这里的“class:function”没有替换成调用日志的函数名称以及所属对象名称,这个福哥以后带着童鞋们慢慢完善了。

总结

今天童鞋们跟着福哥完成了日志对象TFLog的功能的开发,现在我们的TFPHP支持日志记录了。目前我们的TFPHP已经可以满足一般情况下的项目开发的需要了,我们可以着手设计开发我们的第一个基于TFPHP框架的项目——用户管理系统了。

惊不惊喜?紧不紧张?刺不刺激?

到此为止,TFPHP框架的课程将暂时告一段落,我们会开启新篇章——做个用户管理系统的课程。之前福哥也说过,框架的开发是需要实际的项目进行实践的检验的,所以在项目开发过程中我们会不断地完善TFPHP框架的内容。

童鞋们加油哦~~