zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    HTML DOM教程 14HTML DOM Document 对象
    HTML DOM教程 19HTML DOM Button 对象
    HTML DOM教程 22HTML DOM Form 对象
    HTML DOM教程 16HTML DOM Area 对象
    ubuntu 11.04 问题 小结
    VC6.0的 错误解决办法 小结
    boot.img的解包与打包
    shell里 截取字符串
    从零 使用vc
    Imagemagick 对图片 大小 和 格式的 调整
  • 原文地址:https://www.cnblogs.com/brady-wang/p/13369497.html
Copyright © 2011-2022 走看看