27 foreach($this->handlers as &$config){
28 if(!$config) $config = [];
29 $prio = $config[
'prio'] ??
null;
30 if(!array_key_exists(
'prios',$config) || ($prio !==
null))
31 $config[
'prios'] = array_merge($config[
'prios'] ?? [],range($prio ?: self::DEBUG,self::CUSTOM - 1));
41 if(!is_array($this->handlers[$name])) $this->handlers[$name] = [];
42 if(!array_key_exists(
null,$config =& $this->handlers[$name])){
43 $class_name = \Rsi\Record::get($config,
'className',__CLASS__ .
'\\Handler\\' . ucfirst($name));
44 $config[
null] =
new $class_name($this,$config,$name);
53 public function has($name){
54 return array_key_exists($name,$this->handlers) ? $this->
handler($name) :
false;
57 protected function context($filename,$line_no,$trace,$context){
58 return is_array($filename)
60 : array_merge(array_filter([
'*filename' => $filename,
'*lineNo' => $line_no,
'*trace' => $trace]),$context ?: []);
72 public function add($prio,$message,$filename =
null,$line_no =
null,$context =
null){
73 if($this->
break && preg_match($this->
break,$message))
throw new \Exception(
'[break]');
74 if(!$this->_busy)
try{
77 foreach($this->handlers as $name => $config)
if(in_array($prio,$config[
'prios']))
try{
82 $context = $filename ?: [];
83 $filename = $message->getFile();
84 $line_no = $message->getLine();
85 $trace = $message->getTraceAsString();
86 $message = $message->getMessage();
89 $subject = implode(
'#',[
90 \
Rsi\Record::get($context,
'remoteAddr') ?: $this->
component(
'security')->remoteAddr,
91 $_SERVER[
'HTTP_USER_AGENT'] ??
null,
92 is_string($filename) ? $filename :
null,
95 foreach($this->convert as $filter =>
$convert)
if(preg_match($filter,$subject)){
101 foreach($this->
context($filename,$line_no,$trace,$context) as $key => $value){
102 if(substr($key,0,1) ==
'@') $value = call_user_func($value,$key = substr($key,1));
103 $parsed[$key] = $value;
106 $this->
handler($name)->add($prio,$message,$parsed);
109 if($this->_fred->debug)
throw $e;
113 $this->_busy =
false;
125 public function start($prio,$message,$filename =
null,$line_no =
null,$context =
null){
126 $context = $this->
context($filename,$line_no,
null,$context);
127 $this->_timers[$id = \Rsi\Str::random()] = compact(
'prio',
'message',
'context');
128 $this->
add($prio,$message,[
'*start' => $id] + $context);
142 public function point($id,$prio,$message,$filename =
null,$line_no =
null,$context =
null,$type =
'*point'){
143 $timer = $this->_timers[$id] ?? [];
145 $prio ===
null ? $timer[
'prio'] ?? self::DEBUG : $prio,
147 [$type => $id] + (($filename ===
null) && ($line_no ===
null) && ($context ===
null)
148 ? $timer[
'context'] ?? []
149 : $this->
context($filename,$line_no,
null,$context)
163 public function stop($id,$prio =
null,$message =
null,$filename =
null,$line_no =
null,$context =
null){
164 if($message ===
null) $message =
'[stop] ' . ($timer[
'message'] ??
null);
165 $this->
point($id,$prio,$message,$filename,$line_no,$context,
'*stop');
172 public function __call($func_name,$params){
173 array_unshift($params,constant(
'self::' . strtoupper($func_name)));
174 call_user_func_array([$this,
'add'],$params);
177 public function __invoke($message,$filename =
null,$line_no =
null,$context =
null){
178 $this->
add(self::DEBUG,$message,$filename,$line_no,$context);