*/ enum Format { case JSON; case IntelliJ; case Laravel; case Symfony; /** * Serializes the given message into a format based on the type of serialization. * * @param Message $message The message to be serialized. * @return string The serialized message. */ public function serialize(Message $message, DateTime $dateTime = new DateTime()): string { return match ($this) { self::JSON => $this->serializeJson($message, $dateTime), self::IntelliJ => $this->serializeIntelliJ($message, $dateTime), self::Laravel => $this->serializeLaravel($message, $dateTime), self::Symfony => $this->serializeSymfony($message, $dateTime), }; } /** * Serializes the given message into JSON format. * * @param Message $message The message to be serialized. * @return string The JSON-encoded message. */ private function serializeJson(Message $message, DateTime $dateTime): string { /** @var string $trace_file */ $trace_file = $message->trace["file"]; /** @var string $trace_line */ $trace_line = $message->trace["line"]; $json = json_encode([ "date" => $dateTime->format("Y-m-d H:i:s"), "level" => strtoupper($message->level->value), "message" => $message->content, "context" => $message->context, "trace" => [ "file" => pathinfo($trace_file, PATHINFO_FILENAME), "line" => $trace_line, ], ]); if (!$json) { return ""; } return $json; } /** * Serializes the given message into a Laravel log format. * * @param Message $message The message to be serialized. * @return string The serialized message. */ private function serializeLaravel(Message $message, DateTime $dateTime): string { /** @var string $trace_file */ $trace_file = $message->trace["file"]; $datetime = $dateTime->format("Y-m-d H:i:s"); $filename = pathinfo($trace_file, PATHINFO_FILENAME); $level = strtoupper($message->level->value); $content = !empty($message->content) ? "$message->content " : ""; $context = isset($message->context) ? json_encode($message->context) : ""; return trim("[$datetime] $filename.$level: $content$context"); } /** * Serialized the given message into a Symfony log format. * * @param Message $message The message object that contains log details. * @return string The formatted log string. */ private function serializeSymfony(Message $message, DateTime $dateTime): string { /** @var string $trace_file */ $trace_file = $message->trace["file"]; // Date $datetime = $dateTime->format("Y-m-d\TH:i:s.uP"); $filename = pathinfo($trace_file, PATHINFO_FILENAME); $level = strtoupper($message->level->value); $content = !empty($message->content) ? "$message->content " : ""; $context = isset($message->context) ? json_encode($message->context) : ""; return trim("[$datetime] $filename.$level: $content$context"); } /** * Serializes the given message into a IntelliJ log format. * * @param Message $message The message object that contains log details. * @return string The formatted log string. */ private function serializeIntelliJ(Message $message, DateTime $dateTime): string { /** @var string $trace_file */ $trace_file = $message->trace["file"]; /** @var string $trace_line */ $trace_line = $message->trace["line"]; // Date $datetime = $dateTime->format("Y-m-d H:i:s"); $level = strtoupper($message->level->value); $filename = pathinfo($trace_file, PATHINFO_FILENAME); $content = !empty($message->content) ? "$message->content " : ""; $context = isset($message->context) ? json_encode($message->context) : ""; return trim("$datetime [$trace_line] $level - $filename - $content$context"); } }