diff --git a/logger.php b/logger.php new file mode 100644 index 0000000..800025b --- /dev/null +++ b/logger.php @@ -0,0 +1,110 @@ +timezone = "Europe/Paris"; + $d->logtype="display|file"; + $d->logfile="/tmp/toto.log"; + $d->logwrite ("Super log default"); + $d->logwrite ("Super log DEBUG", $d::DEBUG); + $d->logwrite ("Super log NOTICE", $d::NOTICE); */ + // TODO : Add SQL support + public $logtype = "display"; // display, file, syslog + // can be merged with a pipe : "display|syslog" + public $logfile = FALSE; + public $timezone = "UTC"; + public $loglevelmin = LOG_NOTICE; + // See http://fr2.php.net/manual/en/function.openlog.php for $syslogFacility + public $syslogFacility = LOG_USER; + public $syslogPrefix = FALSE; + + /* Priorities : + LOG_EMERG system is unusable + LOG_ALERT action must be taken immediately + LOG_CRIT critical conditions + LOG_ERR error conditions + LOG_WARNING warning conditions + LOG_NOTICE normal, but significant, condition + LOG_INFO informational message + LOG_DEBUG debug-level message */ + private $priorities = array (LOG_EMERG => "EMERG", + LOG_ALERT => "ALERT", + LOG_CRIT => "CRITICAL", + LOG_ERR => "ERROR", + LOG_WARNING => "WARNING", + LOG_NOTICE => "NOTICE", + LOG_INFO => "INFO", + LOG_DEBUG => "DEBUG"); + + /** Store a new message log in the log manager defined by $logtype */ + public function log ($message, $priority=LOG_NOTICE) + { + if ($this->loglevelmin < $priority) + return; + $back = reset (debug_backtrace()); + $message .= " [".basename ($back["file"]).":".$back["line"]."]"; + $logsType = explode ("|", $this->logtype); + if (in_array ("display", $logsType)) + $this->logdisplay ($message, $priority); + if (in_array ("file", $logsType)) + $this->logfile ($message, $priority); + if (in_array ("syslog", $logsType)) + $this->logsyslog ($message, $priority); + } + + /** Log $message on file */ + private function logfile ($message, $priority) + { + if ($this->logfile === FALSE) + throw new Exception ("Undefined file where logging"); + if (!file_exists ($this->logfile)) + { + if (! is_dir (dirname ($this->logfile))) + throw new Exception ("You must create the ".dirname ($this->logfile). + "directory"); + if (! is_writable (dirname ($this->logfile))) + throw new Exception ("The directory ".dirname ($this->logfile)." must" + ." be writable to create log file"); + } + + if (!is_writable ($this->logfile)) + { + if (function_exists ("posix_geteuid")) + $user = posix_geteuid (); + elseif (getenv('USERNAME') !== FALSE) + $user = getenv('USERNAME'); + else + $user = ""; + throw new Exception ("Logfile $this->logfile is not writable for user ". + $user); + } + + ini_set ("date.timezone", $this->timezone); + $message = date ("Y/m/d H:i:s")." [".$this->priorities[$priority]."] ". + $message."\n"; + file_put_contents ($this->logfile, $message, FILE_APPEND); + } + + /** Log $message on screen with adding date. Add the HTML flags if not in CLI + */ + private function logdisplay ($message, $priority) + { + if (php_sapi_name () !== "cli") + echo ""; + ini_set ("date.timezone", $this->timezone); + $message = date ("Y/m/d H:i:s")." [".$this->priorities[$priority]."] ". + $message; + echo "$message"; + if (php_sapi_name () !== "cli") + echo "
"; + echo "\n"; + } + + /** Log $message on syslog */ + private function logsyslog ($message, $priority) + { + openlog ($this->syslogPrefix, NULL, $this->syslogFacility); + syslog ($priority, $message); + } +}