Zend Framework 3 中基于日志级别编写日志

问题描述

我们最近开始将一个项目从 Zend Framework 1 迁移到 Zend Framework 3。在 Zend Framework 1 中,我们使用 Log4PHP 库进行应用程序日志记录。使用 Log4PHP,我们能够根据日志级别(调试、信息和错误)将日志记录在不​​同的文件中。

Log4PHP 库与 Zend Framework 3 不兼容。因此决定使用 Zend Framework 3 中可用的 Zend Log 组件。我试图通过查看互联网上可用的文档来根据日志级别放置日志,并注意到所有日志正在写入指定为 writer 一部分的所有提到的文件

HomeControllerFactory.PHP

    <?PHP
    namespace Application\Controller;

    use Zend\ServiceManager\Factory\FactoryInterface;
    use Interop\Container\ContainerInterface;
    use Zend\Log\Logger;
    use Zend\Log\Writer;

    class HomeControllerFactory implements FactoryInterface
    {
        public function __invoke(ContainerInterface $container,$requestedname,array $options = null)
        {
            $serviceManager = $container->get('ServiceManager');
            $logger = $container->get(Logger::class);
            $infoWriter = new Writer\Stream('C:\log\info.log');
            $debugWriter = new Writer\Stream('C:\log\debug.log');
            $errorWriter = new Writer\Stream('C:\log\error.log');
            $logger->addWriter($infoWriter,6);
            $logger->addWriter($debugWriter,7);
            $logger->addWriter($errorWriter,3);
            return new HomeController($serviceManager,$logger);
        }
    }

HomeController.PHP

    <?PHP
    /**
     * @link      http://github.com/zendframework/ZendSkeletonApplication for the canonical source     repository
     * @copyright copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
     * @license   http://framework.zend.com/license/new-bsd New BSD License
     */
    
    namespace Application\Controller;
    
    use Zend\Mvc\Controller\AbstractActionController;
    use Zend\View\Model\viewmodel;
    use \Zend\ServiceManager\ServiceManager;
    use Zend\Log\Logger;
    use Application\Model\UTP\UTPUtils;
    
    class HomeController extends AbstractActionController {
    
        private $serviceManager;
        private $logger;
    
        public function __construct(ServiceManager $serviceManager,Logger $objLogger)
        {
            $this->serviceManager = $serviceManager;
            $this->logger = $objLogger;
        }
    
        public function indexAction() {
            $config = $this->serviceManager->get('config');

            $this->logger->info(__CLASS__ . ' It is an info log');
            $this->logger->debug(__CLASS__ . ' It is a debug log');
            $this->logger->err(__CLASS__ . ' It is an error log');
        }

    }

这样,所有三个日志都写入了所有 3 个文件 error.log、info.log、debug.log 我想要实现的是,如果我们打电话

  • $this->logger->debug(<message>),日志应写入 debug.log 文件
  • $this->logger->info(<message>),日志应写入 info.log 文件
  • $this->logger->err(<message>),日志应该写入error.log文件

解决方法

也许你可以用 Monolog 库代替 Zend Log? 然后你可以写:

use Monolog\Logger;
use Monolog\Handler\StreamHandler;

// create a log channel
$log = new Logger('name');
$log->pushHandler(new StreamHandler('C:\log\info.log',Logger::INFO));
$log->pushHandler(new StreamHandler('C:\log\debug.log',Logger::DEBUG));
$log->pushHandler(new StreamHandler('C:\log\error.log',Logger::ERROR));

// add records to the log
$log->warning('Foo');
$log->error('Bar');

并且您的代码将与 PSR-3 标准兼容