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

原文地址:https://www.cnblogs.com/brady-wang/p/13369497.html