Phalcon搭建多模块框架十二:注册日志记录器服务及简单使用

phalcon提供了Phalcon\Logger\Adapter\File(保存日志到普通文件)、Phalcon\Logger\Adapter\Stream(保存日志到PHP流)、Phalcon\Logger\Adapter\Syslog(Phalcon\Logger\Adapter\Syslog)、Phalcon\Logger\Adapter\FirePHP(发送日志到FirePHP)等多种日志记录器适配器,还提供了Phalcon\Logger\Formatter\Line(文本方式格式化信息)、Phalcon\Logger\Formatter\Firephp(格式化消息以便将它们发送到FirePHP)、Phalcon\Logger\Formatter\Json(使用JSON格式格式化信息)、Phalcon\Logger\Formatter\Syslog(使用系统提供的格式格式化信息)多种信息格式适配器。
这里常用的是Phalcon\Logger\Adapter\FilePhalcon\Logger\Formatter\Line适配器组合。
下面进入正文:
这里写图片描述
1、打开config/config.php,添加

 'logger' => [ 
            'line' => [ 
                'format' => '[%date%][%type%] %message%',
                'date_format' => 'Y-m-d H:i:s'
            ],
            'file' => [ 
                'alert' => BASE_PATH . 'runtime/' . DEFAULT_MODULE . '/logs/alert/{Y/m/d}/{YmdH}.log',
                'critical' => BASE_PATH . 'runtime/' . DEFAULT_MODULE . '/logs/critical/{Y/m/d}/{YmdH}.log',
                'debug' => BASE_PATH . 'runtime/' . DEFAULT_MODULE . '/logs/debug/{Y/m/d}/{YmdH}.log',
                'error' => BASE_PATH . 'runtime/' . DEFAULT_MODULE . '/logs/error/{Y/m/d}/{YmdH}.log',
                'emergency' => BASE_PATH . 'runtime/' . DEFAULT_MODULE . '/logs/emergency/{Y/m/d}/{YmdH}.log',
                'info' => BASE_PATH . 'runtime/' . DEFAULT_MODULE . '/logs/info/{Y/m/d}/{YmdH}.log',
                'notice' => BASE_PATH . 'runtime/' . DEFAULT_MODULE . '/logs/notice/{Y/m/d}/{YmdH}.log',
                'warning' => BASE_PATH . 'runtime/' . DEFAULT_MODULE . '/logs/warning/{Y/m/d}/{YmdH}.log'
            ]
        ]

完整的config/config.php

<?php
/**
 * @desc 全局配置文件
 * @author zhaoyang
 * @date 2018年5月3日 下午7:54:47
 */
