开发者

Excluding objects when print_r()ing variables in a custom logger

开发者 https://www.devze.com 2023-03-09 07:45 出处:网络
I have Logger-Class which is logging everything.Objects will be logged with print_r to a human-readable state.My Problem is that I have a big MVC-Object. Everytime an Exception or Error occurs, the MV

I have Logger-Class which is logging everything. Objects will be logged with print_r to a human-readable state. My Problem is that I have a big MVC-Object. Everytime an Exception or Error occurs, the MVC-Object will also be printed in the Log by print_r. This results in a very very long Logfile that is not really friendly to read.

I tried to set a __toString() method to my MVC-Class but this don't work. I also get the complete MVC-Object in Log. The MVC is a Singleton and is referenced on every Object. So to simple exclude the Object before it cames into the print_r is not that easy.

Is there any way to exclude Objects from prin开发者_Python百科t_r?

My Methods:

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 error-Method:

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);
}

Setup the Error- and Exception-handler:

        //Set Error and Exception Handler
        set_error_handler(array(new LOG(), 'errorHandler'));
        set_exception_handler(array(new LOG(), 'exceptionHandler'));

Thanks

Some Testing:

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;
        }

Did not work. Maybe RegEx fail?

Solution:

It was a Design flaw. The errorHandler is Logging all Objects that are used on the place the error occurs. So in the index.php are the following code:

$mvc = Megaira_MVC::getInstance();

So this peace of code produced a logging of the Var $mvc with print_r through the errorHandler in LOG-Class.

Conclusion for me: Don't use Variables on big Singleton-Objects or use unset() if the Var is not needed anymore.


__toString() is called, when the object is casted to a string. You may try something like

$objectString = method_exists($object, '__toString')
              ? (string) $object
              : print_r($object, true);

Use is_object() to find out, if a value is an object or not.

At all

$string = !is_object($value) || method_exists($value, '__toString')
        ? (string) $value
        : print_r($value, true);


You could wrap print_r with your own function that checks whether the provided data includes any objects, using the is_object() function. Similarly, you could use is_a() if you only want to exclude certain classes of objects.


as a html solution you can use:

<pre><?=print_r(log_content);?></pre>

to display your log file better. I am displaying the log files in this way.


if (is_object( $foo ))
{
  print_r( $foo->__toString() );
} else {
  print_r( $foo );
}


If you can alter the Logger class, you can check for the class befpre you print it:

if(!($var instanceof HeavyMVCObject)){
    print_r($var);
}
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号