MongoDB 处理日志

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

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 开发领域,据说是世界上最好的编程语言。

    180 引用 • 408 回帖 • 489 关注
  • MongoDB

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

    90 引用 • 59 回帖 • 2 关注

相关帖子

欢迎来到这里!

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

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