00001 <?php
00017 require_once 'Zend/Log.php';
00018 require_once 'Zend/Log/Writer/Stream.php';
00019
00028 class logService extends MetaObject
00029 {
00046 private $_level;
00047
00053 private $_format;
00054
00063 private $_org;
00069 private $_formatter;
00075 private $_extension = '.csv';
00076
00077 private $_daystolive;
00084 public function __construct(&$xmlArr)
00085 {
00086 $this->readMetadata($xmlArr);
00087
00088 if (is_int($this->_level) == FALSE)
00089 return;
00090 $this->setFormatter();
00091 $this->setExtension();
00092 }
00093
00100 protected function readMetadata(&$xmlArr)
00101 {
00102 parent::readMetaData($xmlArr);
00103 $level = strtoupper($xmlArr["PLUGINSERVICE"]["LOG_CONFIG"]["ATTRIBUTES"]["LEVEL"]);
00104 $this->_level = (int) $level;
00105 $this->_format = strtoupper($xmlArr["PLUGINSERVICE"]["LOG_CONFIG"]["ATTRIBUTES"]["FORMAT"]);
00106 $this->_org = strtoupper($xmlArr["PLUGINSERVICE"]["LOG_CONFIG"]["ATTRIBUTES"]["ORG"]);
00107 $this->_daystolive = $xmlArr["PLUGINSERVICE"]["LOG_CONFIG"]["ATTRIBUTES"]["DAYSTOLIVE"]?strtoupper($xmlArr["PLUGINSERVICE"]["LOG_CONFIG"]["ATTRIBUTES"]["DAYSTOLIVE"]):'0';
00108 }
00109
00119 public function log($priority, $package, $message)
00120 {
00121 if (DEBUG == 0 && $priority == LOG_DEBUG)
00122 return true;
00123
00124 switch ($priority)
00125 {
00126 case LOG_EMERG :
00127 case LOG_ALERT :
00128 case LOG_CRIT :
00129 $level = 2;
00130 break;
00131 case LOG_ERR :
00132 $level = 3;
00133 break;
00134 case LOG_WARNING :
00135 $level = 4;
00136 break;
00137 case LOG_NOTICE :
00138 case LOG_INFO :
00139 case LOG_DEBUG :
00140 $level = 7;
00141 break;
00142 }
00143
00144
00145 if ($this->_level == FALSE)
00146 return true;
00147
00148 $this->_level = $level;
00149 $path = $this->_getPath($file_name);
00150 if(!is_file($path))
00151 {
00152 @touch($path);
00153 @chmod($path,0777);
00154 }
00155 if (!is_writable($path))
00156 return false;
00157 $this->prepFile($path);
00158
00159 $writer = new Zend_Log_Writer_Stream($path);
00160 $writer->setFormatter($this->_formatter);
00161
00162 $logger = new Zend_Log($writer);
00163
00164 $filter = new Zend_Log_Filter_Priority($this->_level);
00165 $logger->addFilter($filter);
00166
00167 $logger->setEventItem('back_trace', 'n/a');
00168 $logger->setEventItem('package', $package);
00169 $logger->setEventItem('date', date("m/d/Y"));
00170 $logger->setEventItem('time', date("H:i:s"));
00171
00172
00173 $logger->log($message, $level);
00174 $this->closeFile($path);
00175 return TRUE;
00176 }
00177
00189 public function logError($level = 7, $package, $message, $fileName = NULL, $backTrace = '')
00190 {
00191
00192 switch ($level)
00193 {
00194 case 8:
00195 case 1024:
00196 $level = 4;
00197 break;
00198
00199 case 2048:
00200 case 8192:
00201 case 16384:
00202 $level = 5;
00203 break;
00204
00205 case 2:
00206 case 512:
00207 $level = 3;
00208 break;
00209
00210 case 256:
00211 $level = 2;
00212 break;
00213
00214 default:
00215 $level = 2;
00216 }
00217
00218 if ($this->_level == FALSE)
00219 return true;
00220
00221 $this->_level = $level;
00222 $path = $this->_getPath($fileName);
00223 if (!is_writable($path))
00224 return false;
00225 $this->prepFile($path);
00226
00227
00228 $writer = new Zend_Log_Writer_Stream($path);
00229 $writer->setFormatter($this->_formatter);
00230
00231
00232 $logger = new Zend_Log($writer);
00233
00234
00235 $filter = new Zend_Log_Filter_Priority($this->_level);
00236 $logger->addFilter($filter);
00237
00238
00239
00240
00241 $logger->setEventItem('back_trace', $backTrace);
00242 $logger->setEventItem('package', $package);
00243 $logger->setEventItem('date', date("m/d/Y"));
00244 $logger->setEventItem('time', date("H:i:s"));
00245
00246 $logger->log($message, $level);
00247 $this->closeFile($path);
00248 return TRUE;
00249 }
00250
00256 public function setFormatter()
00257 {
00258 switch ($this->_format)
00259 {
00260 case 'HTML':
00261
00262 $this->_formatter = new Zend_Log_Formatter_Simple('<tr><td>%date%</td> <td>%time%</td> <td>%priorityName%</td> <td>%package%</td> <td>%message%</td> <td>%back_trace%</td> </tr>' . PHP_EOL);
00263 break;
00264 case 'XML':
00265
00266 require_once 'Zend/Log/Formatter/Xml.php';
00267 $this->_formatter = new Zend_Log_Formatter_Xml();
00268 break;
00269 case 'CSV':
00270 default:
00271
00272 $this->_formatter = new Zend_Log_Formatter_Simple("'%date%','%time%','%priorityName%','%package%','%message%','%back_trace%'" . PHP_EOL);
00273 break;
00274 }
00275 }
00281 public function setExtension()
00282 {
00283 switch ($this->_format)
00284 {
00285 case 'HTML':
00286 $this->_extension = '.html';
00287 break;
00288 case 'XML':
00289 $this->_extension = '.xml';
00290 break;
00291 case 'CSV':
00292 default:
00293 $this->_extension = '.log';
00294 break;
00295 }
00296 }
00302 public function prepFile($path)
00303 {
00304
00305 if (file_exists($path) and $this->_format == 'HTML')
00306 {
00307 $file = file($path);
00308 array_pop($file);
00309 file_put_contents($path, $file);
00310 } elseif ($this->_format == 'HTML')
00311 {
00312 $html = '<html><head></head><body><table border="1">' . PHP_EOL;
00313 $file = fopen($path, 'a');
00314 fwrite($file, $html);
00315 fclose($file);
00316 } elseif (file_exists($path) and $this->_format == 'XML')
00317 {
00318 $file = file($path);
00319 array_pop($file);
00320 file_put_contents($path, $file);
00321 } elseif ($this->_format == 'XML')
00322 {
00323 $xml = '<?xml version="1.0" standalone="no"?><log>' . PHP_EOL;
00324 $file = fopen($path, 'a');
00325 fwrite($file, $xml);
00326 fclose($file);
00327 }
00328 }
00329
00335 public function closeFile($path)
00336 {
00337
00338 switch ($this->_format)
00339 {
00340 case 'HTML':
00341 $html = "</table></body></html>";
00342 $file = fopen($path, 'a');
00343 fwrite($file, $html);
00344 fclose($file);
00345 break;
00346 case 'XML':
00347 $xml = "</log>";
00348 $file = fopen($path, 'a');
00349 fwrite($file, $xml);
00350 fclose($file);
00351 break;
00352 default:
00353 break;
00354 }
00355 }
00356
00364 private function _getPath($fileName = null)
00365 {
00366 $level = $this->_level;
00367 if ($fileName)
00368 return LOG_PATH . '/' . $fileName . $this->_extension;
00369 switch ($this->_org)
00370 {
00371 case 'DATE':
00372 return LOG_PATH . '/' . date("Y_m_d") . $this->_extension;
00373 break;
00374 case 'LEVEL':
00375 $level = $this->_level2filename($level);
00376 return LOG_PATH . '/' . $level . $this->_extension;
00377 break;
00378 case 'LEVEL-DATE':
00379 $level = $this->_level2filename($level);
00380
00381 if($this->_daystolive>0){
00382 foreach (glob(LOG_PATH . '/' . $level .'-*' . $this->_extension) as $filename) {
00383 $mtime = filemtime($filename);
00384 if((time() - $mtime) >= $this->_daystolive*86400 ){
00385 @unlink($filename);
00386 }
00387 }
00388 }
00389 return LOG_PATH . '/' . $level .'-'. date("Y_m_d") . $this->_extension;
00390 break;
00391 case 'PROFILE':
00392 $profile = BizSystem::getUserProfile('USERID');
00393 if (! $profile)
00394 $profile = 'Guest';
00395 return LOG_PATH . '/' . $profile . $this->_extension;
00396 break;
00397 default:
00398 ;
00399 break;
00400 }
00401 }
00402
00403 private function _level2filename($level)
00404 {
00405 switch ($this->_level)
00406 {
00407 case 0:
00408 $level = 'EMERG';
00409 break;
00410 case 1:
00411 $level = 'ALERT';
00412 break;
00413 case 2:
00414 $level = 'CRIT';
00415 break;
00416 case 3:
00417 $level = 'ERR';
00418 break;
00419 case 4:
00420 $level = 'WARN';
00421 break;
00422 case 5:
00423 $level = 'NOTICE';
00424 break;
00425 case 6:
00426 $level = 'INFO';
00427 break;
00428 case 7:
00429 $level = 'DEBUG';
00430 break;
00431 default:
00432 ;
00433 break;
00434 }
00435 return $level;
00436 }
00437 }