return [ 
    // 服务配置
    'services' => [ 
        // mysql数据库配置
        'db' => [ 
            'host' => 'localhost',
            'port' => 3306,
            'username' => 'root',
            'password' => '123456',
            'dbname' => 'phalcon',
            'charset' => 'utf8'
        ],
        // 调度器配置
        'dispatcher' => [ 
            // 处理 Not-Found错误配置
            'notfound' => [ 
                // 错误码及错误提示(ajax和post请求)
                'status_code' => 404,
                'message' => 'Not Found',
                // 错误跳转的页面
                'namespace' => DEFAULT_MODULE_NAMESPACE . '\\Controllers',
                'controller' => 'error',
                'action' => 'error404'
            ]
        ],
        // volt引擎相关配置
        'view_engine_volt' => [ 
            // 编译模板目录
            'compiled_path' => BASE_PATH . 'runtime/' . DEFAULT_MODULE . '/compiled/volt' . DS,
            // 是否实时编译
            'compile_always' => false,
            // 附加到已编译的PHP文件的扩展名
            'compiled_extension' => '.php',
            // 使用这个替换目录分隔符
            'compiled_separator' => '%%',
            // 是否要检查在模板文件和它的编译路径之间是否存在差异
            'stat' => true,
            // 模板前缀
            'prefix' => '',
            // 支持HTML的全局自动转义
            'autoescape' => false
        ],
        // 模板相关配置
        'view' => [ 
            // 模板后缀
            'view_suffix' => 'volt,phtml',
            // 模板路径
            'view_path' => APP_PATH . DEFAULT_MODULE . '/views' . DS,
            // 模板引擎,暂时支持viewEngineVolt or viewEnginePhp,与模板后缀一一对应
            'view_service' => 'viewEngineVolt,viewEnginePhp'
        ],
        // 过滤器设置
        'filter' => [ 
            // 过滤类型,支持string、trim、absint、int、email、float、int!、float!、alphanum、striptags、lower、upper、url、special_chars
            'default_filter' => 'string,trim'
        ],
        // 文件日志,formatter常用line,adapter常用file
        'logger' => [ 
            'line' => [ 
                'format' => '[%date%][%type%] %message%',
                'date_format' => 'Y-m-d H:i:s'
            ],
            'file' => [ 
                'alert' => BASE_PATH . 'runtime/' . DEFAULT_MODULE . '/logs/alert/{Y/m/d}/{YmdH}.log',
                'critical' => BASE_PATH . 'runtime/' . DEFAULT_MODULE . '/logs/critical/{Y/m/d}/{YmdH}.log',
                'debug' => BASE_PATH . 'runtime/' . DEFAULT_MODULE . '/logs/debug/{Y/m/d}/{YmdH}.log',
                'error' => BASE_PATH . 'runtime/' . DEFAULT_MODULE . '/logs/error/{Y/m/d}/{YmdH}.log',
                'emergency' => BASE_PATH . 'runtime/' . DEFAULT_MODULE . '/logs/emergency/{Y/m/d}/{YmdH}.log',
                'info' => BASE_PATH . 'runtime/' . DEFAULT_MODULE . '/logs/info/{Y/m/d}/{YmdH}.log',
                'notice' => BASE_PATH . 'runtime/' . DEFAULT_MODULE . '/logs/notice/{Y/m/d}/{YmdH}.log',
                'warning' => BASE_PATH . 'runtime/' . DEFAULT_MODULE . '/logs/warning/{Y/m/d}/{YmdH}.log'
            ]
        ]
    ]

];

2、打开home模块配置文件app/home/config/config.php,添加

'logger' => [
            'line' => [
                'format' => '[%date%][%type%] %message%',
                'dateFormat' => 'Y-m-d H:i:s'
            ],
            'file' => [
                'alert' => BASE_PATH . 'runtime/' . MODULE_NAME . '/logs/alert/{Y/m/d}/{YmdH}.log',
                'critical' => BASE_PATH . 'runtime/' . MODULE_NAME . '/logs/critical/{Y/m/d}/{YmdH}.log',
                'debug' => BASE_PATH . 'runtime/' . MODULE_NAME . '/logs/debug/{Y/m/d}/{YmdH}.log',
                'error' => BASE_PATH . 'runtime/' . MODULE_NAME . '/logs/error/{Y/m/d}/{YmdH}.log',
                'emergency' => BASE_PATH . 'runtime/' . MODULE_NAME . '/logs/emergency/{Y/m/d}/{YmdH}.log',
                'info' => BASE_PATH . 'runtime/' . MODULE_NAME . '/logs/info/{Y/m/d}/{YmdH}.log',
                'notice' => BASE_PATH . 'runtime/' . MODULE_NAME . '/logs/notice/{Y/m/d}/{YmdH}.log',
                'warning' => BASE_PATH . 'runtime/' . MODULE_NAME . '/logs/warning/{Y/m/d}/{YmdH}.log'
            ]
        ]

完整的app/home/config/config.php:

<?php
// 模块名称
defined('MODULE_NAME') || define('MODULE_NAME', 'home');
// 模块命名空间
defined('MODULE_NAMESPACE') || define('MODULE_NAMESPACE', APP_NAMESPACE . '\\Home');

