日志处理
Logger
在easyswoole3.2.3版本之后,easyswoole的默认日志处理类分离成了组件形式,组件地址:https://github.com/easy-swoole/log
自定义日志
首先要定义好一个日志模板,需要继承并实现\EasySwoole\Log\LoggerInterface,如下:
<?php/*** Created by PhpStorm.* User: root* Date: 19-11-13* Time: 上午11:00*/namespace App\Logger;use EasySwoole\Log\LoggerInterface;class Logger implements LoggerInterface{function log(?string $msg, int $logLevel = self::LOG_LEVEL_INFO, string $category = 'DEBUG'): string{// TODO: Implement log() method.$date = date('Y-m-d H:i:s');$levelStr = $this->levelMap($logLevel);$filePath = EASYSWOOLE_LOG_DIR."/".date('Y-m-d').".log";$str = "[{$date}][{$category}][{$levelStr}] : [{$msg}]\n";file_put_contents($filePath,"{$str}",FILE_APPEND|LOCK_EX);return $str;}function console(?string $msg, int $logLevel = self::LOG_LEVEL_INFO, string $category = 'DEBUG'){// TODO: Implement console() method.$date = date('Y-m-d H:i:s');$levelStr = $this->levelMap($logLevel);$temp = $this->colorString("[{$date}][{$category}][{$levelStr}] : [{$msg}]",$logLevel)."\n";fwrite(STDOUT,$temp);}private function colorString(string $str,int $logLevel){switch($logLevel) {case self::LOG_LEVEL_INFO:$out = "[42m";break;case self::LOG_LEVEL_NOTICE:$out = "[43m";break;case self::LOG_LEVEL_WARNING:$out = "[45m";break;case self::LOG_LEVEL_ERROR:$out = "[41m";break;default:$out = "[42m";break;}return chr(27) . "$out" . "{$str}" . chr(27) . "[0m";}private function levelMap(int $level){switch ($level){case self::LOG_LEVEL_INFO:return 'INFO';case self::LOG_LEVEL_NOTICE:return 'NOTICE';case self::LOG_LEVEL_WARNING:return 'WARNING';case self::LOG_LEVEL_ERROR:return 'ERROR';default:return 'UNKNOWN';}}}
在EasySwooleEvent 中的 initialize 方法注入自定义日志处理, 如下:
public static function initialize(){// TODO: Implement initialize() method.Di::getInstance()->set(SysConst::LOGGER_HANDLER, new \App\Logger\Logger());}
logger调用方法
use use EasySwoole\EasySwoole\Logger;Logger::getInstance()->log('log level info',Logger::LOG_LEVEL_INFO,'DEBUG');//记录info级别日志//例子后面2个参数默认值Logger::getInstance()->log('log level notice',Logger::LOG_LEVEL_NOTICE,'DEBUG2');//记录notice级别日志//例子后面2个参数默认值Logger::getInstance()->console('console',Logger::LOG_LEVEL_INFO,'DEBUG');//记录info级别日志并输出到控制台Logger::getInstance()->info('log level info');//记录info级别日志并输出到控制台Logger::getInstance()->notice('log level notice');//记录notice级别日志并输出到控制台Logger::getInstance()->waring('log level waring');//记录waring级别日志并输出到控制台Logger::getInstance()->error('log level error');//记录error级别日志并输出到控制台Logger::getInstance()->onLog()->set('myHook',function ($msg,$logLevel,$category){//增加日志写入之后的回调函数});
::: warning 注意,在非框架中使用,例如是单元测试脚本,请执行 EasySwoole\EasySwoole\Core::getInstance()->initialize(); 用于初始化日志 :::
将输出/记录以下内容:
[2019-06-01 21:10:25][DEBUG][INFO] : [1][2019-06-01 21:10:25][DEBUG][INFO] : [2][2019-06-01 21:10:25][DEBUG][INFO] : [3][2019-06-01 21:10:25][DEBUG][NOTICE] : [4][2019-06-01 21:10:25][DEBUG][WARNING] : [5][2019-06-01 21:10:25][DEBUG][ERROR] : [6][2019-06-01 21:23:27][DEBUG][INFO] : [log level info][2019-06-01 21:23:27][DEBUG2][NOTICE] : [log level notice][2019-06-01 21:23:27][DEBUG][INFO] : [console][2019-06-01 21:23:27][DEBUG][INFO] : [log level info][2019-06-01 21:23:27][DEBUG][NOTICE] : [log level notice][2019-06-01 21:23:27][DEBUG][WARNING] : [log level waring][2019-06-01 21:23:27][DEBUG][ERROR] : [log level error]
::: warning
在新版logger处理方案中,新增了 LOG_LEVEL_INFO = 1,LOG_LEVEL_NOTICE = 2,LOG_LEVEL_WARNING = 3,LOG_LEVEL_ERROR = 4,4个日志等级,有助于更好的区分日志
:::
Trigger
\EasySwoole\EasySwoole\Trigger触发器,用于主动触发错误或者异常而不中断程序继续执行。
在easyswoole3.2.3版本之后,easyswoole的默认Trigger类分离成了组件形式,组件地址:https://github.com/easy-swoole/trigger
例如在控制器的onException中,我们可以记录错误异常,然后输出其他内容,不让系统终端运行,不让用户发觉真实错误.
use EasySwoole\EasySwoole\Trigger;//记录错误异常日志,等级为ExceptionTrigger::getInstance()->throwable($throwable);//记录错误信息,等级为FatalErrorTrigger::getInstance()->error($throwable->getMessage().'666');Trigger::getInstance()->onError()->set('myHook',function (){//当发生error时新增回调函数});Trigger::getInstance()->onException()->set('myHook',function (){});
日志中心
比如,会有想把数据往日志中心推送,或者是最TCP日志推送,那么,可以新增onLog回调,然后把日志信息,推送到日志中心。
