File indexing completed on 2024-04-14 15:55:13

0001 <?php
0002 
0003 /**
0004  * Flooer Framework
0005  *
0006  * LICENSE: BSD License (2 Clause)
0007  *
0008  * @category    Flooer
0009  * @package     Flooer_Log
0010  * @author      Akira Ohgaki <akiraohgaki@gmail.com>
0011  * @copyright   Akira Ohgaki
0012  * @license     https://opensource.org/licenses/BSD-2-Clause  BSD License (2 Clause)
0013  * @link        https://github.com/akiraohgaki/flooer
0014  */
0015 
0016 /**
0017  * Usage
0018  *
0019  * $log = new Flooer_Log();
0020  * $log->setFile('./errors.log');
0021  * $log->setMail('email@address');
0022  * $log->log('Message', LOG_ERR);
0023  */
0024 
0025 /**
0026  * Error logger class
0027  *
0028  * @category    Flooer
0029  * @package     Flooer_Log
0030  * @author      Akira Ohgaki <akiraohgaki@gmail.com>
0031  */
0032 class Flooer_Log
0033 {
0034 
0035     /**
0036      * Configuration options
0037      *
0038      * @var     array
0039      */
0040     protected $_config = array(
0041         'format' => '%timestamp% %priorityName% (%priority%): %message%',
0042         'file' => null,
0043         'fileMaxLength' => 1024,
0044         'mail' => null,
0045         'mailAdditionalHeaders' => null,
0046         'mailFilter' => LOG_ERR
0047     );
0048 
0049     /**
0050      * Priorities
0051      *
0052      * @var     array
0053      */
0054     protected $_priorities = array(
0055         LOG_EMERG => 'EMERG',
0056         LOG_ALERT => 'ALERT',
0057         LOG_CRIT => 'CRIT',
0058         LOG_ERR => 'ERR',
0059         LOG_WARNING => 'WARN',
0060         LOG_NOTICE => 'NOTICE',
0061         LOG_INFO => 'INFO',
0062         LOG_DEBUG => 'DEBUG'
0063     );
0064 
0065     /**
0066      * Error log
0067      *
0068      * @var     array
0069      */
0070     protected $_errorLog = array();
0071 
0072     /**
0073      * Constructor
0074      *
0075      * @param   array $config
0076      * @return  void
0077      */
0078     public function __construct(array $config = null)
0079     {
0080         if ($config) {
0081             $this->_config = $config + $this->_config;
0082         }
0083     }
0084 
0085     /**
0086      * Write a log and/or send an email notification
0087      *
0088      * @param   string $message
0089      * @param   int $priority Available values: 0-7 (LOG_EMERG-LOG_DEBUG)
0090      * @return  bool
0091      */
0092     public function log($message, $priority = null)
0093     {
0094         if ($priority === null) {
0095             $priority = LOG_NOTICE;
0096         }
0097         if (isset($this->_priorities[$priority])) {
0098             $log = $this->_config['format'];
0099             $log = str_replace('%timestamp%', date('c'), $log);
0100             $log = str_replace('%priorityName%', $this->_priorities[$priority], $log);
0101             $log = str_replace('%priority%', $priority, $log);
0102             $log = str_replace('%message%', $message, $log);
0103             $log .= "\n";
0104             $this->_errorLog[] = $log;
0105             $bool = false;
0106             if ($this->_config['file']
0107                 && is_dir(dirname($this->_config['file']))
0108             ) {
0109                 ini_set('log_errors', 1);
0110                 ini_set('log_errors_max_len', $this->_config['fileMaxLength']);
0111                 //ini_set('error_log', $this->_config['file']);
0112                 $bool = error_log($log, 3, $this->_config['file']);
0113             }
0114             if ($this->_config['mail']
0115                 && $priority <= $this->_config['mailFilter']
0116             ) {
0117                 $bool = mail(
0118                     $this->_config['mail'],
0119                     __CLASS__ . ' message',
0120                     wordwrap($log, 70),
0121                     $this->_config['mailAdditionalHeaders']
0122                 );
0123             }
0124             return $bool;
0125         }
0126         return false;
0127     }
0128 
0129     /**
0130      * Set a log format
0131      *
0132      * @param   string $format
0133      * @return  void
0134      */
0135     public function setFormat($format)
0136     {
0137         $this->_config['format'] = $format;
0138     }
0139 
0140     /**
0141      * Get a log format
0142      *
0143      * @return  string
0144      */
0145     public function getFormat()
0146     {
0147         return $this->_config['format'];
0148     }
0149 
0150     /**
0151      * Set the path of a log file
0152      *
0153      * @param   string $path
0154      * @return  void
0155      */
0156     public function setFile($path)
0157     {
0158         $this->_config['file'] = $path;
0159     }
0160 
0161     /**
0162      * Get the path of a log file
0163      *
0164      * @return  string
0165      */
0166     public function getFile()
0167     {
0168         return $this->_config['file'];
0169     }
0170 
0171     /**
0172      * Set the max length of a log file
0173      *
0174      * @param   int $maxLength
0175      * @return  void
0176      */
0177     public function setFileMaxLength($maxLength)
0178     {
0179         $this->_config['fileMaxLength'] = $maxLength;
0180     }
0181 
0182     /**
0183      * Get the max length of a log file
0184      *
0185      * @return  int
0186      */
0187     public function getFileMaxLength()
0188     {
0189         return $this->_config['fileMaxLength'];
0190     }
0191 
0192     /**
0193      * Set an email address
0194      *
0195      * @param   string $mail
0196      * @return  void
0197      */
0198     public function setMail($mail)
0199     {
0200         $this->_config['mail'] = $mail;
0201     }
0202 
0203     /**
0204      * Get an email address
0205      *
0206      * @return  string
0207      */
0208     public function getMail()
0209     {
0210         return $this->_config['mail'];
0211     }
0212 
0213     /**
0214      * Set the additional headers of an email
0215      *
0216      * @param   string $additionalHeaders
0217      * @return  void
0218      */
0219     public function setMailAdditionalHeaders($additionalHeaders)
0220     {
0221         $this->_config['mailAdditionalHeaders'] = $additionalHeaders;
0222     }
0223 
0224     /**
0225      * Get the additional headers of an email
0226      *
0227      * @return  string
0228      */
0229     public function getMailAdditionalHeaders()
0230     {
0231         return $this->_config['mailAdditionalHeaders'];
0232     }
0233 
0234     /**
0235      * Set the level of an email notification
0236      *
0237      * @param   int $level Available values: 0-7 (LOG_EMERG-LOG_DEBUG)
0238      * @return  void
0239      */
0240     public function setMailFilter($level)
0241     {
0242         $this->_config['mailFilter'] = $level;
0243     }
0244 
0245     /**
0246      * Get the level of an email notification
0247      *
0248      * @return  int
0249      */
0250     public function getMailFilter()
0251     {
0252         return $this->_config['mailFilter'];
0253     }
0254 
0255     /**
0256      * Get an error log
0257      *
0258      * @return  array
0259      */
0260     public function getErrorLog()
0261     {
0262         return $this->_errorLog;
0263     }
0264 
0265 }