标签:php error-logging
我有Logger-Class,它记录了所有内容.将使用print_r将对象记录到人类可读状态.我的问题是我有一个很大的MVC-Object.每次发生异常或错误时,MVC对象也将打印在Log by print_r中.这会导致非常长的Logfile对读取起来不太友好.
我试图将__toString()方法设置为我的MVC-Class,但这不起作用.我也在Log中获得了完整的MVC-Object. MVC是一个Singleton,并在每个Object上引用.因此,在进入print_r之前简单地排除Object并不容易.
有没有办法从print_r中排除对象?
我的方法:
LOG-Class errorHandler-Method:
public static function errorHandler($errno, $errstr, $errfile, $errline, $vars) {
//If @ is set, don't do anything!
if(error_reporting() === 0) {
return;
}
//Get StackTrace with low memory usage ;)
$e = new Exception();
$stackStr = $e->getTraceAsString();
//Build ErrorMessage for Log
$message = 'File: '.$errfile.' - L: '.$errline."\n".
'Code: '.$errno."\n".
'Message: '.$errstr."\n".
'Vars: '.print_r($vars, true)."\n".
'Stacktrace: '.$stackStr;
self::error($message);
}
LOG-Class exceptionHandler-Method:
public static function exceptionHandler(Exception $e) {
$message = get_class($e).': '.$e->getMessage()."\n".
'File: '.$e->getFile().' - L: '.$e->getLine()."\n".
'Code: '.$e->getCode()."\n".
'Message: '.$e->getMessage()."\n".
'Stacktrace: '.$e->getTraceAsString();
self::error($message);
}
LOG-Class错误 – 方法:
public static function error($data, $file='system.log') {
$config = Megaira_PropertyConfiguration::getInstance();
switch($config->get('LOG_MODE')) {
case'DEEPDEBUG':
case'ERROR':
case'WARNING':
case'INFO':
case'DEBUG':
self::writeToLog('ERROR', $data, $file);
break;
}
}
LOG-Class writeToLog-Method:
private static function writeToLog($mode='', $text='', $file=''){
if(!is_string($text) && !is_numeric($text)) {
$text = print_r($text, true);
}
$config = Megaira_PropertyConfiguration::getInstance();
if(!$config->get('LOGGINGACTIVE')) { return; }
self::writeLineToFile($mode, $text, $file);
}
设置错误和异常处理程序:
//Set Error and Exception Handler
set_error_handler(array(new LOG(), 'errorHandler'));
set_exception_handler(array(new LOG(), 'exceptionHandler'));
谢谢
一些测试:
public static function print_r_filtered($object, $ret=false) {
$filtered = array(
'Megaira_MVC'
);
$text = print_r($object, true);
foreach($filtered as $filter) {
$search = '#('.$filter.'\sObject)\n(\s+)\).*?\n\2\)\n#s';
$replace = "$1";
$text = preg_replace($search, $replace, $text);
}
if($ret)
return $text;
echo $text;
}
不工作.也许RegEx失败了吗?
解:
这是一个设计缺陷. errorHandler是记录发生错误的位置上使用的所有对象.所以在index.php中有以下代码:
$mvc = Megaira_MVC::getInstance();
因此,这种代码的平衡通过LOG-Class中的errorHandler生成了带有print_r的Var $mvc的日志记录.
结论对我来说:不要在大单例对象上使用变量,或者如果不再需要Var,则使用unset().
解决方法:
当对象转换为字符串时,将调用__toString().你可以试试像
$objectString = method_exists($object, '__toString')
? (string) $object
: print_r($object, true);
如果值是对象,则使用is_object()查找.
完全没有
$string = !is_object($value) || method_exists($value, '__toString')
? (string) $value
: print_r($value, true);
标签:php,error-logging
来源: https://codeday.me/bug/20190630/1338752.html
本站声明:
1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。