平時如果要看異步執行完的日誌需要kill調swoole進程然後會將日誌記錄到我們設置的文件中,但是不想每次都去kill進程,然後再重啓進程,這樣十分繁瑣。
先看yii手冊文檔:
Class yii\log\Logger
繼承 | yii\log\Logger » yii\base\Component » yii\base\BaseObject |
---|---|
實現 | yii\base\Configurable |
可用版本自 | 2.0 |
源碼 | https://github.com/yiichina/yii2/blob/api/framework/log/Logger.php |
Logger 如果設置了 $dispatcher,它將把日誌消息記在內存並且發送到所設置的日誌 $dispatcher。
可以通過 Yii::getLogger()
獲取 Logger 實例,並調用當前實例的 log() 方法去記錄一條日誌消息。 爲了方便起見, Yii 類提供了一組用於記錄各種級別消息的快捷方法。
有關於 Logger 的詳細信息和使用方法,請參考權威指南的 Logger 章節。
當應用程序結束或者執行到 $flushInterval 時 Logger 將會自動調用 flush() 從而通過 $dispatcher 把消息記錄到如 file,email, 或者 database 不同的目標。
公共屬性
屬性 | 類型 | 描述 | 被定義在 |
---|---|---|---|
$behaviors | yii\base\Behavior[] | List of behaviors attached to this component | yii\base\Component |
$dbProfiling | array | 第一個元素表示執行的 SQL 語句的數量, 第二個元素是 SQL 執行花費的總時間。 | yii\log\Logger |
$dispatcher | yii\log\Dispatcher | 消息調度器。 | yii\log\Logger |
$elapsedTime | float | 當前請求的總耗時(以秒爲單位)。 | yii\log\Logger |
$flushInterval | integer | 在從內存刷新併發送到目標之前,應該記錄多少消息。 默認值 1000,這意味着每記錄 1000 條消息,就會調用 flush() 方法一次。 如果此屬性設置爲 0,程序終止之前將不會刷新消息。 此屬性主要影響日誌消息將佔用多少內存。 較小的值意味着佔用更少的內存,但是由於 [[flush()] 的開銷,會增加執行時間。 | yii\log\Logger |
$messages | array | 日誌消息。該屬性由 log() 和 flush() 操作。 下面是日誌消息的結構: ` [ [0] => message (mixed, can be a string or some complex data, such as an exception object) [1] => level (integer) [2] => category (string) [3] => timestamp (float, obtained by microtime(true)) [4] => traces (array, debug backtrace, contains the application code call stacks) [5] => memory usage in bytes (int, obtained by memory_get_usage()), available since version 2. |
yii\log\Logger |
$profiling | array | 分析的結果。每個元素都是由這些元素組成的數組: info ,category ,timestamp ,trace ,level ,duration ,memory ,memoryDiff , 從版本 2. |
yii\log\Logger |
$traceLevel | integer | 應該爲每個消息記錄多少調用堆棧信息(文件名和行號)。 如果大於 0,最多記錄調用堆棧的數量。 注意,只計算應用程序調用的堆棧信息。 | yii\log\Logger |
這是yii框架提供的日誌文檔,我們可以關注這兩點:
1.
當應用程序結束或者執行到 $flushInterval 時 Logger 將會自動調用 flush() 從而通過 $dispatcher 把消息記錄到如 file,email, 或者 database 不同的目標。
2.
$flushInterval | integer | 在從內存刷新併發送到目標之前,應該記錄多少消息。 默認值 1000,這意味着每記錄 1000 條消息,就會調用 flush() 方法一次。 如果此屬性設置爲 0,程序終止之前將不會刷新消息。 此屬性主要影響日誌消息將佔用多少內存。 較小的值意味着佔用更少的內存,但是由於 [[flush()] 的開銷,會增加執行時間。 | yii\log\Logger |
運用:
<?php
/**
* task進程接收任務
* @param \Swoole\Server $server
* @param string $task_id 進程id
* @param string $from_id 來源worker進程id
* @param $data
* @link https://wiki.swoole.com/wiki/page/54.html
*/
public function onTask($server, $task_id, $from_id, $data)
{
// TODO: Implement onTask() method.
try {
Yii::getLogger()->flushInterval = 1;
Yii::$app->redis->open();
Yii::$app->getDb()->open();
$result = call_user_func_array([$this, 'task'], ['server' => $server, 'task_id' => $task_id, 'from_id' => $from_id, 'data' => $data]);
$taskData['status'] = 'success';
$taskData['message'] = $result;
} catch (Exception $exception) {
Yii::error($exception->__toString());
$taskData['status'] = 'fail';
$taskData['message'] = $exception->getMessage();
} catch (Throwable $throwable) {
Yii::error($throwable->__toString());
$taskData['status'] = 'fail';
$taskData['message'] = $throwable->getMessage();
}
$server->finish(json_encode($taskData));
Yii::$app->getDb()->close();
Yii::$app->redis->close();
}
註釋:可以看到在swoole異步投遞任務時加入了這一句代碼,這樣每次都將記錄日誌到文件中,我們就可以看實時日誌了。