return [
    // 需要注册的模块命名空间
    'module_namespaces' => [
        MODULE_NAMESPACE . '\\Controllers' => APP_PATH . MODULE_NAME . '/controllers' . DS,
        MODULE_NAMESPACE . '\\Models' => APP_PATH . MODULE_NAME . '/models' . DS,
    ],
    // 模块默认的命名空间
    'module_default_namespaces' => MODULE_NAMESPACE . '\\Controllers',
    // 服务配置
    'services' => [
        // 调度器配置
        'dispatcher' => [
            // 处理 Not-Found错误配置
            'notfound' => [
                // 错误码及错误提示(ajax和post请求)
                'status_code' => 404,
                'message' => 'Not Found',
                // 错误跳转的页面
                'namespace' => MODULE_NAMESPACE . '\\Controllers',
                'controller' => 'error',
                'action' => 'error404'
            ],
        ],
        // volt引擎相关配置
        'view_engine_volt' => [
            // 编译模板目录
            'compiled_path' => BASE_PATH . 'runtime/' . MODULE_NAME . '/compiled/volt' . DS,
            // 是否实时编译
            'compile_always' => false,
            // 附加到已编译的PHP文件的扩展名
            'compiled_extension' => '.php',
            // 使用这个替换目录分隔符
            'compiled_separator' => '%%',
            // 是否要检查在模板文件和它的编译路径之间是否存在差异
            'stat' => true,
            // 模板前缀
            'prefix' => '',
            // 支持HTML的全局自动转义
            'autoescape' => false
        ],
        // 模板相关配置
        'view' => [
            // 模板后缀
            'view_suffix' => 'volt,phtml',
            // 模板路径
            'view_path' => APP_PATH . MODULE_NAME . '/views' . DS,
            // 模板引擎,暂时支持viewEngineVolt or viewEnginePhp,与模板后缀一一对应
            'view_service' => 'viewEngineVolt,viewEnginePhp',
        ],
        // 过滤器设置
        'filter' => [
            // 过滤类型,支持string、trim、absint、int、email、float、int!、float!、alphanum、striptags、lower、upper、url、special_chars
            'default_filter' => 'string,trim'
        ],
        // 文件日志,formatter常用line,adapter常用file
        'logger' => [
            'line' => [
                'format' => '[%date%][%type%] %message%',
                'dateFormat' => 'Y-m-d H:i:s'
            ],
            'file' => [
                'alert' => BASE_PATH . 'runtime/' . MODULE_NAME . '/logs/alert/{Y/m/d}/{YmdH}.log',
                'critical' => BASE_PATH . 'runtime/' . MODULE_NAME . '/logs/critical/{Y/m/d}/{YmdH}.log',
                'debug' => BASE_PATH . 'runtime/' . MODULE_NAME . '/logs/debug/{Y/m/d}/{YmdH}.log',
                'error' => BASE_PATH . 'runtime/' . MODULE_NAME . '/logs/error/{Y/m/d}/{YmdH}.log',
                'emergency' => BASE_PATH . 'runtime/' . MODULE_NAME . '/logs/emergency/{Y/m/d}/{YmdH}.log',
                'info' => BASE_PATH . 'runtime/' . MODULE_NAME . '/logs/info/{Y/m/d}/{YmdH}.log',
                'notice' => BASE_PATH . 'runtime/' . MODULE_NAME . '/logs/notice/{Y/m/d}/{YmdH}.log',
                'warning' => BASE_PATH . 'runtime/' . MODULE_NAME . '/logs/warning/{Y/m/d}/{YmdH}.log'
            ]
        ]
    ]
];

3、打开config/services.php文件,
添加:

$di->set('logger', function (string $file = null, array $line = null) {
    $config = $this->getConfig()->services->logger;
    $linConfig = $config->line;
    if(!is_null($line)){
        $lineObj = new Config($line);
        $linConfig = $linConfig->merge($lineObj);
    }
    $loggerFormatterLine = new LoggerFormatterLine($linConfig->format, $linConfig->date_format);
    $fileConfig = $config->file;
    if(empty($file)){
        $file = $fileConfig->info;
    }else if(array_key_exists($file, $fileConfig->toArray())){
        $file = $fileConfig->$file;
    }
    $file = Common::dirFormat($file);
    $dir = dirname($file);
    $mkdirRes = Common::mkdir($dir);
    if (!$mkdirRes) {
        throw new \Exception('创建目录 ' . $dir . ' 失败');
    }
    $loggerAdapterFile = new LoggerAdapterFile($file);
    $loggerAdapterFile->setFormatter($loggerFormatterLine);
    return $loggerAdapterFile;
});

注:这里服务最好不要注册成单例模式,否则单次请求都会写入一个文件

对于非单例模式(set())
在控制器中
以下四种写法均为同一实例(单例)

$this->logger
$this->di['logger']
$this->di->getShared('logger')
$this->getDi()->getShared('logger')

