_conf = \Yii::app()->params['aliyunLogHub']; } public function processLogs($logs) { // if (LWM_ENV =='dev') { //debug环境,输出本地日志即可 // $this->_localFileLog($logs); // return; // } $this->_conf = \Yii::app()->params['aliyunLogHub']; $logitems = array(); $requestId = uniqid("lwm_", true); foreach ($logs as $log) { $logItem = new \Aliyun_Log_Models_LogItem(); $logItem->setTime($log[3]); $logItem->setContents([ 'request_id' => $requestId, 'ip' => $this->_getServerIp(), 'route' => Logger::$route, 'category' => $log[2], 'level' => $log[1], 'message' => $log[0], 'user_ip' => $this->GetIP(), ]); $logitems[] = $logItem; } $source = ""; $client = new \Aliyun_Log_Client($this->_conf['endpoint'], $this->_conf['accessKeyId'], $this->_conf['accessKey']); $req = new \Aliyun_Log_Models_PutLogsRequest($this->_conf['project'], $this->_conf['logstore'], $this->_conf['topic'], $source, $logitems); try { $res = $client->putLogs($req); } catch (\Exception $e) { //有错误则本地输出日志 $this->_localFileLog($logs); } } /** * 获取服务器 ip * @return string */ private function _getServerIp() { if(isset($_SERVER['SERVER_ADDR']) && !empty($_SERVER['SERVER_ADDR'])) return $_SERVER['SERVER_ADDR']; if (!isset($_SERVER['HOSTNAME'])) { return ''; } return gethostbyname($_SERVER['HOSTNAME']); } /** * 获取用户真实IP */ private function GetIP(){ if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown")) $ip = getenv("HTTP_CLIENT_IP"); else if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown")) $ip = getenv("HTTP_X_FORWARDED_FOR"); else if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown")) $ip = getenv("REMOTE_ADDR"); else if (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown")) $ip = $_SERVER['REMOTE_ADDR']; else $ip = "unknown"; $ip = $ip != "unknown" ? explode(',',$ip) : ''; return isset($ip[0]) ? $ip[0] : 'myunknown'; } /** * 输出本地文件日志 * @param $logs */ private function _localFileLog($logs) { $fileRoute = new \CFileLogRoute(); $fileRoute->init(); $fileRoute->setMaxFileSize(10240); $fileRoute->setMaxLogFiles(20); $fileRoute->levels = $this->levels; $refClass = new \ReflectionClass($fileRoute); $method = $refClass->getMethod('processLogs'); $method->setAccessible(true); $method->invoke($fileRoute, $logs); } }