getMessage(), $e->getFile(), $e->getLine() ), ['trace' => $e->getTraceAsString()]); } private static function write(string $level, string $message, array $context = []): void { $line = sprintf( "[%s] %s %s%s\n", gmdate('Y-m-d H:i:s'), $level, $message, $context !== [] ? ' ' . self::encodeContext($context) : '' ); $dir = self::dir(); if ($dir !== null) { $file = $dir . '/dc-' . gmdate('Y-m-d') . '.log'; if (@file_put_contents($file, $line, FILE_APPEND | LOCK_EX) !== false) { return; } } @error_log(rtrim($line)); } private static function encodeContext(array $context): string { $json = json_encode($context, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE | JSON_INVALID_UTF8_SUBSTITUTE); return $json === false ? '{}' : $json; } private static function dir(): ?string { if (self::$resolvedDir !== null) { return self::$resolvedDir === '' ? null : self::$resolvedDir; } $dir = defined('DC_VAR') ? DC_VAR . '/log' : null; if ($dir === null) { self::$resolvedDir = ''; return null; } if (!is_dir($dir) && !@mkdir($dir, 0775, true) && !is_dir($dir)) { self::$resolvedDir = ''; return null; } if (!is_writable($dir)) { self::$resolvedDir = ''; return null; } self::$resolvedDir = $dir; return $dir; } }