AliyunLogHubRoute.php 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. <?php
  2. /**
  3. * 阿里云日志服务路由
  4. */
  5. class AliyunLogHubRoute extends \CLogRoute
  6. {
  7. //阿里云日志hub配置
  8. private $_conf = [];
  9. //初始化
  10. public function init()
  11. {
  12. parent::init();
  13. $this->_conf = \Yii::app()->params['aliyunLogHub'];
  14. }
  15. public function processLogs($logs)
  16. {
  17. // if (LWM_ENV =='dev') { //debug环境,输出本地日志即可
  18. // $this->_localFileLog($logs);
  19. // return;
  20. // }
  21. $this->_conf = \Yii::app()->params['aliyunLogHub'];
  22. $logitems = array();
  23. $requestId = uniqid("lwm_", true);
  24. foreach ($logs as $log) {
  25. $logItem = new \Aliyun_Log_Models_LogItem();
  26. $logItem->setTime($log[3]);
  27. $logItem->setContents([
  28. 'request_id' => $requestId,
  29. 'ip' => $this->_getServerIp(),
  30. 'route' => Logger::$route,
  31. 'category' => $log[2],
  32. 'level' => $log[1],
  33. 'message' => $log[0],
  34. 'user_ip' => $this->GetIP(),
  35. ]);
  36. $logitems[] = $logItem;
  37. }
  38. $source = "";
  39. $client = new \Aliyun_Log_Client($this->_conf['endpoint'], $this->_conf['accessKeyId'], $this->_conf['accessKey']);
  40. $req = new \Aliyun_Log_Models_PutLogsRequest($this->_conf['project'], $this->_conf['logstore'], $this->_conf['topic'], $source, $logitems);
  41. try {
  42. $res = $client->putLogs($req);
  43. } catch (\Exception $e) {
  44. //有错误则本地输出日志
  45. $this->_localFileLog($logs);
  46. }
  47. }
  48. /**
  49. * 获取服务器 ip
  50. * @return string
  51. */
  52. private function _getServerIp()
  53. {
  54. if(isset($_SERVER['SERVER_ADDR']) && !empty($_SERVER['SERVER_ADDR']))
  55. return $_SERVER['SERVER_ADDR'];
  56. if (!isset($_SERVER['HOSTNAME'])) {
  57. return '';
  58. }
  59. return gethostbyname($_SERVER['HOSTNAME']);
  60. }
  61. /**
  62. * 获取用户真实IP
  63. */
  64. private function GetIP(){
  65. if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown"))
  66. $ip = getenv("HTTP_CLIENT_IP");
  67. else if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown"))
  68. $ip = getenv("HTTP_X_FORWARDED_FOR");
  69. else if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown"))
  70. $ip = getenv("REMOTE_ADDR");
  71. else if (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown"))
  72. $ip = $_SERVER['REMOTE_ADDR'];
  73. else
  74. $ip = "unknown";
  75. $ip = $ip != "unknown" ? explode(',',$ip) : '';
  76. return isset($ip[0]) ? $ip[0] : 'myunknown';
  77. }
  78. /**
  79. * 输出本地文件日志
  80. * @param $logs
  81. */
  82. private function _localFileLog($logs)
  83. {
  84. $fileRoute = new \CFileLogRoute();
  85. $fileRoute->init();
  86. $fileRoute->setMaxFileSize(10240);
  87. $fileRoute->setMaxLogFiles(20);
  88. $fileRoute->levels = $this->levels;
  89. $refClass = new \ReflectionClass($fileRoute);
  90. $method = $refClass->getMethod('processLogs');
  91. $method->setAccessible(true);
  92. $method->invoke($fileRoute, $logs);
  93. }
  94. }