1 Star 0 Fork 0

诺墨 / think-monolog

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
README.md 6.27 KB
一键复制 编辑 原始数据 按行查看 历史
诺墨 提交于 2021-11-10 05:48 . 重命名 READM1E.md 为 README.md

项目介绍

ThinkPHP 3.2 集成 Monolog 的扩展组件


安装使用

如何安装Composer - composer中文文档

安装

composer require normal/think-monolog:dev-master

如何使用

安装完成后, 就可以立即在应用的代码中这样使用 Monolog:

\normalcoder\Think\Logger::debug('这是一条debug日志');
\normalcoder\Think\Logger::info('这是一条info日志');
\normalcoder\Think\Logger::warn('这是一条warn日志');
\normalcoder\Think\Logger::error('这是一条error日志');

注意:

由于 SHOW_PAGE_TRACE 设为 true 以后, TP不再将trace数据记录到log.

也就是说, 在不修改TP源码的情况下想用monolog收集trace数据, TRACE BAR 和 monolog 你只能二选一。

为了不影响升级框架, 对框架的功能扩展绝不修改源码。

因此, 集成monolog后, 为了能收集到trace数据, 在内部已将 SHOW_PAGE_TRACE 设为了 false。目前默认为不记录 trace 数据


自定义

默认行为

think-monolog 默认向monolog注册了 StreamHandler, 日志级别为debug, 这就是为什么安装后可以直接使用的原因.

既然我们用monolog, 肯定是为了使用其提供的丰富的 handlers. 而不是为了仅仅在文件中记录日志. 下面将通过一个实例说明如何自定义 monolog

示例:

自己建一个行为类, 在这个行为类中完成 monolog 实例的 handlers 和 processors 的添加。

创建 Common/Behavior/MonologBehavior.class.php :

<?php
namespace Common\Behavior;

use Think\Behavior;
use normalcoder\Think\Logger;
use Monolog\Handler\MongoDBHandler;

class MonologBehavior extends Behavior
{
    public function run( &$params )
    {
        /**
         think-monolog 默认注册的StreamHandler的日志级别为 debug. 
         如果你想改变它的级别或者不想使用StreamHandler, 就需要先取出这个handler.
         假设,我们现在的在生产环境下的日志需求是这样:
            1. 只想在本地文件中记录Error以上级别的日志供常规检查
            2. info 以上的日志向发到外部的 MongoDb 数据库中,供日志监控和分析
            3. 不记录任何debug信息.
        */       
        $logger = Logger::getLogger();
        $stream_handler = $logger->popHandler();  // 取出 StreamHandler 对象
        $stream_handler->setLevel(Logger::ERROR); // 重设其日志级别
        $logger->pushHandler($stream_handler);    // 注册修改后的StreamHandler 对象
        
        $mongodb = new MongoDBHandler(new \Mongo("mongodb://***.***.***.***:27017"), "logs", "prod", Logger::INFO);
        $logger->pushHandler($mongodb); // 文件
    }
}

Common/Conf/tags.php 增加一个app_begin行为:

return array(
    'app_begin' =>array(
        'Common\Behavior\MonologBehavior'
        ),
);

接管TP默认trace行为

默认情况, think-monolog 并不会接管ThinkPHP的 trace 逻辑. 二者互不影响.

如果你希望 think-monolog 接管ThinkPHP的trace逻辑, 只需要将 LOG_TYPE 配置设为monolog. 这样配置以后, SHOW_PAGE_TRACE 将强制关闭, 以便monolog完全接管日志工作.

注意:由于ThinkPHP日志格式设计的问题,对日志的格式解析往往不尽人意。在 think-monolog 接管 trace 后,默认情况下不对 trace 进行记录。

如果需要记录 trace,可以在 Monolog.php 中打开查找如下代码,去掉注释即可。取消注释后,你可以像过去一样使用TP的 trace 函数记录日志, 所有的trace数据依然是以一条日志的形式在请求结束时被monolog记录。

if (false !== strpos($log, 'INFO: [ app_begin ] --START--')) { //取消对ThinkPHP运行生命周期 trace Log 的记录
    //$logger->addRecord(Mlogger::EMERGENCY,"\r\n".$log); 
} else {
}

如果你希望单独记录一些日志, 依然需要使用 monolog:

\normalcoder\Think\Logger::debug('这是一条debug日志');
\normalcoder\Think\Logger::info('这是一条info日志');
\normalcoder\Think\Logger::warn('这是一条warn日志');
\normalcoder\Think\Logger::error('这是一条error日志');

注意:

handler的日志级别设置仅对直接通过 monolog 添加的日志有效。无论handler的日志级别如何, trace 日志一定会被无条件记录。

因此, 接管后不建议使用trace函数记录日志。


关于

Monolog简介

Monolog 是 Laravel,Symfony,Silex 默认集成的日志库, 同时大量其他框架提供了集成扩展。它是一款极为流行的 php log 库, 自带超多handler, 长期维护, 稳定更新。

Monolog可以把你的日志发送到文件,sockets,收件箱,数据库和各种web服务器上。一些特殊的组件可以给你带来特殊的日志策略。同时,它支持以各种方式记录日志: 记录到文件,mail,nosql,mail,irc,firephp,elasticsearch服务器....

相关Github仓库:

Monolog: https://github.com/Seldaek/monolog

Monolog docs: https://github.com/Seldaek/monolog/tree/master/doc


感谢

本扩展是基于 snowair/think-monolog 修改而来,再次感谢 @snowair

PHP
1
https://gitee.com/normalcoder/think-monolog.git
git@gitee.com:normalcoder/think-monolog.git
normalcoder
think-monolog
think-monolog
master

搜索帮助