最近的项目使用了 阿里云的日志服务,感觉挺好用,SDK接入照着官方sdk里面的DEMO,简单顺利接入。核心代码就个函数。 ?
private function getObj($topic='TestTopic'){
//通过使用相同参数调用工厂方法来创建相同的记录器实例
return \Aliyun_Log_LoggerFactory::getLogger(self::$client, $this->project, $this->logstore,env('APP_ENV','dev').'_'.$topic);
}
public function install_log($logMap,$topics,$auto=0){
$anotherLogger = $this->getObj($topics);
switch ($logMap['logLevel']){
case 'info':
$anotherLogger->infoArray($logMap);
break;
case 'debug':
$anotherLogger->debugArray($logMap);
break;
case 'warn':
$anotherLogger->warnArray($logMap);
break;
case 'error':
$anotherLogger->errorArray($logMap);
break;
default:
$anotherLogger->infoArray($logMap);
break;
}
}
?本来正常使用了一段时间,最近新增加了一个topic主题。 确发现经常提交不到日志服务里面。最可恨的不是每次都提交不了,有时候能成功。在找bug的时候走了很多弯路,最后才发现原来日志写入的sdk是有缓存的。让人狠的牙痒痒。
在 Sdk/aliyun-log/Aliyun/Log/SimpleLogger.php? 这个文件的里面构造函数里面。可以看到每次提交的写入都会先写入到内存队列里面,每个topic一个队列,缓存提交需要达到三个条件,队列超过100行,内存256Kb,或者5秒钟,都会触发缓存提交。或者触发析构函数这个类里面的__destruct函数也会所有topic的缓存队列全部提交。本人的项目是hyperf2.1框架,基于swoole的持久生命周期的,所以无法触发析构函数。如果是php-fpm模式起始根本不需要操心这些在php生命周期结束的时候日志会自动提交。而且我的新业务topic频率极低导致很久才能触发缓存提交。 如果你想每次都及时提交缓存 可以手动触发 $anotherLogger->logFlush(); 这样就可以了。
在这里记录下这个自己平过的坑,愿后来者都能绕过这个坑。
|