以下四种写法均为不同实例(不同对象)

$this->di->getLogger()
$this->getDi()->getLogger()
$this->di->get('logger')
$this->di->get('logger', 参数)

对于单例模式(setShared())
在控制器中
以上所有写法均为同一实例(单例)

完整的config/services.php:

<?php
/**
 * @desc 注册服务
 * @author zhaoyang
 * @date 2018年5月3日 下午8:01:34
 */

use Common\Common;
use Common\Validate;
use Library\Extensions\VoltExtension;
use Library\Plugins\DIspatcherPlugin;
use Phalcon\Config;
use Phalcon\Db\Adapter\Pdo\Mysql;
use Phalcon\DI;
use Phalcon\Di\FactoryDefault;
use Phalcon\Events\Manager as EventsManager;
use Phalcon\Logger\Adapter\File as LoggerAdapterFile;
use Phalcon\Logger\Formatter\Line as LoggerFormatterLine;
use Phalcon\Mvc\Dispatcher;
use Phalcon\Mvc\Router;
use Phalcon\Mvc\View;
use Phalcon\Mvc\View\Engine\Volt as ViewEngineVolt;
use Phalcon\Mvc\View\Engine\Php as ViewEnginePhp;

$di = new FactoryDefault();

/**
 * @desc 注册调度器服务
 * @author zhaoyang
 * @date 2018年5月3日 下午8:38:34
 */
$di->setShared('dispatcher', function () {
    $config = $this->getConfig();
    $dispatcher = new Dispatcher();
    $defaultNamespace = $config->module_default_namespaces ?? DEFAULT_MODULE_NAMESPACE . '\\Controllers';
    $dispatcher->setDefaultNamespace($defaultNamespace);
    $eventsManager = new EventsManager();
    $eventsManager->attach('dispatch', new DIspatcherPlugin());
    $dispatcher->setEventsManager($eventsManager);
    return $dispatcher;
});

/**
 * @desc 注册配置服务
 * @author zhaoyang
 * @date 2018年5月3日 下午8:38:53
 */
$di->setShared('config', function () use ($config) {
    return new Config($config);
});

/**
 * @desc 注册路由服务
 * @author zhaoyang
 * @date 2018年5月3日 下午8:39:06
 */
$di->setShared('router', function () use ($routerRules) {
    $router = new Router();
    // 自动删除末尾斜线
    $router->removeExtraSlashes(true);
    foreach ($routerRules as $k => $v) {
        $router->add($k, $v);
    }
    return $router;
});

/**
 * @desc 注册视图引擎volt服务
 * @author zhaoyang
 * @date 2018年5月4日 下午5:28:52
 */
$di->setShared('viewEngineVolt', function (View $view, DI $di) {
    // 获取config服务有多种方法,这是其一
    $voltConfig = $di->get('config')->services->view_engine_volt->toArray();
    $voltConfig = Common::convertArrKeyUnderline($voltConfig);
    $viewEngineVolt = new ViewEngineVolt($view, $di);
    $voltConfig['compiledPath'] = isset($voltConfig['compiledPath']) ? Common::dirFormat($voltConfig['compiledPath']) : BASE_PATH . 'runtime/' . DEFAULT_MODULE . '/compiled/volt' . DS;
    $mkdirRes = Common::mkdir($voltConfig['compiledPath']);
    if (!$mkdirRes) {
        throw new \Exception('创建目录 ' . $voltConfig['compiledPath'] . ' 失败');
    }
    $viewEngineVolt->setOptions($voltConfig);
    // 获取编译器对象
    $compiler = $viewEngineVolt->getCompiler();
    // 添加扩展
    $compiler->addExtension(new VoltExtension());
    return $viewEngineVolt;
});

/**
 * @desc 注册视图引擎php服务
 * @author zhaoyang
 * @date 2018年5月4日 下午5:29:15
 */
$di->setShared('viewEnginePhp', function (View $view, DI $di) {
    $viewEnginePhp = new ViewEnginePhp($view, $di);
    return $viewEnginePhp;
});

/**
 * @desc 注册视图服务
 * @author zhaoyang
 * @date 2018年5月3日 下午10:52:37
 */
