MongoDB 处理日志

本贴最后更新于 1421 天前,其中的信息可能已经时移俗易

Monolog 是 php 下比较全又容易扩展的记录日志组件。目前有包括 Symfony 、Laravel、 CakePHP 等诸多知名 php 框架都内置了 Monolog。Monolog 可以把你的日志发送到文件,sockets,收件箱,数据库和各种 web 服务器上。一些特殊的组件可以给你带来特殊的日志策略。

PHP 框架中引入扩展包

#  安装 monolog
composer require monolog/monolog
# 安装 mongodb
composer require  mongodb/mongodb

封装 MongoDB 和 Monolog 代码:

<?php
/**
 * Monolog + MongoDB 配置日志记录
 */

namespace App\Core\Lib;

use Monolog\Logger;
use MongoDB\Client;
use Monolog\Handler\MongoDBHandler;

class Monolog {

    private static $loggers;

    /**
     * 日志等级
     * @var int
     */
    private static $level = Logger::DEBUG;


    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'];
            // 创建日志
            $logger = new Logger($category);
            // 日志相关操作(mongodb配置信息可配置到配置文件)
            $client = new Client('mongodb://localhost:27017');
            $handler = new MongoDBHandler($client, 'logs', 'prod');
            $logger->pushHandler($handler);

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

使用示例

 * 
 *      使用示例,首先在配置文件中配置mongodb的连接URI
 *      示例:'mongodb://localhost:27017'
 *      代码逻辑中直接引入命名空间
 *      use App\Core\Lib\Monolog;
 *
 *      //@param string $channel 一个日志实例通道
 *      //@param array $arguments 日志内容
 *      Monolog::debug('test', ["名称:{$storagecount}"]);
 *      Monolog::info('test', ["名称:{$storagecount}"]);
 *      Monolog::notice('test', ["名称:{$storagecount}"]);
 *      Monolog::warning('test', ["名称:{$storagecount}"]);
 *      Monolog::error('test', ["名称:{$storagecount}"]);
 *      Monolog::criticle('test', ["名称:{$storagecount}"]);
 *      Monolog::alert('test', ["名称:{$storagecount}"]);
 *      Monolog::emergency('test', ["名称:{$storagecount}"]);
 * 

了解更多 Monolog 请参见:https://www.jianshu.com/p/b99dc5c3b760

  • PHP

    PHP(Hypertext Preprocessor)是一种开源脚本语言。语法吸收了 C 语言、 Java 和 Perl 的特点,主要适用于 Web 开发领域,据说是世界上最好的编程语言。

    164 引用 • 407 回帖 • 523 关注
  • MongoDB

    MongoDB(来自于英文单词“Humongous”,中文含义为“庞大”)是一个基于分布式文件存储的数据库,由 C++ 语言编写。旨在为应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似 JSON 的 BSON 格式,因此可以存储比较复杂的数据类型。

    90 引用 • 59 回帖 • 3 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...