SizeRotatingDailyLogger.php 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. <?php
  2. namespace UCore\Logging;
  3. use Monolog\Logger;
  4. use Monolog\Formatter\LineFormatter;
  5. /**
  6. * 支持文件大小限制的每日轮转日志驱动
  7. */
  8. class SizeRotatingDailyLogger
  9. {
  10. /**
  11. * 创建自定义 Monolog 实例
  12. *
  13. * @param array $config
  14. * @return Logger
  15. */
  16. public function __invoke(array $config): Logger
  17. {
  18. $logger = new Logger($config['name'] ?? 'laravel');
  19. // 获取配置参数
  20. $path = $config['path'] ?? storage_path('logs/laravel.log');
  21. $level = $config['level'] ?? 'debug';
  22. $maxFiles = $config['days'] ?? 7;
  23. $maxFileSize = $this->parseFileSize($config['max_file_size'] ?? '100M');
  24. $permission = $config['permission'] ?? null;
  25. $locking = $config['locking'] ?? false;
  26. // 创建处理器
  27. $handler = new SizeRotatingDailyHandler(
  28. $path,
  29. $maxFiles,
  30. $this->parseLevel($level),
  31. true,
  32. $permission,
  33. $locking,
  34. $maxFileSize
  35. );
  36. // 设置格式化器
  37. $formatter = new LineFormatter(
  38. $config['format'] ?? null,
  39. $config['date_format'] ?? null,
  40. $config['allow_inline_line_breaks'] ?? false,
  41. $config['ignore_empty_context_and_extra'] ?? false
  42. );
  43. $handler->setFormatter($formatter);
  44. $logger->pushHandler($handler);
  45. return $logger;
  46. }
  47. /**
  48. * 解析日志级别
  49. *
  50. * @param string $level
  51. * @return int
  52. */
  53. protected function parseLevel(string $level): int
  54. {
  55. return match (strtolower($level)) {
  56. 'debug' => Logger::DEBUG,
  57. 'info' => Logger::INFO,
  58. 'notice' => Logger::NOTICE,
  59. 'warning' => Logger::WARNING,
  60. 'error' => Logger::ERROR,
  61. 'critical' => Logger::CRITICAL,
  62. 'alert' => Logger::ALERT,
  63. 'emergency' => Logger::EMERGENCY,
  64. default => Logger::DEBUG,
  65. };
  66. }
  67. /**
  68. * 解析文件大小配置
  69. *
  70. * @param string $size
  71. * @return int
  72. */
  73. protected function parseFileSize(string $size): int
  74. {
  75. $size = trim($size);
  76. $unit = strtoupper(substr($size, -1));
  77. $value = (int) substr($size, 0, -1);
  78. return match ($unit) {
  79. 'K' => $value * 1024,
  80. 'M' => $value * 1024 * 1024,
  81. 'G' => $value * 1024 * 1024 * 1024,
  82. default => (int) $size, // 如果没有单位,假设是字节
  83. };
  84. }
  85. }