• monolog封装


    做一下基本关于Monolog的基本介绍:

    Monolog是基于PHP的日志类库。

    介绍就到这,言归正传

    安装

    安装最新版本:(composer 还没安装的~:https://www.phpcomposer.com/)

    composer require monolog/monolog
    

    要求PHP版本为5.3以上。

    以上都是百度都可以进行搜索的废话,这里咱们只是进行复制并且再废话一遍~

    接下来的是重点:

    <?php
    /**
     * Created by PhpStorm.
     * User: j
     * Date: 2019-01-09
     * Time: 15:33
     */
    namespace commonlog;
    
    use MonologFormatterLineFormatter;
    use MonologLogger;
    use MonologHandlerRotatingFileHandler;
    
    class Log
    {
        private static $loggers;
    
        /**
         * 日志默认保存路径
         * @var string
         */
        private static $fileName = '/data/logs/monolog/';
    
        /**
         * 日志留存时间
         * @var int
         */
        private static $maxFiles = 31;
    
        /**
         * 日志等级
         * @var int
         */
        private static $level = Logger::DEBUG;
    
        /**
         * 文件读写权限分配
         * 0666 保证log日志文件可以被其他用户/进程读写
         * @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数组第$idx元素是当前行,第$idx+1元素表示上一层,另外function、class需再往上取一个层次
            // PHP7 不会包含'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);
        }
    
        /**
         * 创建日志
         * @param $name
         * @return mixed
         */
        private static function createLogger($name)
        {
            if (empty(self::$loggers[$name])) {
                // 根据业务域名与方法名进行日志名称的确定
                $category       = $_SERVER['SERVER_NAME'];
                // 日志文件目录
                $fileName       = self::$fileName;
                // 日志保存时间
                $maxFiles       = self::$maxFiles;
                // 日志等级
                $level          = self::$level;
                // 权限
                $filePermission = self::$filePermission;
    
                // 创建日志
                $logger    = new Logger($category);
                // 日志文件相关操作
                $handler   = new RotatingFileHandler("{$fileName}{$name}.log", $maxFiles, $level, true, $filePermission);
                // 日志格式
                $formatter = new LineFormatter("%datetime% %channel%:%level_name% %message% %context% %extra%
    ", "Y-m-d H:i:s", false, true);
    
                $handler->setFormatter($formatter);
                $logger->pushHandler($handler);
    
                self::$loggers[$name] = $logger;
            }
            return self::$loggers[$name];
        }
    }
    

    只要把该文件放在项目的目录下,并且保证项目的路由没问题的时候,你就可以打印日志了。

    打印有多简单呢,一行即可,还是可以随着你的自定义命名,进行服务器上的对应文件写入~

        /**
         * 如何使用log日志
         */
        public function actionUseLog()
        {
            // Log是静态方法 引入use commonlogLog;即可以调用
            // info是写入的方法名称,这里可以自定义,可以是任何文件名称,这里如果写入info 服务器看到的就是带 info-2019-01-01.log 的文件
            // 就是这么简单
            // 使用的时候在服务器新建/data/logs/monolog/ 路径的文件夹,并且给与0666以上读写权限即可
            Log::info('第一个字段是内容',['KEY'=>'VALUE']);
        }



    转自 https://www.jianshu.com/p/0aeb8824fe23

  • 相关阅读:
    LeetCode (Two Sum & Add Two nums)
    打包时记录编译开始时间并在App中获取
    CocoaPods
    不知所云
    苹果审核相关内容
    iOS权限的一些备注
    触发网络权限弹窗的一些特别方式记录
    iOS13和iOS14里面访问相册选取图片的两种方式的区别
    @Configuration@Bean
    ACID
  • 原文地址:https://www.cnblogs.com/brady-wang/p/13369497.html
Copyright © 2020-2023  润新知