42     const CLF = 
"{hostname} {req_header_User-Agent} - [{date_common_log}] \"{method} {target} HTTP/{version}\" {code} {res_header_Content-Length}";
 
   43     const DEBUG = 
">>>>>>>>\n{request}\n<<<<<<<<\n{response}\n--------\n{error}";
 
   44     const SHORT = 
'[{ts}] "{method} {target} HTTP/{version}" {code}';
 
   52     public function __construct($template = self::CLF)
 
   54         $this->
template = $template ?: self::CLF;
 
   66     public function format(
 
   69         \Exception $error = 
null 
   73         return preg_replace_callback(
 
   74             '/{\s*([A-Za-z_\-\.0-9]+)\s*}/',
 
   75             function (array $matches) use ($request, $response, $error, &$cache) {
 
   76                 if (isset($cache[$matches[1]])) {
 
   77                     return $cache[$matches[1]];
 
   81                 switch ($matches[1]) {
 
   83                         $result = Psr7\str($request);
 
   86                         $result = $response ? Psr7\str($response) : 
'';
 
   92                             . $this->headers($request);
 
   98                                 $response->getProtocolVersion(),
 
   99                                 $response->getStatusCode(),
 
  100                                 $response->getReasonPhrase()
 
  101                             ) . 
"\r\n" . $this->headers($response)
 
  108                         $result = $response ? $response->getBody() : 
'NULL';
 
  111                     case 'date_iso_8601':
 
  112                         $result = gmdate(
'c');
 
  114                     case 'date_common_log':
 
  115                         $result = date(
'd/M/Y:H:i:s O');
 
  125                         $result = $request->
getUri();
 
  135                             ? $response->getProtocolVersion()
 
  142                         $result = gethostname();
 
  145                         $result = $response ? $response->getStatusCode() : 
'NULL';
 
  148                         $result = $response ? $response->getReasonPhrase() : 
'NULL';
 
  151                         $result = $error ? $error->getMessage() : 
'NULL';
 
  155                         if (strpos($matches[1], 
'req_header_') === 0) {
 
  157                         } elseif (strpos($matches[1], 
'res_header_') === 0) {
 
  159                                 ? $response->getHeaderLine(substr($matches[1], 11))
 
  164                 $cache[$matches[1]] = $result;
 
  179         foreach ($message->
getHeaders() as $name => $values) {
 
  180             $result .= $name . 
': ' . implode(
', ', $values) . 
"\r\n";
 
  183         return trim($result);