Monolog基于框架的封裝

做一下基本關(guān)于Monolog的基本介紹:

Monolog是基于PHP的日志類(lèi)庫(kù)。

介紹就到這,言歸正傳

安裝

安裝最新版本:(composer 還沒(méi)安裝的~:https://www.phpcomposer.com/)

composer require monolog/monolog

要求PHP版本為5.3以上。

以上都是百度都可以進(jìn)行搜索的廢話,這里咱們只是進(jìn)行復(fù)制并且再?gòu)U話一遍~

接下來(lái)的是重點(diǎn):

<?php
/**
 * Created by PhpStorm.
 * User: j
 * Date: 2019-01-09
 * Time: 15:33
 */
namespace common\log;

use Monolog\Formatter\LineFormatter;
use Monolog\Logger;
use Monolog\Handler\RotatingFileHandler;

class Log
{
    private static $loggers;

    /**
     * 日志默認(rèn)保存路徑
     * @var string
     */
    private static $fileName = '/data/logs/monolog/';

    /**
     * 日志留存時(shí)間
     * @var int
     */
    private static $maxFiles = 31;

    /**
     * 日志等級(jí)
     * @var int
     */
    private static $level = Logger::DEBUG;

    /**
     * 文件讀寫(xiě)權(quán)限分配
     * 0666 保證log日志文件可以被其他用戶/進(jìn)程讀寫(xiě)
     * @var int
     */
    private static $filePermission = 0666;

    /**
     * monolog日志
     * @param $name
     * @param $arguments
     * @return mixed
     */
    public static function __callStatic($name, $arguments)
    {
        $logger = self::createLogger($name);

        $message         = empty($arguments[0]) ? ''    : $arguments[0];
        $context         = empty($arguments[1]) ? []    : $arguments[1];
        $levelName       = empty($arguments[2]) ? $name : $arguments[2];
        $backtraceOffset = empty($arguments[3]) ? 0     : intval($arguments[3]);


        $level = Logger::toMonologLevel($levelName);
        if (!is_int($level)) $level = Logger::INFO;

        // $backtrace數(shù)組第$idx元素是當(dāng)前行,第$idx+1元素表示上一層,另外function、class需再往上取一個(gè)層次
        // PHP7 不會(huì)包含'call_user_func'與'call_user_func_array',需減少一層
        if (version_compare(PCRE_VERSION, '7.0.0', '>=')) {
            $backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);
            $idx       = 0 + $backtraceOffset;
        } else {
            $backtrace = debug_backtrace();
            $idx       = 1 + $backtraceOffset;
        }

        $trace = basename($backtrace[$idx]['file']) . ":" . $backtrace[$idx]['line'];
        if (!empty($backtrace[$idx + 1]['function'])) {
            $trace .= '##';
            $trace .= $backtrace[$idx + 1]['function'];
        }

        $message = sprintf('==> LOG: %s -- %s', $message, $trace);

        return $logger->addRecord($level, $message, $context);
    }

    /**
     * 創(chuàng)建日志
     * @param $name
     * @return mixed
     */
    private static function createLogger($name)
    {
        if (empty(self::$loggers[$name])) {
            // 根據(jù)業(yè)務(wù)域名與方法名進(jìn)行日志名稱(chēng)的確定
            $category       = $_SERVER['SERVER_NAME'];
            // 日志文件目錄
            $fileName       = self::$fileName;
            // 日志保存時(shí)間
            $maxFiles       = self::$maxFiles;
            // 日志等級(jí)
            $level          = self::$level;
            // 權(quán)限
            $filePermission = self::$filePermission;

            // 創(chuàng)建日志
            $logger    = new Logger($category);
            // 日志文件相關(guān)操作
            $handler   = new RotatingFileHandler("{$fileName}{$name}.log", $maxFiles, $level, true, $filePermission);
            // 日志格式
            $formatter = new LineFormatter("%datetime% %channel%:%level_name% %message% %context% %extra%\n", "Y-m-d H:i:s", false, true);

            $handler->setFormatter($formatter);
            $logger->pushHandler($handler);

            self::$loggers[$name] = $logger;
        }
        return self::$loggers[$name];
    }
}

只要把該文件放在項(xiàng)目的目錄下,并且保證項(xiàng)目的路由沒(méi)問(wèn)題的時(shí)候,你就可以打印日志了。

打印有多簡(jiǎn)單呢,一行即可,還是可以隨著你的自定義命名,進(jìn)行服務(wù)器上的對(duì)應(yīng)文件寫(xiě)入~

    /**
     * 如何使用log日志
     */
    public function actionUseLog()
    {
        // Log是靜態(tài)方法 引入use common\log\Log;即可以調(diào)用
        // info是寫(xiě)入的方法名稱(chēng),這里可以自定義,可以是任何文件名稱(chēng),這里如果寫(xiě)入info 服務(wù)器看到的就是帶 info-2019-01-01.log 的文件
        // 就是這么簡(jiǎn)單
        // 使用的時(shí)候在服務(wù)器新建/data/logs/monolog/ 路徑的文件夾,并且給與0666以上讀寫(xiě)權(quán)限即可
        Log::info('第一個(gè)字段是內(nèi)容',['KEY'=>'VALUE']);
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容