ApiLog.php 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. <?php
  2. namespace App\Http\Middleware;
  3. use Closure;
  4. use Illuminate\Http\Request;
  5. use Illuminate\Support\Facades\Storage;
  6. use Illuminate\Support\Facades\Cache;
  7. use Illuminate\Support\Facades\Redis;
  8. class ApiLog
  9. {
  10. /**
  11. * Handle an incoming request.
  12. *
  13. * @param \Illuminate\Http\Request $request
  14. * @param \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse) $next
  15. * @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
  16. */
  17. public function handle(Request $request, Closure $next)
  18. {
  19. $response = $next($request);
  20. if (defined('LARAVEL_START'))
  21. {
  22. $delay = round((microtime(true) - LARAVEL_START)*1000.0);
  23. $api = [];
  24. $api[] = date("h:i:sa",LARAVEL_START);
  25. $api[] = $delay;
  26. $api[] = $request->method();
  27. $api[] = $request->path();
  28. $logFileName = storage_path('logs/api-'.date("Y-m-d").".log");
  29. $logFile = fopen($logFileName, "a");
  30. if($logFile){
  31. fputcsv($logFile, $api);
  32. fclose($logFile);
  33. }
  34. //实时监控
  35. $apiPath = explode('/',$request->path());
  36. if(count($apiPath)>=3 && $apiPath[2] !== 'api'){
  37. $timeMinute = intval(time()/60);
  38. $timeSecond = time();
  39. $apiName = $apiPath[2];
  40. $this->UpdateCache("pref-m/all/{$timeMinute}",$delay);
  41. $this->UpdateCache("pref-m/{$apiName}/{$timeMinute}",$delay);
  42. $this->UpdateCache("pref-s/all/{$timeSecond}",$delay,30);
  43. $this->UpdateCache("pref-s/{$apiName}/{$timeSecond}",$delay,30);
  44. }
  45. }
  46. return $response;
  47. }
  48. private function UpdateCache($key,$delay,$expire=3600){
  49. Redis::set($key."/count",Redis::get($key."/count",0)+1,$expire);
  50. Redis::expire($key."/count",$expire);
  51. Redis::set($key."/delay",Redis::get($key."/delay",0)+$delay,$expire);
  52. Redis::expire($key."/delay",$expire);
  53. }
  54. }