From 12fb45c99fb5d3ede91a025bdc4c0ad8e8d6d971 Mon Sep 17 00:00:00 2001 From: frytimo Date: Mon, 13 Nov 2023 21:55:52 -0400 Subject: [PATCH] Update logging class (#6829) * logging class improvements * remove alias * adjust line print out for field order * refactor class name to be inline with framework standard * fix writing direct to write method --- resources/classes/logging.php | 230 ++++++++++++++++++++++------------ 1 file changed, 152 insertions(+), 78 deletions(-) diff --git a/resources/classes/logging.php b/resources/classes/logging.php index e163161177..2b1a4ff897 100644 --- a/resources/classes/logging.php +++ b/resources/classes/logging.php @@ -1,91 +1,165 @@ log_file = $path; - } + // declare log file and file pointer as private properties + private $fp; + private $debug_func; + private $debug_line; + private $debug_file; + private $debug_class; - // write message to the log file + public function __construct(string $filename_and_path) { + //init values + $this->clear_debug(); - public function lwrite($message) - { - // if file pointer doesn't exist, then open log file - if (!$this->fp) { - $this->lopen(); - } - // define script name - $script_name = pathinfo($_SERVER['PHP_SELF'], PATHINFO_FILENAME); - // define current time and suppress E_WARNING if using the system TZ settings - // (don't forget to set the INI setting date.timezone) - $time = @date('[d/M/Y:H:i:s]'); - // write current time, script name and message to the log file - fwrite($this->fp, "$time ($script_name) $message" . PHP_EOL); - } - - // close log file (it's always a good idea to close a file when you're done with it) - - private function lopen() - { - // in case of Windows set default log file - if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { - $log_file_default = 'c:/php/logfile.txt'; - } // set default log file for Linux and other systems - else { - $log_file_default = '/tmp/logfile.txt'; - } - // define log file from lfile method or use previously set default - $lfile = $this->log_file ? $this->log_file : $log_file_default; - // open log file for writing only and place file pointer at the end of the file - // (if the file does not exist, try to create it) - $this->fp = fopen($lfile, 'a') or exit("Can't open $lfile!"); - } - - // open log file (private method) - - public function lclose() - { - fclose($this->fp); - } - - public function log($level, $msg){ - - $log_file = $_SESSION['logging']['log']['logfile']; - $log_level = $_SESSION['logging']['log']['loglevel']; - - if ($log_level !== $level) { - return; + try { + //open file in append mode + $this->fp = fopen($filename_and_path, 'a'); + } catch (Exception $ex) { + //send the error to the caller + throw $ex; + } } - if ($log_file) { - $this->lfile($log_file); + public function __destruct() { + try { + $this->flush(); + } catch (Exception $ex) { + //do nothing + } finally { + //close the file + if (is_resource($this->fp)) { + fclose($this->fp); + } + } } - $this->lopen(); + /** + * Ensure all data arrives on disk + * @throws Exception + */ + public function flush() { + try { + //ensure everything arrives on disk + if (is_resource($this->fp)) { + fflush($this->fp); + } + } catch (Exception $ex) { + throw $ex; + } + } - $this->lwrite("[".strtoupper($level)."] ".$msg); + // write message to the log file + private function _write($msg) { + // define current time and suppress E_WARNING if using the system TZ settings + } - //close handle - $this->lclose(); + private function clear_debug() { + $this->debug_line = null; + $this->debug_file = null; + $this->debug_func = null; + $this->debug_class = null; + } + + /** + * Write raw data to the + * @param string $level + * @param string $message + */ + public function write(string $level, string $message) { + $this->get_backtrace_details(); + // write current time, script name and message to the log file + // (don't forget to set the INI setting date.timezone) + $time = @date('Y-m-d H:i:s'); + $file = $this->debug_file ?? 'file not set'; + $line = $this->debug_line ?? '0000'; + fwrite($this->fp, "[$time] [$level] [{$file}:{$line}] $message"); + $this->clear_debug(); + } + + public function debug_class(?string $debug_class = null) { + if (func_num_args() > 0) { + $this->debug_class = $debug_class; + return $this; + } + return $this->debug_class; + } + + public function debug_line(?string $debug_line = null) { + if (func_num_args() > 0) { + $this->debug_line = $debug_line; + return $this; + } + return $this->debug_line; + } + + public function debug_func(?string $debug_func = null) { + if (func_num_args() > 0) { + $this->debug_func = $debug_func; + return $this; + } + return $this->debug_func; + } + + public function debug_file(?string $debug_file = null) { + if (func_num_args() > 0) { + $this->debug_file = $debug_file; + return $this; + } + return $this->debug_file; + } + + public function writeln($level, $message) { + $this->get_backtrace_details(); + $this->write($level, $message . "\n"); + } + + public function debug($message) { + $this->get_backtrace_details(); + $this->writeln("DEBUG", $message); + } + + public function info($message) { + $this->get_backtrace_details(); + $this->writeln("INFO", $message); + } + + public function warning($message) { + $this->get_backtrace_details(); + $this->writeln("WARNING", $message); + } + + public function error($message) { + $this->get_backtrace_details(); + $this->writeln("ERROR", $message); + } + + private function get_backtrace_details() { + if ($this->debug_file === null) { + $debug = debug_backtrace(); + $ndx = count($debug) - 1; + $this->debug_file = $debug[$ndx]['file']; + $this->debug_line = $debug[$ndx]['line']; + $this->debug_func = $debug[$ndx]['function']; + $this->debug_class = $debug[$ndx]['class'] ?? ''; + } + } } -} -//$log = new Logging(); -//$log->log("debug", "passed validation, ".__line__); -//$log->log("debug", check_str($_POST["ivr_menu_uuid"])); - -?> \ No newline at end of file + /* + * Example: + $log = new logging(sys_get_temp_dir() . '/logging.log'); + $log->writeln("debug", "passed validation"); + $log->debug("pass"); + $log->warning("variable should not used"); + $log->debug_file(__FILE__)->debug_line(__LINE__)->write("DEBUG", "Raw message\n"); + */ \ No newline at end of file