亚洲精品成人_精品成人一区_999视频在线播放_免费黄色在线_亚洲成人久久久_久久www免费视频

日志

日志可以快速幫助開(kāi)發(fā)者快速定位問(wèn)題的根源、追蹤程序執(zhí)行的過(guò)程、追蹤數(shù)據(jù)變化、數(shù)據(jù)統(tǒng)計(jì)和性能分析等。

配置說(shuō)明

EasySwoole3.4.4 版本中優(yōu)化了框架默認(rèn)的日志處理機(jī)制,允許用戶(hù)更加方便地去自定義配置日志處理,可以直接在配置文件 (dev.php/produce.php) 中進(jìn)行配置。(以后版本也將兼容以下配置特性)

配置包括以下幾方面:

  • 設(shè)置記錄日志文件時(shí)日志文件存放目錄 (dir),用戶(hù)可以自己設(shè)置日志存放目錄(但是一定要保證日志有寫(xiě)入權(quán)限),配置值為 路徑,默認(rèn)為 框架根目錄的 Log 目錄
  • 設(shè)置記錄日志時(shí)的日志最低等級(jí) (level),等級(jí)配置值默認(rèn)為 \EasySwoole\Log\LoggerInterface::LOG_LEVEL_DEBUG,等級(jí)值支持 \EasySwoole\Log\LoggerInterface::LOG_LEVEL_DEBUG (0級(jí))\EasySwoole\Log\LoggerInterface::LOG_LEVEL_INFO (1級(jí))\EasySwoole\Log\LoggerInterface::LOG_LEVEL_NOTICE (2級(jí))\EasySwoole\Log\LoggerInterface::LOG_LEVEL_WARNING (3級(jí))\EasySwoole\Log\LoggerInterface::LOG_LEVEL_ERROR (4級(jí))。例如當(dāng)我們?cè)谂渲梦募邪讶罩镜燃?jí)設(shè)置為 \EasySwoole\Log\LoggerInterface::LOG_LEVEL_INFO (1級(jí)) 時(shí),就不會(huì)把我們?cè)诳蚣苤姓{(diào)用打印小于這個(gè)等級(jí)的日志記錄記錄到日志文件中 (比如 LOG_LEVEL_DEBUG (0級(jí)) 就不會(huì)被記錄到日志當(dāng)中了,也不會(huì)顯示在控制臺(tái)了)。
  • 設(shè)置日志處理器 handler (handler),默認(rèn)使用框架內(nèi)置 handler,用戶(hù)可以自定義日志類(lèi)實(shí)現(xiàn) \EasySwoole\Log\LoggerInterface 接口,來(lái)處理記錄日志。配置值為 自定義處理類(lèi)名,默認(rèn)為 \EasySwoole\Log\Logger。具體自定義實(shí)現(xiàn)日志處理器可看下文。
  • 設(shè)置記錄日志到日志文件時(shí)是否在控制臺(tái)打印日志 (logConsole)。配置值為 boolean 值,默認(rèn)為 true,即開(kāi)啟。
  • 設(shè)置是否開(kāi)啟在控制臺(tái)打印日志 (displayConsole)。配置值為 boolean 值,默認(rèn)為 true,即開(kāi)啟。
  • 設(shè)置打印日志時(shí)忽略哪些分類(lèi)的日志不進(jìn)行記錄 (ignoreCategory) 。配置值為 array 類(lèi)型值,默認(rèn)為 null (即不忽略任何分類(lèi)的日志,任何分類(lèi)的日志都進(jìn)行在控制臺(tái)顯示打印并記錄到文件),配置忽略分類(lèi)值支持 debuginfonoticewarningerror 作為配置值 array 中的可選值。例如:設(shè)置為 ['debug', 'notice'] 時(shí),即當(dāng)我們?cè)诳蚣苤惺褂孟旅媪信e的使用日志的方法時(shí),調(diào)用 debugnotice 方法記錄日志時(shí),不會(huì)把 debugnotice 分類(lèi)的日志在控制臺(tái)顯示,也不會(huì)記錄到日志文件中。

下面為配置文件中配置示例:

<?php

use EasySwoole\Log\LoggerInterface;

