Viewing file: LogEntry.php (6.9 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
<?php
declare(strict_types=1);
namespace Arcanedev\LogViewer\Entities;
use Arcanedev\LogViewer\Helpers\LogParser; use Carbon\Carbon; use Illuminate\Contracts\Support\{Arrayable, Jsonable}; use JsonSerializable;
/** * Class LogEntry * * @author ARCANEDEV <arcanedev.maroc@gmail.com> */ class LogEntry implements Arrayable, Jsonable, JsonSerializable { /* ----------------------------------------------------------------- | Properties | ----------------------------------------------------------------- */
/** @var string */ public $env;
/** @var string */ public $level;
/** @var \Carbon\Carbon */ public $datetime;
/** @var string */ public $header;
/** @var string */ public $stack;
/** @var array */ public $context = [];
/* ----------------------------------------------------------------- | Constructor | ----------------------------------------------------------------- */
/** * Construct the log entry instance. * * @param string $level * @param string $header * @param string|null $stack */ public function __construct($level, $header, $stack = null) { $this->setLevel($level); $this->setHeader($header); $this->setStack($stack); }
/* ----------------------------------------------------------------- | Getters & Setters | ----------------------------------------------------------------- */
/** * Set the entry level. * * @param string $level * * @return self */ private function setLevel($level) { $this->level = $level;
return $this; }
/** * Set the entry header. * * @param string $header * * @return self */ private function setHeader($header) { $this->setDatetime($this->extractDatetime($header));
$header = $this->cleanHeader($header);
$this->header = trim($header);
return $this; }
/** * Set the context. * * @param array $context * * @return $this */ private function setContext(array $context) { $this->context = $context;
return $this; }
/** * Set entry environment. * * @param string $env * * @return self */ private function setEnv($env) { $this->env = head(explode('.', $env));
return $this; }
/** * Set the entry date time. * * @param string $datetime * * @return \Arcanedev\LogViewer\Entities\LogEntry */ private function setDatetime($datetime) { $this->datetime = Carbon::createFromFormat('Y-m-d H:i:s', $datetime);
return $this; }
/** * Set the entry stack. * * @param string $stack * * @return self */ private function setStack($stack) { $this->stack = $stack;
return $this; }
/** * Get translated level name with icon. * * @return string */ public function level() { return $this->icon()->toHtml().' '.$this->name(); }
/** * Get translated level name. * * @return string */ public function name() { return log_levels()->get($this->level); }
/** * Get level icon. * * @return \Illuminate\Support\HtmlString */ public function icon() { return log_styler()->icon($this->level); }
/** * Get the entry stack. * * @return string */ public function stack() { return trim(htmlentities($this->stack)); }
/** * Get the entry context as json pretty print. */ public function context(int $options = JSON_PRETTY_PRINT): string { return json_encode($this->context, $options); }
/* ----------------------------------------------------------------- | Check Methods | ----------------------------------------------------------------- */
/** * Check if same log level. * * @param string $level * * @return bool */ public function isSameLevel($level) { return $this->level === $level; }
/* ----------------------------------------------------------------- | Convert Methods | ----------------------------------------------------------------- */
/** * Get the log entry as an array. * * @return array */ public function toArray() { return [ 'level' => $this->level, 'datetime' => $this->datetime->format('Y-m-d H:i:s'), 'header' => $this->header, 'stack' => $this->stack ]; }
/** * Convert the log entry to its JSON representation. * * @param int $options * * @return string */ public function toJson($options = 0) { return json_encode($this->toArray(), $options); }
/** * Serialize the log entry object to json data. */ public function jsonSerialize(): array { return $this->toArray(); }
/* ----------------------------------------------------------------- | Check Methods | ----------------------------------------------------------------- */
/** * Check if the entry has a stack. * * @return bool */ public function hasStack() { return $this->stack !== "\n"; }
/** * Check if the entry has a context. * * @return bool */ public function hasContext() { return ! empty($this->context); }
/* ----------------------------------------------------------------- | Other Methods | ----------------------------------------------------------------- */
/** * Clean the entry header. * * @param string $header * * @return string */ private function cleanHeader($header) { // REMOVE THE DATE $header = preg_replace('/\['.LogParser::REGEX_DATETIME_PATTERN.'\][ ]/', '', $header);
// EXTRACT ENV if (preg_match('/^[a-z]+.[A-Z]+:/', $header, $out)) { $this->setEnv($out[0]); $header = trim(str_replace($out[0], '', $header)); }
// EXTRACT CONTEXT (Regex from https://stackoverflow.com/a/21995025) preg_match_all('/{(?:[^{}]|(?R))*}/x', $header, $out); if (isset($out[0][0]) && ! is_null($context = json_decode($out[0][0], true))) { $header = str_replace($out[0][0], '', $header); $this->setContext($context); }
return $header; }
/** * Extract datetime from the header. * * @param string $header * * @return string */ private function extractDatetime($header) { return preg_replace('/^\[('.LogParser::REGEX_DATETIME_PATTERN.')\].*/', '$1', $header); } }
|