Monolog::DEBUG, 'info' => Monolog::INFO, 'notice' => Monolog::NOTICE, 'warning' => Monolog::WARNING, 'error' => Monolog::ERROR, 'critical' => Monolog::CRITICAL, 'alert' => Monolog::ALERT, 'emergency' => Monolog::EMERGENCY, ]; public function __invoke(array $config) { if (!is_a($config['handler'], HandlerInterface::class, true)) { throw new InvalidArgumentException( $config['handler'] . ' must be an instance of ' . HandlerInterface::class ); } $with = array_merge( ['level' => $this->level($config)], $config['with'] ?? [], $config['handler_with'] ?? [] ); $handlers = [ $this->prepareHandler(app()->make($config['handler'], $with), $config) ]; $processors = [ new LogServiceRecordProcessor, ]; return new Monolog('custom', $handlers, $processors, new DateTimeZone('Asia/Tehran')); } protected function getFallbackChannelName() { return app()->bound('env') ? app()->environment() : 'production'; } protected function prepareHandler(HandlerInterface $handler, array $config = []) { $isHandlerFormattable = false; if (Monolog::API === 1) { $isHandlerFormattable = true; } elseif (Monolog::API === 2 && $handler instanceof FormattableHandlerInterface) { $isHandlerFormattable = true; } if ($isHandlerFormattable && !isset($config['formatter'])) { $handler->setFormatter($this->formatter()); } elseif ($isHandlerFormattable && $config['formatter'] !== 'default') { $handler->setFormatter(app()->make($config['formatter'], $config['formatter_with'] ?? [])); } return $handler; } protected function level(array $config) { $level = $config['level'] ?? 'debug'; if (isset($this->levels[$level])) { return $this->levels[$level]; } throw new InvalidArgumentException('Invalid log level.'); } }