return [
    // ... 這里省略
    'MAIN_SERVER' => [
        // ... 這里省略
    ],
    "LOG" => [
        // 設(shè)置記錄日志文件時(shí)日志文件存放目錄
        'dir' => null,
        // 設(shè)置記錄日志時(shí)的日志最低等級(jí),低于此等級(jí)的日志不進(jìn)行記錄和顯示
        'level' => LoggerInterface::LOG_LEVEL_DEBUG,
        // 設(shè)置日志處理器 `handler` (handler)
        'handler' => null,
        // 設(shè)置開(kāi)啟在記錄日志到日志文件時(shí)在控制臺(tái)打印日志
        'logConsole' => true,
        // 設(shè)置開(kāi)啟在控制臺(tái)顯示日志
        'displayConsole'=>true,
        // 設(shè)置打印日志時(shí)忽略哪些分類(lèi)的日志不進(jìn)行記錄
        'ignoreCategory' => []
    ],
    // ... 這里省略
];

以上 levelignoreCategory 的設(shè)置,更加方便用戶(hù)在正式上線(xiàn)項(xiàng)目時(shí),屏蔽那些在開(kāi)發(fā)階段的調(diào)試日志不進(jìn)行記錄和顯示。當(dāng)然對(duì)于 PHP 異常錯(cuò)誤等級(jí) 的等級(jí)設(shè)置(即 error_reporting()),用戶(hù)也可以設(shè)置,詳細(xì)請(qǐng)查看 iniialize 事件中設(shè)置ERROR_LEVEL

注意:在 EasySwoole 3.4.3 版本中,僅支持對(duì)上述 dirlevelhandler 的配置。而在 3.4.2 之前版本中,僅支持對(duì)上述 dir 的配置。

日志使用

以下方法可以在框架的 boostrap 事件之后的任意位置進(jìn)行調(diào)用。調(diào)用之前請(qǐng)先看下文注意事項(xiàng)。

在非框架中使用,例如是單元測(cè)試腳本,請(qǐng)執(zhí)行 \EasySwoole\EasySwoole\Core::getInstance()->initialize(); 用于初始化日志。 在 EasySwoole 3.3.7 之前版本中,initialize 事件調(diào)用為:EasySwoole\EasySwoole\Core::getInstance()->initialize()->globalInitialize();

log 記錄顯示日志

// 打印和記錄 `DEBUG` 等級(jí)、`debug` 分類(lèi)的日志
\EasySwoole\EasySwoole\Logger::getInstance()->log('record level:DEBUG-category:debug log info',\EasySwoole\Log\LoggerInterface::LOG_LEVEL_DEBUG,'debug');
### [舊版本說(shuō)明] 注意:當(dāng)找不到 `\EasySwoole\Log\LoggerInterface::LOG_LEVEL_DEBUG` 常量,請(qǐng)查看是否為 `\EasySwoole\EasySwoole\Logger::LOG_LEVEL_INFO` 

// 打印和記錄 `INFO` 等級(jí)、`info` 分類(lèi)的日志
\EasySwoole\EasySwoole\Logger::getInstance()->log('record level:INFO-category:info log info',\EasySwoole\Log\LoggerInterface::LOG_LEVEL_INFO,'info');

// 打印和記錄 `NOTICE` 等級(jí)、`notice` 分類(lèi)的日志
\EasySwoole\EasySwoole\Logger::getInstance()->log('record level:NOTICE-category:notice log info',\EasySwoole\Log\LoggerInterface::LOG_LEVEL_NOTICE,'notice');

// 打印和記錄 `WARNING` 等級(jí)、`warning` 分類(lèi)的日志
\EasySwoole\EasySwoole\Logger::getInstance()->log('record level:WARNING-category:warning log info',\EasySwoole\Log\LoggerInterface::LOG_LEVEL_WARNING,'warning');

// 打印和記錄 `ERROR` 等級(jí)、`error` 分類(lèi)的日志
\EasySwoole\EasySwoole\Logger::getInstance()->log('record level:ERROR-category:error log info',\EasySwoole\Log\LoggerInterface::LOG_LEVEL_ERROR,'error');

運(yùn)行結(jié)果:在控制臺(tái)和日志文件 Log\log_XxxxXx.log 中均可看到如下結(jié)果:

