sagacity/classes/error.inc
2018-05-07 10:51:08 -04:00

221 lines
6.4 KiB
PHP

<?php
/**
* File: error.inc
* Author: Ryan Prather
* Purpose: This file will contain the error handler for the ST&E Manager
* Created: Jun 18, 2014
*
* Portions Copyright 2016-2017: Cyber Perspectives, LLC, All rights reserved
* Released under the Apache v2.0 License
*
* Portions Copyright (c) 2012-2015, Salient Federal Solutions
* Portions Copyright (c) 2008-2011, Science Applications International Corporation (SAIC)
* Released under Modified BSD License
*
* See license.txt for details
*
* Change Log:
* - Jun 18, 2014 - File created
* - Jul 29, 2014 - Added script log functionality
* - Sep 05, 2014 - Fixed bug with realpath returning false for absent file
* - Oct 24, 2016 - Converted Sagacity_Error::E_DEBUG constant to global constant (define)
* Added "DEBUG" output to all functions
* - Nov 7, 2016 - Added timestamp to debug prints and updated copyright to include CP
* - Nov 9, 2016 - Changed err_handler to use sagacity.log and write to file using file_put_contents
* - Nov 16, 2016 - Changed sql_handler to write to file using file_put_contents
* - Dec 7, 2016 - Fixed sql_handler, err_handler, and script_log to only print out on E_DEBUG when using cli and use PHP_EOL
* - Mar 3, 2017 - Formatting
* - Mar 22, 2017 - Check that log file is writable in constructor
* - May 13, 2017 - Added check in script_log, err_handler, and sql_handler functions to check that LOG_LEVEL = E_DEBUG
*/
require 'vendor/autoload.php';
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
use Monolog\Formatter\LineFormatter;
/**
* Represents the error object to do error handling
*
* @author Ryan Prather
*/
class Sagacity_Error extends Logger
{
/**
* File handle
*
* @var resource
*/
private $fh = null;
/**
* Log file name
*
* @var string
*/
private $fname = '';
/**
* Constructor
*
* @param string $fname_in
*/
public function __construct($fname_in)
{
$this->fname = preg_replace("/[\.][^\.]+$/", '', basename($fname_in));
if (!file_exists(LOG_PATH . "/{$this->fname}.log")) {
touch(LOG_PATH . "/{$this->fname}.log");
}
if (!is_writeable(LOG_PATH . "/{$this->fname}.log")) {
self::err_handler("File " . realpath(LOG_PATH) . "/{$this->fname}.log is not writable", E_ERROR);
}
$log_level = Logger::ERROR;
switch(LOG_LEVEL) {
case E_WARNING:
$log_level = Logger::WARNING;
break;
case E_NOTICE:
$log_level = Logger::INFO;
break;
case E_DEBUG:
$log_level = Logger::DEBUG;
break;
}
$this->fh = new Logger($this->fname);
$this->fh->pushHandler(new StreamHandler(LOG_PATH . "/{$this->fname}.log", $log_level));
if(PHP_SAPI == 'cli') {
$stream = new StreamHandler("php://output", $log_level);
$stream->setFormatter(new LineFormatter("%datetime% %level_name% %message%\n", "H:i:s.u"));
$this->fh->pushHandler($stream);
}
}
/**
* Function to write to SQL error log file
*
* @param string $sql
* SQL line that is the problem
* @param integer $errno [optional]
* Error number (Default is E_NOTICE)
*/
public static function sql_handler($sql, $errno = E_NOTICE)
{
if (!file_exists(LOG_PATH . "/sql_log")) {
touch(LOG_PATH . "/sql_log");
}
$dt = new DateTime();
$errlvl = 'NOTICE';
switch ($errno) {
case E_USER_WARNING:
case E_WARNING:
$errlvl = "WARNING";
break;
case E_USER_ERROR:
case E_ERROR:
$errlvl = "ERROR";
break;
case E_DEBUG:
$errlvl = "DEBUG";
break;
default:
}
$errmsg = "{$dt->format(DateTime::ISO8601)} - $errlvl - $sql" . PHP_EOL;
file_put_contents(realpath(LOG_PATH . "/sql_log"), $errmsg, FILE_APPEND);
if ($errno == E_ERROR) {
die($sql . PHP_EOL);
}
elseif ($errno == E_DEBUG && LOG_LEVEL == E_DEBUG && substr(php_sapi_name(), 0, 3) == 'cli') {
print $errmsg;
}
}
/**
* Function to write application error to log file
*
* @param string $errmsg
* Error message to write
* @param integer $errno [optional]
* Error number (Default is E_NOTICE)
*/
public static function err_handler($errmsg, $errno = E_NOTICE)
{
if (!file_exists(LOG_PATH . "/sagacity.log")) {
touch(LOG_PATH . "/sagacity.log");
}
$dt = new DateTime();
$str = "{$dt->format(DateTime::ISO8601)} - ";
switch ($errno) {
case E_USER_WARNING:
case E_WARNING:
$str .= "WARNING";
break;
case E_USER_ERROR:
case E_ERROR:
$str .= "ERROR";
break;
case E_USER_NOTICE:
case E_NOTICE:
$str .= "NOTICE";
break;
case E_DEBUG:
$str .= "DEBUG";
break;
default:
}
file_put_contents(realpath(LOG_PATH . "/sagacity.log"), "$str - $errmsg" . PHP_EOL, FILE_APPEND);
if ($errno == E_ERROR || $errno == E_USER_ERROR) {
die($errmsg . PHP_EOL);
}
if ($errno == E_DEBUG && LOG_LEVEL == E_DEBUG && substr(php_sapi_name(), 0, 3) == 'cli') {
print "$str - $errmsg" . PHP_EOL;
}
}
/**
* Function to output a message to the script log file
*
* @param string $errmsg
* @param integer $errno [optional]
*/
public function script_log($errmsg, $errno = E_NOTICE)
{
if (!is_a($this->fh, "Monolog\Logger")) {
return;
}
switch($errno) {
case E_ERROR:
$this->fh->error($errmsg);
die;
break;
case E_WARNING:
$this->fh->warning($errmsg);
break;
case E_NOTICE:
$this->fh->info($errmsg);
break;
case E_DEBUG:
$this->fh->debug($errmsg);
break;
default:
$this->fh->emergency($errmsg);
die;
}
}
}