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异步投递任务时加入了这一句代码,这样每次都将记录日志到文件中,我们就可以看实时日志了。

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