You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
105 lines
2.5 KiB
105 lines
2.5 KiB
<?php |
|
/** |
|
* @link http://www.yiiframework.com/ |
|
* @copyright Copyright (c) 2008 Yii Software LLC |
|
* @license http://www.yiiframework.com/license/ |
|
*/ |
|
|
|
namespace yii\debug; |
|
|
|
use Yii; |
|
use yii\log\Target; |
|
|
|
/** |
|
* The debug LogTarget is used to store logs for later use in the debugger tool |
|
* |
|
* @author Qiang Xue <qiang.xue@gmail.com> |
|
* @since 2.0 |
|
*/ |
|
class LogTarget extends Target |
|
{ |
|
/** |
|
* @var Module |
|
*/ |
|
public $module; |
|
public $tag; |
|
|
|
/** |
|
* @param \yii\debug\Module $module |
|
* @param array $config |
|
*/ |
|
public function __construct($module, $config = []) |
|
{ |
|
parent::__construct($config); |
|
$this->module = $module; |
|
$this->tag = uniqid(); |
|
} |
|
|
|
/** |
|
* Exports log messages to a specific destination. |
|
* Child classes must implement this method. |
|
*/ |
|
public function export() |
|
{ |
|
$path = $this->module->dataPath; |
|
if (!is_dir($path)) { |
|
mkdir($path); |
|
} |
|
$indexFile = "$path/index.data"; |
|
if (!is_file($indexFile)) { |
|
$manifest = []; |
|
} else { |
|
$manifest = unserialize(file_get_contents($indexFile)); |
|
} |
|
$request = Yii::$app->getRequest(); |
|
$manifest[$this->tag] = $summary = [ |
|
'tag' => $this->tag, |
|
'url' => $request->getAbsoluteUrl(), |
|
'ajax' => $request->getIsAjax(), |
|
'method' => $request->getMethod(), |
|
'ip' => $request->getUserIP(), |
|
'time' => time(), |
|
]; |
|
$this->gc($manifest); |
|
|
|
$dataFile = "$path/{$this->tag}.data"; |
|
$data = []; |
|
foreach ($this->module->panels as $id => $panel) { |
|
$data[$id] = $panel->save(); |
|
} |
|
$data['summary'] = $summary; |
|
file_put_contents($dataFile, serialize($data)); |
|
file_put_contents($indexFile, serialize($manifest)); |
|
} |
|
|
|
/** |
|
* Processes the given log messages. |
|
* This method will filter the given messages with [[levels]] and [[categories]]. |
|
* And if requested, it will also export the filtering result to specific medium (e.g. email). |
|
* @param array $messages log messages to be processed. See [[Logger::messages]] for the structure |
|
* of each message. |
|
* @param boolean $final whether this method is called at the end of the current application |
|
*/ |
|
public function collect($messages, $final) |
|
{ |
|
$this->messages = array_merge($this->messages, $messages); |
|
if ($final) { |
|
$this->export($this->messages); |
|
} |
|
} |
|
|
|
protected function gc(&$manifest) |
|
{ |
|
if (count($manifest) > $this->module->historySize + 10) { |
|
$n = count($manifest) - $this->module->historySize; |
|
foreach (array_keys($manifest) as $tag) { |
|
$file = $this->module->dataPath . "/$tag.data"; |
|
@unlink($file); |
|
unset($manifest[$tag]); |
|
if (--$n <= 0) { |
|
break; |
|
} |
|
} |
|
} |
|
} |
|
}
|
|
|