You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
310 lines
8.9 KiB
PHP
310 lines
8.9 KiB
PHP
<?php
|
|
/**
|
|
* Copyright (C) Alibaba Cloud Computing
|
|
* All rights reserved
|
|
*/
|
|
|
|
/**
|
|
* Class Aliyun_Log_SimpleLogger
|
|
* a wrapper for submit log message to server, to avoid post log frequently, using a internal cache for messages
|
|
* When the count of messages reach the cache size, SimpleLogger will post the messages in bulk, and reset the cache accordingly.
|
|
*/
|
|
class Aliyun_Log_SimpleLogger{
|
|
|
|
/**
|
|
* internal cache for log messages
|
|
* @var array
|
|
*/
|
|
private $logItems = [];
|
|
|
|
/**
|
|
* max size of cached messages
|
|
* @var int
|
|
*/
|
|
private $maxCacheLog;
|
|
|
|
/**
|
|
* log topic field
|
|
* @var
|
|
*/
|
|
private $topic;
|
|
|
|
/**
|
|
* max time before logger post the cached messages
|
|
* @var int
|
|
*/
|
|
private $maxWaitTime;
|
|
|
|
/**
|
|
* previous time for posting log messages
|
|
* @var int
|
|
*/
|
|
private $previousLogTime;
|
|
|
|
/**
|
|
* max storage size for cached messages
|
|
* @var int
|
|
*/
|
|
private $maxCacheBytes;
|
|
|
|
/**
|
|
* messages storage size for cached messages
|
|
* @var int
|
|
*/
|
|
private $cacheBytes;
|
|
|
|
/**
|
|
* log client which was wrappered by this logger
|
|
* @var log
|
|
*/
|
|
private $client;
|
|
|
|
/**
|
|
* log project name
|
|
* @var the
|
|
*/
|
|
private $project;
|
|
|
|
/**
|
|
* logstore name
|
|
* @var the
|
|
*/
|
|
private $logstore;
|
|
|
|
/**
|
|
* Aliyun_Log_Models_LogBatch constructor.
|
|
* @param $client log client
|
|
* @param $project the corresponding project
|
|
* @param $logstore the logstore
|
|
* @param $topic
|
|
* @param null $maxCacheLog max log items limitation, by default it's 100
|
|
* @param null $maxWaitTime max thread waiting time, bydefault it's 5 seconds
|
|
*/
|
|
public function __construct($client, $project, $logstore, $topic, $maxCacheLog = null, $maxWaitTime = null, $maxCacheBytes = null)
|
|
{
|
|
if(NULL === $maxCacheLog || !is_integer($maxCacheLog)){
|
|
$this->maxCacheLog = 100;
|
|
}else{
|
|
$this->maxCacheLog = $maxCacheLog;
|
|
}
|
|
|
|
if(NULL === $maxCacheBytes || !is_integer($maxCacheBytes)){
|
|
$this->maxCacheBytes = 256 * 1024;
|
|
}else{
|
|
$this->maxCacheBytes = $maxCacheBytes;
|
|
}
|
|
|
|
if(NULL === $maxWaitTime || !is_integer($maxWaitTime)){
|
|
$this->maxWaitTime = 5;
|
|
}else{
|
|
$this->maxWaitTime = $maxWaitTime;
|
|
}
|
|
if($client == null || $project == null || $logstore == null){
|
|
throw new Exception('the input parameter is invalid! create SimpleLogger failed!');
|
|
}
|
|
$this->client = $client;
|
|
$this->project = $project;
|
|
$this->logstore = $logstore;
|
|
$this->topic = $topic;
|
|
$this->previousLogTime = time();
|
|
$this->cacheBytes = 0;
|
|
}
|
|
|
|
/**
|
|
* add logItem to cached array, and post the cached messages when cache reach the limitation
|
|
* @param $cur_time
|
|
* @param $logItem
|
|
*/
|
|
private function logItem($cur_time, $logItem){
|
|
array_push($this->logItems, $logItem);
|
|
if ($cur_time - $this->previousLogTime >= $this->maxWaitTime || sizeof($this->logItems) >= $this->maxCacheLog
|
|
|| $this->cacheBytes >= $this->maxCacheBytes)
|
|
{
|
|
$this->logBatch($this->logItems, $this->topic);
|
|
$this->logItems = [];
|
|
$this->previousLogTime = time();
|
|
$this->cacheBytes = 0;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* log single string message
|
|
* @param Aliyun_Log_Models_LogLevel_LogLevel $logLevel
|
|
* @param $logMessage
|
|
* @throws Exception
|
|
*/
|
|
private function logSingleMessage(Aliyun_Log_Models_LogLevel_LogLevel $logLevel, $logMessage){
|
|
if(is_array($logMessage)){
|
|
throw new Exception('array is not supported in this function, please use logArrayMessage!');
|
|
}
|
|
$cur_time = time();
|
|
$contents = array( // key-value pair
|
|
'time'=>date('m/d/Y h:i:s a', $cur_time),
|
|
'loglevel'=> Aliyun_Log_Models_LogLevel_LogLevel::getLevelStr($logLevel),
|
|
'msg'=>$logMessage
|
|
);
|
|
$this->cacheBytes += strlen($logMessage) + 32;
|
|
$logItem = new Aliyun_Log_Models_LogItem();
|
|
$logItem->setTime($cur_time);
|
|
$logItem->setContents($contents);
|
|
$this->logItem($cur_time, $logItem);
|
|
}
|
|
|
|
/**
|
|
* log array message
|
|
* @param Aliyun_Log_Models_LogLevel_LogLevel $logLevel
|
|
* @param $logMessage
|
|
* @throws Exception
|
|
*/
|
|
private function logArrayMessage(Aliyun_Log_Models_LogLevel_LogLevel $logLevel, $logMessage){
|
|
if(!is_array($logMessage)){
|
|
throw new Exception('input message is not array, please use logSingleMessage!');
|
|
}
|
|
$cur_time = time();
|
|
$contents = array( // key-value pair
|
|
'time'=>date('m/d/Y h:i:s a', $cur_time)
|
|
);
|
|
$contents['logLevel'] = Aliyun_Log_Models_LogLevel_LogLevel::getLevelStr($logLevel);
|
|
foreach ($logMessage as $key => $value)
|
|
{
|
|
$contents[$key] = $value;
|
|
$this->cacheBytes += strlen($key) + strlen($value);
|
|
}
|
|
$this->cacheBytes += 32;
|
|
$logItem = new Aliyun_Log_Models_LogItem();
|
|
$logItem->setTime($cur_time);
|
|
$logItem->setContents($contents);
|
|
$this->logItem($cur_time, $logItem);
|
|
}
|
|
|
|
/**
|
|
* submit string log message with info level
|
|
* @param $logMessage
|
|
*/
|
|
public function info( $logMessage){
|
|
$logLevel = Aliyun_Log_Models_LogLevel_LogLevel::getLevelInfo();
|
|
$this->logSingleMessage($logLevel, $logMessage);
|
|
}
|
|
|
|
/**
|
|
* submit string log message with debug level
|
|
* @param $logMessage
|
|
*/
|
|
public function debug($logMessage){
|
|
$logLevel = Aliyun_Log_Models_LogLevel_LogLevel::getLevelDebug();
|
|
$this->logSingleMessage($logLevel, $logMessage);
|
|
}
|
|
|
|
/**
|
|
* submit string log message with warn level
|
|
* @param $logMessage
|
|
*/
|
|
public function warn($logMessage){
|
|
$logLevel = Aliyun_Log_Models_LogLevel_LogLevel::getLevelWarn();
|
|
$this->logSingleMessage($logLevel, $logMessage);
|
|
}
|
|
|
|
/**
|
|
* submit string log message with error level
|
|
* @param $logMessage
|
|
*/
|
|
public function error($logMessage){
|
|
$logLevel = Aliyun_Log_Models_LogLevel_LogLevel::getLevelError();
|
|
$this->logSingleMessage($logLevel, $logMessage);
|
|
}
|
|
|
|
/**
|
|
* submit array log message with info level
|
|
* @param $logMessage
|
|
*/
|
|
public function infoArray($logMessage){
|
|
$logLevel = Aliyun_Log_Models_LogLevel_LogLevel::getLevelInfo();
|
|
$this->logArrayMessage($logLevel, $logMessage);
|
|
}
|
|
|
|
/**
|
|
* submit array log message with debug level
|
|
* @param $logMessage
|
|
*/
|
|
public function debugArray($logMessage){
|
|
$logLevel = Aliyun_Log_Models_LogLevel_LogLevel::getLevelDebug();
|
|
$this->logArrayMessage($logLevel, $logMessage);
|
|
}
|
|
|
|
/**
|
|
* submit array log message with warn level
|
|
* @param $logMessage
|
|
*/
|
|
public function warnArray($logMessage){
|
|
$logLevel = Aliyun_Log_Models_LogLevel_LogLevel::getLevelWarn();
|
|
$this->logArrayMessage($logLevel, $logMessage);
|
|
}
|
|
|
|
/**
|
|
* submit array log message with error level
|
|
* @param $logMessage
|
|
*/
|
|
public function errorArray( $logMessage){
|
|
$logLevel = Aliyun_Log_Models_LogLevel_LogLevel::getLevelError();
|
|
$this->logArrayMessage($logLevel, $logMessage);
|
|
}
|
|
|
|
/**
|
|
* get current machine IP
|
|
* @return string
|
|
*/
|
|
private function getLocalIp(){
|
|
$local_ip = getHostByName(php_uname('n'));
|
|
if(strlen($local_ip) == 0){
|
|
$local_ip = getHostByName(getHostName());
|
|
}
|
|
return $local_ip;
|
|
}
|
|
|
|
/**
|
|
* submit log messages in bulk
|
|
* @param $logItems
|
|
* @param $topic
|
|
*/
|
|
private function logBatch($logItems, $topic){
|
|
$ip = $this->getLocalIp();
|
|
$request = new Aliyun_Log_Models_PutLogsRequest($this->project, $this->logstore,
|
|
$topic, $ip, $logItems);
|
|
$error_exception = NULL;
|
|
for($i = 0 ; $i < 3 ; $i++)
|
|
{
|
|
try{
|
|
$response = $this->client->putLogs($request);
|
|
return;
|
|
} catch (Aliyun_Log_Exception $ex) {
|
|
$error_exception = $ex;
|
|
} catch (Exception $ex) {
|
|
var_dump($ex);
|
|
$error_exception = $ex;
|
|
}
|
|
}
|
|
if ($error_exception != NULL)
|
|
{
|
|
var_dump($error_exception);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* manually flush all cached log to log server
|
|
*/
|
|
public function logFlush(){
|
|
if(sizeof($this->logItems) > 0){
|
|
$this->logBatch($this->logItems, $this->topic);
|
|
$this->logItems = [];
|
|
$this->previousLogTime= time();
|
|
$this->cacheBytes = 0;
|
|
}
|
|
}
|
|
|
|
function __destruct() {
|
|
if(sizeof($this->logItems) > 0){
|
|
$this->logBatch($this->logItems, $this->topic);
|
|
}
|
|
}
|
|
}
|