// 格式說(shuō)明: [記錄日志時(shí)間][分類(lèi)][等級(jí)]:[日志內(nèi)容]
[2021-03-18 22:52:09][debug][debug]:[record level:DEBUG-category:debug log info]
[2021-03-18 22:52:09][info][info]:[record level:INFO-category:info log info]
[2021-03-18 22:52:09][notice][notice]:[record level:NOTICE-category:notice log info]
[2021-03-18 22:52:09][warning][warning]:[record level:WARNING-category:warning log info]
[2021-03-18 22:52:09][error][error]:[record level:ERROR-category:error log info]

info 日志

// 打印和記錄 `INFO` 等級(jí)、`info` 分類(lèi)的日志
\EasySwoole\EasySwoole\Logger::getInstance()->info('record level:INFO-category:info log info');

waring 日志

// 打印和記錄 `WANING` 等級(jí)、`waring` 分類(lèi)的日志
\EasySwoole\EasySwoole\Logger::getInstance()->waring('record level:WANING-category:waring log info');

console 日志

// 只在控制臺(tái)打印 `INFO` 等級(jí)、`debug` 分類(lèi)的日志 (不記錄日志文件)
\EasySwoole\EasySwoole\Logger::getInstance()->console('console', \EasySwoole\Log\LoggerInterface::LOG_LEVEL_INFO, 'debug');

notice 日志

// 打印和記錄 `NOTICE` 等級(jí)、`notice` 分類(lèi)的日志
\EasySwoole\EasySwoole\Logger::getInstance()->notice('record level:NOTICE-category:notice log info');

error 日志

// 打印和記錄 `ERROR` 等級(jí)、`error` 分類(lèi)的日志
\EasySwoole\EasySwoole\Logger::getInstance()->error('record level:ERROR-category:error log info');

event 日志寫(xiě)入后執(zhí)行回調(diào)

使用 event 時(shí),請(qǐng)先注冊(cè) Event

// 日志寫(xiě)入之后執(zhí)行
\EasySwoole\EasySwoole\Logger::getInstance()->onLog()->set('myHook', function ($msg, $logLevel, $category) {
    // 增加日志寫(xiě)入之后的回調(diào)函數(shù)
});

自定義日志處理器

需要實(shí)現(xiàn) EasySwoole\Log\LoggerInterface 即可:

自定義示例如下,新建 App\Log\LogHandler.php 文件,編輯內(nèi)容如下:

<?php

namespace App\Log;

use EasySwoole\Log\LoggerInterface;

class LogHandler implements LoggerInterface
{

    private $logDir;

    function __construct(string $logDir = null)
    {
        if (empty($logDir)) {
            $logDir = getcwd();
        }
        $this->logDir = $logDir;
    }

    function log(?string $msg, int $logLevel = self::LOG_LEVEL_INFO, string $category = 'debug'): string
    {
        $date = date('Y-m-d H:i:s');
        $levelStr = $this->levelMap($logLevel);
        $filePath = $this->logDir . "/log_{$category}.log";
        $str = "自定義日志:[{$date}][{$category}][{$levelStr}] : [{$msg}]\n";
        file_put_contents($filePath, "{$str}", FILE_APPEND | LOCK_EX);
        return $str;
    }

    function console(?string $msg, int $logLevel = self::LOG_LEVEL_INFO, string $category = 'console')
    {
        $date = date('Y-m-d H:i:s');
        $levelStr = $this->levelMap($logLevel);
        $temp = "自定義日志:[{$date}][{$category}][{$levelStr}]:[{$msg}]\n";
        fwrite(STDOUT, $temp);
    }

    private function levelMap(int $level)
    {
        switch ($level) {
            case self::LOG_LEVEL_INFO:
                return 'info';
            case self::LOG_LEVEL_NOTICE:
                return 'notice';
            case self::LOG_LEVEL_WARNING:
                return 'warning';
            case self::LOG_LEVEL_ERROR:
                return 'error';
            default:
                return 'unknown';
        }
    }
}

注冊(cè)自定義日志處理器

(EasySwoole 3.4.4 及以上版本可使用) 方法1. 在配置文件 (dev.php / produce.php)中注冊(cè)自定義日志處理器

<?php

use EasySwoole\Log\LoggerInterface;

