如何在PHP中实现错误记录器文件



我在PHP中创建了一个错误记录器文件并从邮件索引调用它.php当我尝试记录调用Web API期间发生的错误时,文件,错误记录器文件未创建,也无法错误进入记录器文件,任何人都可以帮助我吗?

掠夺者.php

<?php
class Logger {
static $directoryName = 'log/';
static $fileName = 'error.json';
public static function init() {
function handleError($code, $description, $file = null, $line = null, $context = null) {
list($error, $log) = mapErrorCode($code);
throw new LoggerException($description, $code, $file, $line, $context, $log, $error);
}
function handleException($ex) {
throw new LoggerException($ex->getMessage(), $ex->getCode(), $ex->getFile(), $ex->getLine());
}
function mapErrorCode($code) {
$error = $log = null;
switch ($code) {
case E_PARSE:
case E_ERROR:
case E_CORE_ERROR:
case E_COMPILE_ERROR:
case E_USER_ERROR:
$error = 'Fatal Error';
$log = LOG_ERR;
break;
case E_WARNING:
case E_USER_WARNING:
case E_COMPILE_WARNING:
case E_RECOVERABLE_ERROR:
$error = 'Warning';
$log = LOG_WARNING;
break;
case E_NOTICE:
case E_USER_NOTICE:
$error = 'Notice';
$log = LOG_NOTICE;
break;
case E_STRICT:
$error = 'Strict';
$log = LOG_NOTICE;
break;
case E_DEPRECATED:
case E_USER_DEPRECATED:
$error = 'Deprecated';
$log = LOG_NOTICE;
break;
default :
break;
}
return array($error, $log);
}
error_reporting(E_ALL);
ini_set("display_errors", "off");            
set_error_handler("handleError");
set_exception_handler("handleException");
}
public static function save($e, $customMessage = '', $customData = []) {
if (!isset($e)) {
$bt = debug_backtrace();
$caller = array_shift($bt);
if (isset($caller)) {
$e = new LoggerException($customMessage, 0, $caller['file'], $caller['line'], null, null, 'NoException');
} else {
$e = new LoggerException($customMessage, 0, null, null, null, null, 'NoException');
}
}
date_default_timezone_set('Asia/Kolkata');
$logData = Logger::get($e, $customMessage, $customData);            
$now = date('d_m_Y');
$directoryName = Logger::$directoryName;
$fileName = Logger::$fileName;
if (!file_exists($directoryName)) {
mkdir($directoryName);
}
$fileName = $directoryName . $now . '_' . $fileName;  
if (!file_exists($fileName)) {
$file = fopen($fileName, "w");
fclose($file);
}
$jsonData = file_get_contents($fileName);
$arrayData = json_decode($jsonData, true);
if (!isset($arrayData)) {
$arrayData = [];                
}
array_push($arrayData, $logData);
$jsonData = json_encode($arrayData, JSON_PRETTY_PRINT);
return file_put_contents($fileName, $jsonData);
}
public static function get($e, $customMessage = '', $customData = []) {
$error = get_class($e) == 'LoggerException' ? $e->getError() : get_class($e);
$context = [
'HTTP_HOST'          => $_SERVER['HTTP_HOST'],
'HTTP_CONNECTION'    => $_SERVER['HTTP_CONNECTION'],
'HTTP_USER_AGENT'    => $_SERVER['HTTP_USER_AGENT'],                
'REMOTE_ADDR'        => $_SERVER['REMOTE_ADDR'],                
'REMOTE_PORT'        => $_SERVER['REMOTE_PORT'],
'REQUEST_SCHEME'     => $_SERVER['REQUEST_SCHEME'],
'REQUEST_METHOD'     => $_SERVER['REQUEST_METHOD'],
'REQUEST_URI'        => $_SERVER['REQUEST_URI'],
'QUERY_STRING'       => $_SERVER['QUERY_STRING'],
'PHP_SELF'           => $_SERVER['PHP_SELF'],
'REQUEST_TIME_FLOAT' => $_SERVER['REQUEST_TIME_FLOAT'],
'REQUEST_TIME'       => $_SERVER['REQUEST_TIME'],
'GET'                => $_GET,
'POST'               => $_POST,
'POST_BODY'          => file_get_contents('php://input'),
'FILES'              => $_FILES,
'COOKIE'             => $_COOKIE,                
];
return array(
'level' => $error,
'code' => $e->getCode(),
'error' => $error,
'description' => $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine(),        
'date' => date('d-m-Y h:i:s a'),        
'message' => $error . ' (' . $e->getCode() . '): ' . $e->getMessage() . ' in [' . $e->getFile() . ', line ' . $e->getLine() . ']',
'customMessage' => $customMessage,
'customData' => $customData,
'context' => $context
);
}
}
class LoggerException extends ErrorException {
private $context = null;
private $log = null;
private $error = null;
function __construct($description, $code, $file = null, $line = null, $context = null, $log = null, $error = null) {
parent::__construct($description, 0, $code, $file, $line);
$this->context = $context;
$this->log = $log;
$this->error = $error;
}
public function getContext() {
return $this->context;
}
public function getLog() {
return $this->log;
}
public function getError() {
return $this->error;
}
}
Logger::init();
?>

索引.php

<?php
include_once './api/logger.php';

$url = 'http://localhost/jwt_api/api/login1.php';
//open connection
$postdata = json_encode($data);
//print_r($postdata);
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Access-Control-Allow-Origin: *', 'Content-Type: application/json', 'Access-Control-Allow-Methods: POST', 'Access-Control-Max-Age: 3600'));
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$output = curl_exec($ch);
$result = json_decode($output);
if ($result->message == 'Successful login') {
$jwtname = "Access";
$jwt = $result->jwt;
setcookie($jwtname, $jwt, time() + (86400 * 30), "/");
header("location:create.php");
}
} catch (Exception $e) {
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
//echo $http_code;
//trigger_error("Number cannot be less than 10");
//Logger::save($e);
curl_close($ch);

如上所示,$http_code 返回错误响应代码,现在我想在我的记录器.php文件中记录该错误,我尝试trigger_error和 Logger:: save(( 方法,但无法记录我的自定义错误

每当我们直接定义文件路径时,就像在您的案例中一样"error.json",如果我们没有指定其他目录位置,我们假设它必须在当前目录中创建,但通常它不会发生。

我也遇到过很多时间,因为它总是在其他位置创建文件。这就是在PHP中引入DIR的原因。

通过使用DIR,您可以获取当前目录的位置,然后创建文件,如下所示:

$file = __DIR__.'/error.json';

这将在当前目录中创建 error.json,并保证。但是,如果要在日志目录中创建它,请首先通过在项目的配置文件中定义全局变量来指定日志目录的位置,如下所示:

define("LOG", (dirname(dirname(__DIR__)));

根据需要尽可能多地使用dirname。就像如果有层次结构 var->log 和 var->log->html->你的项目>config.php那么你将使用 dirname 2 次,就像上面一样,因为日志和配置文件目录之间有 2 个目录间隙。

创建 LOG 全局变量后,您可以在项目的任何文件中使用它,并且始终使用以下方法获取正确的路径,无论文件位置如何:

$file = LOG.'/error.json';

最新更新