diff --git a/framework/yii/YiiBase.php b/framework/yii/YiiBase.php
index d91df88..42286ec 100644
--- a/framework/yii/YiiBase.php
+++ b/framework/yii/YiiBase.php
@@ -26,12 +26,6 @@ defined('YII_DEBUG') or define('YII_DEBUG', false);
*/
defined('YII_ENV') or define('YII_ENV', 'prod');
/**
- * This constant defines how much call stack information (file name and line number) should be logged by Yii::trace().
- * Defaults to 0, meaning no backtrace information. If it is greater than 0,
- * at most that number of call stacks will be logged. Note, only user application call stacks are considered.
- */
-defined('YII_TRACE_LEVEL') or define('YII_TRACE_LEVEL', 0);
-/**
* This constant defines the framework installation directory.
*/
defined('YII_PATH') or define('YII_PATH', __DIR__);
diff --git a/framework/yii/debug/assets/main.css b/framework/yii/debug/assets/main.css
index 90400e1..de3c631 100644
--- a/framework/yii/debug/assets/main.css
+++ b/framework/yii/debug/assets/main.css
@@ -36,3 +36,10 @@
span.indent {
color: #ccc;
}
+
+ul.trace {
+ font-size: 12px;
+ color: #666;
+ margin: 2px 0 0 20px;
+}
+
diff --git a/framework/yii/debug/panels/LogPanel.php b/framework/yii/debug/panels/LogPanel.php
index 2790441..b2efde1 100644
--- a/framework/yii/debug/panels/LogPanel.php
+++ b/framework/yii/debug/panels/LogPanel.php
@@ -52,19 +52,28 @@ EOD;
{
$rows = array();
foreach ($this->data['messages'] as $log) {
- $time = date('H:i:s.', $log[3]) . sprintf('%03d', (int)(($log[3] - (int)$log[3]) * 1000));
- $level = Logger::getLevelName($log[1]);
- $message = Html::encode(wordwrap($log[0]));
- if ($log[1] == Logger::LEVEL_ERROR) {
+ list ($message, $level, $category, $time, $traces) = $log;
+ $time = date('H:i:s.', $time) . sprintf('%03d', (int)(($time - (int)$time) * 1000));
+ $message = Html::encode($message);
+ if (!empty($traces)) {
+ $message .= Html::ul($traces, array(
+ 'class' => 'trace',
+ 'item' => function ($trace) {
+ return "
{$trace['file']}({$trace['line']})";
+ },
+ ));
+ }
+ if ($level == Logger::LEVEL_ERROR) {
$class = ' class="error"';
- } elseif ($log[1] == Logger::LEVEL_WARNING) {
+ } elseif ($level == Logger::LEVEL_WARNING) {
$class = ' class="warning"';
- } elseif ($log[1] == Logger::LEVEL_INFO) {
+ } elseif ($level == Logger::LEVEL_INFO) {
$class = ' class="info"';
} else {
$class = '';
}
- $rows[] = "$time | $level | {$log[2]} | $message |
";
+ $level = Logger::getLevelName($level);
+ $rows[] = "$time | $level | $category | $message |
";
}
$rows = implode("\n", $rows);
return << level (integer)
* [2] => category (string)
* [3] => timestamp (float, obtained by microtime(true))
+ * [4] => traces (array, debug backtrace, contains the application code call stacks)
* )
* ~~~
*/
@@ -133,6 +134,12 @@ class Logger extends Component
* A smaller value means less memory, but will increase the execution time due to the overhead of [[flush()]].
*/
public $flushInterval = 1000;
+ /**
+ * @var integer how much call stack information (file name and line number) should be logged for each message.
+ * Defaults to 0, meaning no backtrace information. If it is greater than 0,
+ * at most that number of call stacks will be logged. Only application call stacks are considered.
+ */
+ public $traceLevel = 0;
/**
* Initializes the logger by registering [[flush()]] as a shutdown function.
@@ -150,8 +157,8 @@ class Logger extends Component
/**
* Logs a message with the given type and category.
- * If `YII_DEBUG` is true and `YII_TRACE_LEVEL` is greater than 0, then additional
- * call stack information about application code will be appended to the message.
+ * If [[traceLevel]] is greater than 0, additional call stack information about
+ * the application code will be logged as well.
* @param string $message the message to be logged.
* @param integer $level the level of the message. This must be one of the following:
* `Logger::LEVEL_ERROR`, `Logger::LEVEL_WARNING`, `Logger::LEVEL_INFO`, `Logger::LEVEL_TRACE`,
@@ -161,19 +168,22 @@ class Logger extends Component
public function log($message, $level, $category = 'application')
{
$time = microtime(true);
- if (YII_DEBUG && YII_TRACE_LEVEL > 0 && !($level & self::LEVEL_PROFILE)) {
- $traces = debug_backtrace();
+ $traces = array();
+ if ($this->traceLevel > 0) {
$count = 0;
- foreach ($traces as $trace) {
+ $ts = debug_backtrace();
+ array_pop($ts); // remove the last trace since it would be the entry script, not very useful
+ foreach ($ts as $trace) {
if (isset($trace['file'], $trace['line']) && strpos($trace['file'], YII_PATH) !== 0) {
- $message .= "\nin {$trace['file']} ({$trace['line']})";
- if (++$count >= YII_TRACE_LEVEL) {
+ unset($trace['object'], $trace['args']);
+ $traces[] = $trace;
+ if (++$count >= $this->traceLevel) {
break;
}
}
}
}
- $this->messages[] = array($message, $level, $category, $time);
+ $this->messages[] = array($message, $level, $category, $time, $traces);
if ($this->flushInterval > 0 && count($this->messages) >= $this->flushInterval) {
$this->flush();
}