return [
    // ... 這里省略
    'MAIN_SERVER' => [
        // ... 這里省略
    ],
    "LOG" => [
        'dir' => null,
        'level' => LoggerInterface::LOG_LEVEL_DEBUG,
        // 注冊(cè)日志處理器 `handler` (handler)
        'handler' =>  new \App\Log\LogHandler(),
        'logConsole' => true,
        'displayConsole'=>true,
        'ignoreCategory' => []
    ],
    // ... 這里省略
];

(EasySwoole 3.4.x+ 版本可使用) 方法2. 在 initialize 事件 中注冊(cè)自定義 logger 處理器

注冊(cè)示例代碼如下:

<?php

namespace EasySwoole\EasySwoole;

use EasySwoole\EasySwoole\AbstractInterface\Event;
use EasySwoole\EasySwoole\Swoole\EventRegister;

class EasySwooleEvent implements Event
{
    public static function initialize()
    {
        date_default_timezone_set('Asia/Shanghai');

        // 注冊(cè)自定義 `logger` 處理器
        \EasySwoole\Component\Di::getInstance()->set(\EasySwoole\EasySwoole\SysConst::LOGGER_HANDLER, new \App\Log\LogHandler());

        // 或使用如下方式進(jìn)行注冊(cè)自定義 `logger` 處理器
        // \EasySwoole\EasySwoole\Logger::getInstance(new \App\Log\LogHandler());
    }

    public static function mainServerCreate(EventRegister $register)
    {

    }
}

注意:針對(duì) EasySwoole 3.4.x 之前版本,請(qǐng)?jiān)?bootstrap 事件(即項(xiàng)目根目錄的 bootstrap.php 文件)中,使用 \EasySwoole\EasySwoole\Logger::getInstance(new \App\Log\LogHandler()); 方式注冊(cè)自定義日志處理器。

日志中心

通常在一些情況下,會(huì)把數(shù)據(jù)往日志中心推送進(jìn)行數(shù)據(jù)分析,在 onLog 回調(diào),把日志信息,推送到日志中心即可。