$di->set('view', function () {
    // 获取config服务有多种方法,这是其二
    $viewConfig = $this->getConfig()->services->view;
    $viewDir = $viewConfig->view_path ?? APP_PATH . DEFAULT_MODULE . '/views' . DS;
    if (isset($viewConfig->view_suffix)) {
        $viewSuffixs = explode(',', $viewConfig->view_suffix);
    } else {
        $viewSuffixs = [ 
            'volt'
        ];
    }
    if (isset($viewConfig->view_service)) {
        $viewServices = explode(',', $viewConfig->view_service);
    } else {
        $viewServices = [ 
            'viewEngineVolt'
        ];
    }
    $engines = [ ];
    foreach ($viewSuffixs as $k => $v) {
        $suffix = '.' . ltrim($v, '.');
        $engines[$suffix] = $viewServices[$k] ?? $viewServices[0];
    }
    $view = new View();
    // 设置视图路径
    $view->setViewsDir($viewDir);
    // 注册视图引擎
    $view->registerEngines($engines);
    // 如果不需要“生成显示到控制器布局”和“生成显示到主布局”,则关闭这两个渲染级别
    $view->disableLevel([ 
        View::LEVEL_LAYOUT => true,
        View::LEVEL_MAIN_LAYOUT => true
    ]);
    return $view;
});

/** 
 * @desc 注册验证服务 
 * @author zhaoyang 
 * @date 2018年5月11日 下午7:26:30 
 */
$di->set('validate', function () {
    $validate = new Validate();
    return $validate;
});

/** 
 * @desc 注册数据库(连接)服务 
 * @author zhaoyang 
 * @date 2018年5月14日 下午9:01:36 
 */
$di->setShared('db', function () {
    $dbConfig = $this->getConfig()->services->db->toArray();
    $mysql = new Mysql($dbConfig);
    return $mysql;
});

/** 
 * @desc 注册日志服务 
 * @author zhaoyang 
 * @date 2018年5月19日 下午6:20:36 
 */
$di->set('logger', function (string $file = null, array $line = null) {
    $config = $this->getConfig()->services->logger;
    $linConfig = $config->line;
    if(!is_null($line)){
        $lineObj = new Config($line);
        $linConfig = $linConfig->merge($lineObj);
    }
    $loggerFormatterLine = new LoggerFormatterLine($linConfig->format, $linConfig->date_format);
    $fileConfig = $config->file;
    if(empty($file)){
        $file = $fileConfig->info;
    }else if(array_key_exists($file, $fileConfig->toArray())){
        $file = $fileConfig->$file;
    }
    $file = Common::dirFormat($file);
    $dir = dirname($file);
    $mkdirRes = Common::mkdir($dir);
    if (!$mkdirRes) {
        throw new \Exception('创建目录 ' . $dir . ' 失败');
    }
    $loggerAdapterFile = new LoggerAdapterFile($file);
    $loggerAdapterFile->setFormatter($loggerFormatterLine);
    return $loggerAdapterFile;
});

4、创建LoggerController.php控制器测试。

<?php
namespace App\Home\Controllers;

use Common\BaseController;
use Phalcon\Logger;

class LoggerController extends BaseController {

    public function indexAction() {

        $this->logger->log('This is an info message1', Logger::INFO);

        $this->logger->info('This is an info message2');

        $this->di->getLogger()->info('This is an info message3');

        $this->getDi()->getLogger()->info('This is an info message4');

        $this->di['logger']->info('This is an info message5');

        $this->di->get('logger')->info('This is an info message6');

        $this->di->get('logger', [
            null,
            [
                'format' => '[%type%][%date%] %message%',
                'date_format' => 'm-d H:i:s'
            ]
        ])->info('This is an info message7');

        $this->di->get('logger', ['alert'])->alert('This is an alert message1');

        $this->di->get('logger', [
            'alert',
            [
                'format' => '[%type%][%date%] %message%',
                'date_format' => 'm-d H:i:s'
            ]
        ])->alert('This is an alert message2');

        $file = BASE_PATH . 'runtime/' . MODULE_NAME . '/logs/alert1111/{Y/m/d}/{YmdH}.log';

        $this->di->get('logger', [$file])->alert('This is an alert1111 message');

        exit();
    }

}

访问/logger/index,可以看到runtime目录下生成
这里写图片描述

猜你喜欢

转载自blog.csdn.net/u014691098/article/details/80378966