yii在執行swoole的異步服務時如何寫日誌到文件中,並實時查看寫入的日誌信息

平時如果要看異步執行完的日誌需要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 把消息記錄到如 fileemail, 或者 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 分析的結果。每個元素都是由這些元素組成的數組: infocategorytimestamptraceleveldurationmemorymemoryDiff, 從版本 2. yii\log\Logger
$traceLevel integer 應該爲每個消息記錄多少調用堆棧信息(文件名和行號)。 如果大於 0,最多記錄調用堆棧的數量。 注意,只計算應用程序調用的堆棧信息。 yii\log\Logger

 

這是yii框架提供的日誌文檔,我們可以關注這兩點:

1.

        當應用程序結束或者執行到 $flushInterval 時 Logger 將會自動調用 flush() 從而通過 $dispatcher 把消息記錄到如 fileemail, 或者 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異步投遞任務時加入了這一句代碼,這樣每次都將記錄日誌到文件中,我們就可以看實時日誌了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章