formatter = $formatter; $this->level = self::parseLogLevel($level); $this->terminalWidth = $terminalWidth; } public function log(int $level, string $app, array $entry) { if ($level >= $this->level) { $messageWidth = $this->terminalWidth - 8 - 18 - 6; $entry = $this->logDetails($app, $entry, $level); $lines = explode("\n", $this->formatter->formatMessage($entry, $messageWidth)); $lines[0] = str_pad(Tail::LEVELS[$level], 8) . ' ' . str_pad(wordwrap($app, 18), 18) . ' ' . str_pad($lines[0], $messageWidth); for ($i = 1; $i < count($lines); $i++) { $lines[$i] = str_repeat(' ', 8 + 18 + 2) . $lines[$i]; } foreach ($lines as $line) { fwrite(STDERR, $line . "\n"); } fwrite(STDERR, "\n"); } } private static function parseLogLevel(string $level): int { if (is_numeric($level)) { return (int)$level; } switch (strtoupper($level)) { case 'DEBUG': return 0; case 'INFO': return 1; case 'WARN': return 2; case 'ERROR': return 3; case 'FATAL': return 4; default: throw new \Exception("Unknown log level $level"); } } }