Add MDOutputHandler

This commit is contained in:
Joshua Ramon Enslin 2020-08-08 22:04:34 +02:00 committed by Stefan Rohde-Enslin
parent b73725e179
commit 41fda53d58
3 changed files with 179 additions and 1 deletions

View File

@ -4,7 +4,7 @@ declare(strict_types = 1);
/** /**
* Custom exception class for invalid page parameters. * Custom exception class for invalid page parameters.
*/ */
class MDConsoleInvalidHeadingNumber { class MDConsoleInvalidHeadingNumber extends Exception {
/** /**
* Error message. * Error message.

View File

@ -14,12 +14,14 @@ class MDConsole {
const CONSOLE_STATUS_UPDATE = 1; const CONSOLE_STATUS_UPDATE = 1;
const CONSOLE_STATUS_DELETION = 2; const CONSOLE_STATUS_DELETION = 2;
const CONSOLE_STATUS_ERROR = 3; const CONSOLE_STATUS_ERROR = 3;
const CONSOLE_STATUS_SKIPPED = 3;
const CONSOLE_LEVEL_COLORS = [ const CONSOLE_LEVEL_COLORS = [
self::CONSOLE_STATUS_NOTICE => "", self::CONSOLE_STATUS_NOTICE => "",
self::CONSOLE_STATUS_ERROR => "41", // 0: Red background | Problem self::CONSOLE_STATUS_ERROR => "41", // 0: Red background | Problem
self::CONSOLE_STATUS_UPDATE => "42", // 1: Green background | Edited automatically self::CONSOLE_STATUS_UPDATE => "42", // 1: Green background | Edited automatically
self::CONSOLE_STATUS_DELETION => "44", // 2: Blue background | Deleted self::CONSOLE_STATUS_DELETION => "44", // 2: Blue background | Deleted
self::CONSOLE_STATUS_SKIPPED => "40", // 2: Blue background | Deleted
]; ];
const CONSOLE_LOG_USED_RESOURCES_ENABLED = 1; const CONSOLE_LOG_USED_RESOURCES_ENABLED = 1;

176
src/MDOutputHandler.php Normal file
View File

@ -0,0 +1,176 @@
<?PHP
/**
* This file offers a class for handling outputs and logging.
*
* @author Joshua Ramon Enslin <joshua@museum-digital.de>
*/
/**
* Class for handling outputs and logs for museum-digital's background tools.
*/
class MDOutputHandler {
/*
* Variables
*/
/** @var integer */
private $_verbosity;
/** @var string */
private $_context;
/** @var string */
private $_logfile;
/** @var integer */
private $_counter;
/** @var boolean */
private $_file_logging;
/** @var integer */
private $_startTime;
/**
* Function human_filesize translates byte-level filesizes to human readable ones.
* Thanks to Jeffrey Sambells http://jeffreysambells.com/2012/10/25/human-readable-filesize-php
*
* @param string $bytes A file size, e.g. returned from filesize().
* @param integer $decimals Number of decimal digits to allow.
*
* @return string
*/
final private function _human_filesize(string $bytes, int $decimals = 2):string {
$size = ['B','kB','MB','GB','TB','PB','EB','ZB','YB'];
$factor = floor((strlen($bytes) - 1) / 3);
return sprintf("%.{$decimals}f", $bytes / pow(1024, $factor)) . $size[$factor];
}
/**
* Setter function for the verbosity option.
*
* @param integer $input New value of boolean value verbosity.
*
* @return void
*/
public function setVerbosity(int $input = 0) {
$this->_verbosity = $input;
}
/**
* Setter function for the additional context description.
*
* @param string $input New value.
*
* @return void
*/
public function setContext(string $input = "") {
$this->_context = $input;
}
/**
* Setter function for file logging.
*
* @param boolean $input New value.
*
* @return void
*/
public function setFileLogging(bool $input = false) {
$this->_file_logging = $input;
if ($this->_file_logging === true) {
if (!is_dir(__DIR__ . "/../logs")) mkdir(__DIR__ . "/../logs", 0755);
touch($this->_logfile);
}
}
/**
* Main function of this class.
* Formats a message uniformly and writes it to the log, maybe also to stdout.
*
* @param string $msg Message to log.
* @param integer $statusCode Status code.
* 0: Note
* 1: Skipped
* 2: Update
* 3: Error.
*
* @return void
*/
public function toLog(string $msg, int $statusCode = 0) {
// Get parts for generating the message to log.
$this->_counter++; // Increment counter
$date = date("Y-m-d H:i:s"); // Get current date & time.
switch ($statusCode) {
case 1:
$statusSymbol = "-";
break;
case 2:
$statusSymbol = "U";
break;
case 3:
$statusSymbol = "E";
break;
case 0:
default:
$statusSymbol = "N";
break;
}
if (!empty($this->_context)) $contextStr = "{$this->_context}";
else $contextStr = "";
// Generate the message to log.
$message = "$statusSymbol{$contextStr}#" . sprintf("%1$07s", $this->_counter) . "" . sprintf("%1$7s", $this->_human_filesize(memory_get_usage())) . "{$date}{$msg}" . PHP_EOL;
if ($this->_file_logging === true) {
file_put_contents($this->_logfile, $message, FILE_APPEND);
}
if (($this->_verbosity > 0 && $statusCode > 1) || $this->_verbosity === 2) echo $message;
if ($this->_counter % 250 === 0) {
echo '―――> ' . sprintf("%1$07d", $this->_counter) . " operations processed" . PHP_EOL;
echo str_replace("_", "", sprintf("%'_80s", "_")) . PHP_EOL;
}
}
/**
* Constructor function that sets defaults and ensures the logfile exists.
*/
function __construct() {
$this->_startTime = microtime(true);
$this->_counter = 0;
$this->setVerbosity();
$this->setContext();
$this->setFileLogging();
$this->_logfile = __DIR__ . "/../logs/" . date("Ymd_His") . ".txt";
// Ensure the log directory exists
$this->toLog("Activated logger.");
}
/**
* Destructor.
*
* @return void
*/
function __destruct() {
$endtime = microtime(true);
$this->toLog("Finished operation. Processing duration: " . strval($endtime - $this->_startTime));
}
}