CustomizeFormatter.php 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. <?php
  2. namespace App\Logging;
  3. use Illuminate\Log\Logger;
  4. use Monolog\Formatter\LineFormatter;
  5. use Monolog\LogRecord;
  6. class CustomizeFormatter
  7. {
  8. /**
  9. * 自定义给定的日志实例。
  10. */
  11. public function __invoke(Logger $logger): void
  12. {
  13. foreach ($logger->getHandlers() as $handler) {
  14. $handler->setFormatter(new LineFormatter(
  15. "[%datetime%] %channel%.%level_name%: %message% %context% %extra%\n",
  16. 'Y-m-d H:i:s',
  17. true,
  18. true
  19. ));
  20. // 添加更严格的过滤器
  21. $handler->pushProcessor(function (LogRecord $record): LogRecord {
  22. // 1. 允许SQL日志
  23. if (str_contains($record->message, 'sql:')) {
  24. return $record;
  25. }
  26. // 2. 过滤所有来自vendor目录的日志
  27. if (isset($record->extra['file']) && str_contains($record->extra['file'], '/vendor/')) {
  28. $record->extra['filtered'] = true;
  29. return $record;
  30. }
  31. // 3. 过滤框架的默认日志通道
  32. if (in_array($record->channel, [
  33. 'laravel',
  34. 'framework',
  35. 'security',
  36. 'request',
  37. 'schedule',
  38. 'queue',
  39. ])) {
  40. $record->extra['filtered'] = true;
  41. return $record;
  42. }
  43. // 4. 只允许来自app目录的日志
  44. if (isset($record->extra['file']) && str_contains($record->extra['file'], '/app/')) {
  45. return $record;
  46. }
  47. $record->extra['filtered'] = true;
  48. return $record;
  49. });
  50. }
  51. }
  52. }