亚洲精品成人_精品成人一区_999视频在线播放_免费黄色在线_亚洲成人久久久_久久www免费视频
  • <kbd id="eqi2k"><code id="eqi2k"></code></kbd><cite id="eqi2k"><tbody id="eqi2k"></tbody></cite>
    欧美1区2区| 欧美高清视频一区二区三区在线观看| 日韩欧美电影一区二区| 久久男女视频| 在线亚洲激情| 国产精品一区视频网站| 亚洲视频二区| 国产欧美日韩一区二区三区在线| 亚洲国产精品123| 天天好比中文综合网| 日韩欧美亚洲日产国| 日韩理论片在线观看| 视频在线观看成人| 精品国产乱码久久久久久丨区2区 精品国产乱码久久久久久蜜柚 | 久久综合影音| 国产精品永久入口久久久| 风间由美久久久| 久久av在线| 国产精品一区视频网站| 久久久神马电影| 欧美一区视久久| 中文字幕在线亚洲三区| 中国女人久久久| 丁香五月网久久综合| 日本精品二区| 欧美成人午夜| 国产精品日韩欧美一区二区三区| 岛国视频一区免费观看| 日日骚一区二区网站| 欧美日韩国产高清| 久久经典综合| 亚洲激情图片| 国产精品一区二区三区精品| 欧美一区成人| 久久久久国产精品一区二区| 久久99精品久久久久久久久久| 国产精品hd| 青青草成人网| 91丨九色丨国产| 欧美成人有码| 国产精品一区二区三区四区五区| 国产精品videossex久久发布| 99国产超薄丝袜足j在线观看| 日本一区视频在线观看| 国产视频一区免费看| 国产乱码精品一区二区三区日韩精品| 亚洲欧美久久234| 久久久av水蜜桃| 国产一区二区精品| 欧美精品aa| 日韩欧美一区二区在线观看 | 亚洲v欧美v另类v综合v日韩v| 国语精品中文字幕| 欧美一区影院| 日韩欧美99| 日本不卡一区| 国产一级特黄a大片99| 91精品天堂| 一区二区91| 黄色欧美日韩| 亚洲激情视频| 国产视频久久| 老妇喷水一区二区三区| 久久久国产亚洲精品| 亚洲毛片播放| 亚洲日本无吗高清不卡| 宅男噜噜噜66一区二区| 好看的亚洲午夜视频在线| 欧美成人在线免费观看| 亚洲图片欧洲图片日韩av| 亚洲国产黄色| 久久综合精品一区| 99r国产精品视频| 欧美裸体网站| 精品91在线| 久久精选视频| 日韩aⅴ视频一区二区三区| 午夜精品一区二区在线观看的| 欧洲亚洲一区二区三区四区五区| 日韩少妇中文字幕| 国内一区二区三区在线视频| 99热在线精品观看| 成人在线视频电影| 午夜电影亚洲| 久久久久欧美精品| 五月天久久综合网| 亚洲尤物影院| 午夜精品电影在线观看| 午夜在线视频观看日韩17c| 久久99蜜桃综合影院免费观看| 欧美a级在线| 91九色在线免费视频| 欧美日本一区二区高清播放视频| 9久re热视频在线精品| 久久艹中文字幕| 久久先锋影音| 99国产精品久久久久久久| 精品国产乱码久久久久久郑州公司 | 在线精品一区| 一区二区精品在线观看| 国产91免费视频| 精品动漫3d一区二区三区免费版 | 欧美亚洲一级二级| 国产偷国产偷亚洲高清97cao| 色之综合天天综合色天天棕色| 欧美极品jizzhd欧美| 亚欧成人精品| 国产综合欧美| 欧美日本一区二区高清播放视频| 欧美一区观看| 蜜桃视频在线观看91| 国产98在线|日韩| 亚洲电影av| 久久精品二区| 久久在线91| 精品欧美国产一区二区三区不卡| 国产精品综合久久久久久| 91成人免费观看| 国产自产精品| 亚洲福利av在线| 欧美日韩国产精品一卡| 在线观看成人av电影| 精品国产乱码久久久久久郑州公司 | 一本久久知道综合久久| 一本色道久久综合亚洲二区三区| 欧美不卡三区| 国产精品国码视频| 在线精品一区二区| 国产精品视频| 99视频在线播放| 国产一区免费视频| 欧美一区二区三区在线播放| 欧美日韩一区综合| 欧美综合77777色婷婷| 久久久福利视频| 欧美 日韩 国产一区二区在线视频| 中文字幕精品一区日韩| 亚洲精品日韩久久| 国产成人免费电影| 欧美资源一区| 免费在线日韩av| 欧美成人在线免费观看| 亚洲国产裸拍裸体视频在线观看乱了中文| av成人观看| 国产精品v欧美精品∨日韩| 超碰97网站| 一区二区三区欧美成人| 日本公妇乱淫免费视频一区三区| 好看不卡的中文字幕| 久久久久久久有限公司| 久久成人一区| 欧美另类女人| 麻豆亚洲一区| 国产综合色一区二区三区| 97自拍视频| 国产精品普通话对白| 在线免费观看一区二区三区| 日本高清不卡三区| 日韩免费电影一区二区| 久久婷婷麻豆| 久久成人精品| 国产亚洲精品bv在线观看| 欧美日韩一区二区三| 午夜精品亚洲| 国产精品v日韩精品v欧美精品网站| 亚洲精品视频一区二区三区| 久久婷婷一区| 久久亚洲高清| 国产 高清 精品 在线 a| 亚洲一区欧美二区| 国内精品视频在线播放| 欧美日韩精品免费观看视一区二区 | 久久久www免费人成黑人精品| 国产一区二区三区的电影| 国产三级精品在线不卡| 国产精品日本| 久久综合九九| 欧美日韩精品久久| 国产欧美91| 欧美日韩三区四区| 欧美三区不卡| 男人的天堂亚洲在线| 精品一区二区久久久久久久网站| 韩国精品一区二区三区六区色诱| 国产一区二区三区免费不卡| 欧美日韩精品免费观看| 免费久久久一本精品久久区| 一区二区三区四区国产| 亚洲激情在线| 国产精品初高中精品久久| 视频在线一区二区三区| 亚洲性人人天天夜夜摸| 国产精品区一区二区三含羞草| 亚洲成色最大综合在线| 亚洲在线电影| 国产精品地址| 久久偷窥视频| 一区二区三区视频在线播放| 欧美日韩系列| 加勒比在线一区二区三区观看|