Skip to content
Snippets Groups Projects
Commit 3c9e168a authored by Hahn Axel (hahn)'s avatar Hahn Axel (hahn)
Browse files

update vendor logger class

parent 5a6fddf6
No related branches found
No related tags found
1 merge request!66php8 only; added variable types; short array syntax; remove glyphicons
This commit is part of merge request !66. Comments created here will be created in the context of that merge request.
......@@ -27,9 +27,11 @@
* 2022-10-16 mark longest action with an icon
* 2022-12-15 make it compatible to PHP 8.2; add doc + comments
* 2023-05-15 fix _getBar() - division by zero
* 2024-07-12 php8 only: use variable types; update phpdocs
* ----------------------------------------------------------------------
*/
class logger {
class logger
{
/**
* @var {array} array of added messages
......@@ -51,21 +53,22 @@ class logger {
*/
protected $sCssPrefix = '';
protected $sSourceUrl = 'https://github.com/axelhahn/ahlogger';
// ----------------------------------------------------------------------
// CONSTRUCTOR
// ----------------------------------------------------------------------
/**
* constuctor
* Constuctor
* @param string $sInitMessage init message
* @return boolean
*/
public function __construct($sInitMessage = "Logger was initialized.") {
public function __construct(string $sInitMessage = "Logger was initialized.")
{
$this->_iMemStart = memory_get_usage();
$this->enableDebug(true);
$this->add($sInitMessage);
$this->sCssPrefix = 'debug-' . md5(microtime(true));
return true;
}
// ----------------------------------------------------------------------
......@@ -73,12 +76,13 @@ class logger {
// ----------------------------------------------------------------------
/**
* add a logging message
* @param type $sMessage
* @param type $sLevel
* Add a logging message
* @param string $sMessage
* @param string $sLevel
* @return boolean
*/
public function add($sMessage, $sLevel = "info") {
public function add(string $sMessage, string $sLevel = "info"): bool
{
if (!$this->bShowDebug) {
return false;
}
......@@ -93,20 +97,22 @@ class logger {
}
/**
* enable / disable debugging
* @param type $bEnable
* @return type
* Enable / disable debugging
* @param bool $bEnable
* @return bool
*/
public function enableDebug($bEnable=true){
public function enableDebug(bool $bEnable = true): bool
{
return $this->bShowDebug = !!$bEnable;
}
/**
* enable client debugging by a given array of allowed ip addresses
* Enable client debugging by a given array of allowed ip addresses
* @param array $aIpArray list of ip addresses in a flat array
* @return boolean
*/
public function enableDebugByIp($aIpArray){
public function enableDebugByIp(array $aIpArray): bool
{
$this->enableDebug(false);
if (!$_SERVER || !is_array($_SERVER) || !array_key_exists("REMOTE_ADDR", $_SERVER)) {
return false;
......@@ -114,10 +120,11 @@ class logger {
if (array_search($_SERVER['REMOTE_ADDR'], $aIpArray) !== false) {
$this->enableDebug(true);
}
return true;
}
/**
* helper function: prepare array of added massages before output
* Helper function: prepare array of added massages before output
* - detect warnings and errors
* - detect needed time for each action
* - detect longest action
......@@ -126,7 +133,8 @@ class logger {
*
* @return array
*/
protected function _prepareRendering(){
protected function _prepareRendering(): array
{
$iMem = memory_get_usage();
$this->add('<hr>');
$this->add('Memory on start: ' . number_format($this->_iMemStart, 0, '.', ',') . " bytes");
......@@ -202,12 +210,13 @@ class logger {
}
/**
* get html code for a progressbar with divs
* @param {int|float} $iVal value between 0..max value
* @param {int|float} $iMax max value
* @return {string}
* Get html code for a progressbar with divs
* @param int|float $iVal value between 0..max value
* @param int|float $iMax max value
* @return string
*/
protected function _getBar($iVal, $iMax){
protected function _getBar(int|float $iVal, int|float $iMax): string
{
return $iMax > 0
? '<div class="bar"><div class="progress" style="width: ' . ($iVal / $iMax * 100) . '%;">&nbsp;</div></div>'
: ''
......@@ -215,9 +224,11 @@ class logger {
}
/**
* render output of all logging messages
* Render output of all logging messages
* @return string
*/
public function render() {
public function render(): string
{
if (!$this->bShowDebug) {
return false;
}
......@@ -257,39 +268,40 @@ class logger {
foreach ($aData['entries'] as $aLogentry) {
$sOut .= '<tr class="' . $this->sCssPrefix . '-level-' . $aLogentry["level"] . '' . ($aLogentry["trid"] == $aData["maxrowid"] ? ' ' . $this->sCssPrefix . '-maxrow' : '') . '" '
. 'id="' . $aLogentry["trid"] . '">' .
'<td>' . $aLogentry["counter"] . '</td>' .
'<td align="right">' . $aLogentry["counter"] . '</td>' .
'<td>' . $aLogentry["level"] . '</td>' .
'<td>' . $aLogentry["timer"] . '</td>' .
'<td>' . $this->_getBar($aLogentry["delta"], $aData["maxtime"]*1000). $aLogentry["delta"] .' ms'.($aLogentry["delta"]==$aData['maxtime']*1000 ? ' ⏱️' : '').'</td>' .
'<td>' . $this->_getBar($aLogentry["memory"], $aData["maxmem"]) . $aLogentry["memory"] .' MB'. '</td>' .
'<td align="right">' . $aLogentry["timer"] . '</td>' .
'<td align="right">' . $this->_getBar($aLogentry["delta"], $aData["maxtime"] * 1000) . ($aLogentry["delta"] == $aData['maxtime'] * 1000 ? '⏱️ ' : '') . $aLogentry["delta"] . ' ms</td>' .
'<td align="right">' . $this->_getBar($aLogentry["memory"], $aData["maxmem"]) . $aLogentry["memory"] . ' MB' . '</td>' .
'<td>' . $aLogentry["message"] . '</td>' .
'</tr>';
}
if ($sOut) {
$sOut = '
<style>
.'.$this->sCssPrefix.'-info {position: fixed; top: 6em; right: 1em; background: rgba(200,228,255, 0.8); border: 1px solid; z-index: 99999;}
.'.$this->sCssPrefix.'-info .head {background: rgba(0,0,0,0.4); color: #fff;padding: 0em 0.5em 0.2em; }
.'.$this->sCssPrefix.'-info .content {padding: 0.5em; }
.'.$this->sCssPrefix.'-info .content .total {font-size: 160%; color: rgba(0,0,0,0.5); margin: 0.3em 0; display: inline-block;}
.' . $this->sCssPrefix . '-info {position: fixed; top: 6em; right: 1em; background: rgba(230,240,255, 0.8); border: 2px solid rgba(0,0,0,0.2); border-radius: 0.3em; z-index: 99999;}
.' . $this->sCssPrefix . '-info .loggerhead {background: rgba(0,0,0,0.4); color: #fff;padding: 0em 0.5em 0.2em; border-radius: 0.3em 0.3em 0 0; }
.' . $this->sCssPrefix . '-info .loggercontent {padding: 0.5em; }
.' . $this->sCssPrefix . '-info .loggercontent .total {font-size: 160%; color: rgba(0,0,0,0.5); margin: 0.3em 0; display: inline-block;}
.' . $this->sCssPrefix . '-messages {margin: 5em 2em 2em;}
.' . $this->sCssPrefix . '-messages>h3 {font-size: 150%; margin: 0 0 0.5em 0;}
.' . $this->sCssPrefix . '-messages .bar {background: rgba(0,0,0,0.03); height: 1.4em; position: absolute; width: 6em; border-right: 1px solid rgba(0,0,0,0.2);}
.'.$this->sCssPrefix.'-messages .progress {background: rgba(100,140,180,0.2); height: 1.4em; padding: 0;}
.'.$this->sCssPrefix.'-messages table{background: #fff; color: #222;table-layout:fixed; }
.'.$this->sCssPrefix.'-messages table th{background: none;}
.' . $this->sCssPrefix . '-messages .progress {background: rgba(100,140,180,0.2); height: 1.4em; padding: 0; float: left;}
.' . $this->sCssPrefix . '-messages table{background: #fff; color: #222;table-layout:fixed; border: 2px solid rgba(0,0,0,0.2); border-radius: 0.5em;}
.' . $this->sCssPrefix . '-messages table th{background: none; color: #222; border-bottom: 2px solid rgba(0,0,0,0.4);}
.' . $this->sCssPrefix . '-messages table th.barcol{min-width: 7em; position: relative;}
.' . $this->sCssPrefix . '-messages table td{padding: 3px; vertical-align: top;}
.' . $this->sCssPrefix . '-messages table th:hover{background:#aaa !important;}
.'.$this->sCssPrefix.'-level-info{background: #e0e8f8; color:#124}
.' . $this->sCssPrefix . '-level-info{background: #f0f4f4; color:#124}
.' . $this->sCssPrefix . '-level-warning{background: #fcf8e3; color: #980;}
.' . $this->sCssPrefix . '-level-error{background: #fce0e0; color: #944;}
.' . $this->sCssPrefix . '-maxrow{color:#f33; font-weight: bold;}
</style>
<div class="'.$this->sCssPrefix.' '.$this->sCssPrefix.'-info '.$this->sCssPrefix.'-level-'.$aData['level'].'">
<div class="head">ahLogger</div>
<div class="content">
<div class="' . $this->sCssPrefix . ' ' . $this->sCssPrefix . '-info ' . $this->sCssPrefix . '-level-' . $aData['level'] . '" onclick="location.href=\'#' . $this->sCssPrefix . '-messages\';">
<div class="loggerhead">ahLogger</div>
<div class="loggercontent">
<span class="total">⏱️ ' . $aData['totaltime'] . '&nbsp;s</span><br>
🪲 <a href="#' . $this->sCssPrefix . '-messages">Debug infos</a> | 🔺 <a href="#">top</a><br>
<span>longest&nbsp;action: ⏱️&nbsp;<a href="#' . $aData['maxrowid'] . '">' . ($aData['maxtime'] * 1000) . '&nbsp;ms</a></span>
......@@ -299,7 +311,7 @@ class logger {
</div>
<div id="' . $this->sCssPrefix . '-messages" class="' . $this->sCssPrefix . ' ' . $this->sCssPrefix . '-messages">
DEBUG :: LOG MESSAGES<br>'
<h3>ahLogger 🪳 Debug messages</h3>'
. ($aData['errors'] ? '<span>Errors: ' . $aData['errors'] . '</span><br>' : '')
. ($aData['warnings'] ? '<span>Warnings: ' . $aData['warnings'] . '</span><br>' : '')
. '<br>
......@@ -313,16 +325,20 @@ class logger {
<th class="barcol">memory</th>
<th>message</th>
</tr></thead><tbody>
' . $sOut . '</tbody></table>'
' . $sOut
. '</tbody></table>'
. '🌐 <a href="'.$this->sSourceUrl.'" target="_blank">'.$this->sSourceUrl.'</a>'
;
}
return $sOut;
}
/**
* render output of all logging messages for cli output
* Render output of all logging messages for cli output
* @return string
*/
public function renderCli(){
public function renderCli(): string
{
if (!$this->bShowDebug) {
return false;
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment