summaryrefslogtreecommitdiff
path: root/src/Format.php
blob: 5f587b6620b457dbfa1b1816d532bcb33a8bf22d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
<?php

namespace Asko\Loggr;

use DateTime;

/**
 * @author Asko Nõmm <asko@faultd.com>
 */
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");
    }
}