任何框架都必须有Log类,咱们也不能免俗。我决定了,写日志要用异步写文件swoole_async_writefile ,介绍看官网 https://wiki.swoole.com/wiki/page/185.html。用法很简单,和file_put_contents很相似。
Log类,必须具备的几个特性,可以记录你想记录的日志,便于调试,不同类型的日志区分存储,最好是分时存储。咱们就照着这个目标来写它。当然了,我还是要用单例模式来写,并且写的还是很简单。
首先,我们给它一些配置信息,比如,规定要存储的日志类型,存储位置等信息,还有一个,因为我们是在终端开发和调试,我们最好还要控制它是否回显到屏幕。。
首先打开frame.base.php ,增加define('LOG_PATH',dirname (__DIR__).'/logs/');//Logs路径
打开config/app.php,在它的下边增加如下代码
//日志
'log' => [
//输出到屏幕,当 set.daemonize = false 时,该配置生效,
'echo' => 0 ,
// 日志保存目录
'path' => LOG_PATH,
// 日志记录级别,共8个级别
'level' => ['EMERGENCY','ALERT','CRITICAL','ERROR','WARNING','NOTICE','INFO','DEBUG','SQL'] ,
] ,
创建frame/Lib/Log.php,贴代码
<?php
/**
* 日志
*/
namespace Piz;
class Log
{
/**
* 实例
* @var object
*/
private static $instance ;
/**
* 配置参数
* @var array
*/
private static $config = [] ;
private function __construct ()
{
}
public static function get_instance(){
if(is_null (self::$instance)){
self::$config = Config::get_instance ()->get('app.log');
self::$instance = new self();
}
return self::$instance;
}
/**
* 写入日志
* @param $type
* @param array ...$msg
*/
public function write($type,...$logs){
$type = strtoupper ($type);
$msg = "{$type} \t ".date("Y-m-d h:i:s")." \t ".join (" \t ",$logs);
if( !in_array($type,self::$config['level'])) return false;
if(self::$config['echo']){
echo $msg,PHP_EOL;
}
$this->save($type,$msg);
}
public function save($type,$msg){
if (empty(self::$logs)) return false;
$dir_path = LOG_PATH.date('Ymd').DIRECTORY_SEPARATOR;
!is_dir($dir_path) && mkdir($dir_path,0777);
$filename = date("h").'.'.$type.'.log';
swoole_async_writefile($dir_path.$filename , $msg, NULL, FILE_APPEND);
return true;
}
}
为了便于操作,必须在frame/helper.php下暴露一个简单的调用方法,代码如下
/**
* 写入日志
* @param $type EMERGENCY,ALERT,CRITICAL,ERROR,WARNING,NOTICE,INFO,DEBUG
* @param array ...$log 标量参数,可多个
*/
function logs($type,...$log){
get_instance('\Piz\Log')->write($type,...$log);
}
现在它可以用了,无论在哪个位置,都可以用了,在框架内,我建议用长方法Log::get_instance()->write('XXX','XX','XXX')
,在项目中建议使用logs('xxxx','xx','xx')
小伙伴们请求意Log::get_instance()->write($type,...$logs)
,后面的 ...$logs 它是一个标量,关于PHP7的标量说明,请看官网 http://php.net/manual/zh/migration70.new-features.php。
小伙伴们可以在任何需要调用它的位置来记录日志了。
我试着启动运行并用ab压测了一下,QPS怎么只有1K多,这离我设定的10K的目标差太多了。。。。
什么情况,这一切的背后, 是人性的扭曲还是道德的沦丧?
请看下一期,优化Log,拉高性能。。
代码已上传到码云。。https://gitee.com/pizzzz/piz.git