| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282 |
- <?php
- // +----------------------------------------------------------------------
- // | ThinkPHP [ WE CAN DO IT JUST THINK ]
- // +----------------------------------------------------------------------
- // | Copyright (c) 2006~2019 http://thinkphp.cn All rights reserved.
- // +----------------------------------------------------------------------
- // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
- // +----------------------------------------------------------------------
- // | Author: yunwuxin <448901948@qq.com>
- // +----------------------------------------------------------------------
- declare (strict_types = 1);
- namespace think\log;
- use Psr\Log\LoggerInterface;
- use think\contract\LogHandlerInterface;
- use think\Event;
- use think\event\LogWrite;
- class Channel implements LoggerInterface
- {
- protected $name;
- protected $logger;
- protected $event;
- protected $lazy = true;
- /**
- * 日志信息
- * @var array
- */
- protected $log = [];
- /**
- * 关闭日志
- * @var array
- */
- protected $close = false;
- /**
- * 允许写入类型
- * @var array
- */
- protected $allow = [];
- public function __construct(string $name, LogHandlerInterface $logger, array $allow, bool $lazy = true, Event $event = null)
- {
- $this->name = $name;
- $this->logger = $logger;
- $this->allow = $allow;
- $this->lazy = $lazy;
- $this->event = $event;
- }
- /**
- * 关闭通道
- */
- public function close()
- {
- $this->clear();
- $this->close = true;
- }
- /**
- * 清空日志
- */
- public function clear()
- {
- $this->log = [];
- }
- /**
- * 记录日志信息
- * @access public
- * @param mixed $msg 日志信息
- * @param string $type 日志级别
- * @param array $context 替换内容
- * @param bool $lazy
- * @return $this
- */
- public function record($msg, string $type = 'info', array $context = [], bool $lazy = true)
- {
- if ($this->close || (!empty($this->allow) && !in_array($type, $this->allow))) {
- return $this;
- }
- if (is_string($msg) && !empty($context)) {
- $replace = [];
- foreach ($context as $key => $val) {
- $replace['{' . $key . '}'] = $val;
- }
- $msg = strtr($msg, $replace);
- }
- if (!empty($msg) || 0 === $msg) {
- $this->log[$type][] = $msg;
- }
- if (!$this->lazy || !$lazy) {
- $this->save();
- }
- return $this;
- }
- /**
- * 实时写入日志信息
- * @access public
- * @param mixed $msg 调试信息
- * @param string $type 日志级别
- * @param array $context 替换内容
- * @return $this
- */
- public function write($msg, string $type = 'info', array $context = [])
- {
- return $this->record($msg, $type, $context, false);
- }
- /**
- * 获取日志信息
- * @return array
- */
- public function getLog(): array
- {
- return $this->log;
- }
- /**
- * 保存日志
- * @return bool
- */
- public function save(): bool
- {
- $log = $this->log;
- if ($this->event) {
- $event = new LogWrite($this->name, $log);
- $this->event->trigger($event);
- $log = $event->log;
- }
- if ($this->logger->save($log)) {
- $this->clear();
- return true;
- }
- return false;
- }
- /**
- * System is unusable.
- *
- * @param string $message
- * @param array $context
- *
- * @return void
- */
- public function emergency($message, array $context = [])
- {
- $this->log(__FUNCTION__, $message, $context);
- }
- /**
- * Action must be taken immediately.
- *
- * Example: Entire website down, database unavailable, etc. This should
- * trigger the SMS alerts and wake you up.
- *
- * @param string $message
- * @param array $context
- *
- * @return void
- */
- public function alert($message, array $context = [])
- {
- $this->log(__FUNCTION__, $message, $context);
- }
- /**
- * Critical conditions.
- *
- * Example: Application component unavailable, unexpected exception.
- *
- * @param string $message
- * @param array $context
- *
- * @return void
- */
- public function critical($message, array $context = [])
- {
- $this->log(__FUNCTION__, $message, $context);
- }
- /**
- * Runtime errors that do not require immediate action but should typically
- * be logged and monitored.
- *
- * @param string $message
- * @param array $context
- *
- * @return void
- */
- public function error($message, array $context = [])
- {
- $this->log(__FUNCTION__, $message, $context);
- }
- /**
- * Exceptional occurrences that are not errors.
- *
- * Example: Use of deprecated APIs, poor use of an API, undesirable things
- * that are not necessarily wrong.
- *
- * @param string $message
- * @param array $context
- *
- * @return void
- */
- public function warning($message, array $context = [])
- {
- $this->log(__FUNCTION__, $message, $context);
- }
- /**
- * Normal but significant events.
- *
- * @param string $message
- * @param array $context
- *
- * @return void
- */
- public function notice($message, array $context = [])
- {
- $this->log(__FUNCTION__, $message, $context);
- }
- /**
- * Interesting events.
- *
- * Example: User logs in, SQL logs.
- *
- * @param string $message
- * @param array $context
- *
- * @return void
- */
- public function info($message, array $context = [])
- {
- $this->log(__FUNCTION__, $message, $context);
- }
- /**
- * Detailed debug information.
- *
- * @param string $message
- * @param array $context
- *
- * @return void
- */
- public function debug($message, array $context = [])
- {
- $this->log(__FUNCTION__, $message, $context);
- }
- /**
- * Logs with an arbitrary level.
- *
- * @param mixed $level
- * @param string $message
- * @param array $context
- *
- * @return void
- */
- public function log($level, $message, array $context = [])
- {
- $this->record($message, $level, $context);
- }
- public function __call($method, $parameters)
- {
- $this->log($method, ...$parameters);
- }
- }
|