문제

ZF2의 ServiceManager를 통해 로거 인스턴스를 시작하고 재사용하는 가장 좋은 방법이 무엇인지 궁금합니다.물론 다음과 같이 모든 클래스에서 사용할 수 있는 간단한 방법을 수행할 수 있습니다.

public function getLogger () {
        $this->logger = new Logger();
        $this->logger->addWriter(new Writer\Stream('/log/cms_errors.log'));
        return $logger;
    }

하지만 global.php에 유사한 구조를 등록하는 가장 좋은 방법이 무엇인지 궁금합니다.지금까지는 할 수 있어요

global.php에 다음을 추가하세요.

'Zend\Log'=>array(
        'timestampFormat' => 'Y-m-d',
        array(
            'writerName'   => 'Stream',
            'writerParams' => array(
                'stream'   => '/log/zend.log',
            ),
            'formatterName' => 'Simple',            
        ),
    ),

다음을 통해 호출하려고 하면:

$this->getServiceLocator()->get('Zend\Log')

나는 다음을 얻습니다 :

Zend\ServiceManager\ServiceManager::get was unable to fetch or create an instance for Zend\Log
도움이 되었습니까?

해결책

다음 데이터를 'global.php'

에 추가하십시오.
'service_manager' => array(
    'factories' => array(
        'Zend\Log' => function ($sm) {
            $log = new Zend\Log\Logger();
            $writer = new Zend\Log\Writer\Stream('./data/logs/logfile');
            $log->addWriter($writer);

            return $log;
        },
    ),
),
.

을 누른 다음

를 호출 할 수 있습니다.
$this->getServiceLocator()->get('Zend\Log')->info('Something...');
.

다른 팁

또는 더 우아하게 로그 수신기를 설정하고 로거를 앱에서 분리된 상태로 유지할 수 있습니다.그만큼 EventManager 매우 강력한 구성 요소이며 ZF2는 기본적으로 현재 이벤트 중심 프레임워크입니다.

당신의 module.php 다음과 같은 것을 추가할 수 있습니다:

// Setup the Zend Logger, pseudocode
$logger = new Logger;
$writer = new Writer;
$logger->addWriter($writer);

// Attach a logging listener for the log event on application level, working code
$events = StaticEventManager::getInstance();
$events->attach('*', 'log', function($event) use ($logger) {
    $target = get_class($event->getTarget());
    $message = $event->getParam('message', 'No message provided');
    $priority = (int) $event->getParam('priority', Logger::INFO);
    $message = sprintf('%s: %s', $target, $message);
    $logger->log($priority, $message);
});

그런 다음 어디서나컨트롤러에서 다음을 수행할 수 있습니다.

$this->getEventManager()->trigger('log', $this, array(
                                                       'priority' => 7, 
                                                       'message' => 'some log message'
                                                      ));

일반 공장 대신 구성을 위해 추상적 인 로거 팩토리를 사용할 수 있습니다

http : //framework.zend.com/manual/2.2/en/modules/zend.mvc.services.html#zend-log-loggeRabstractServiceFactory

return array(
    'log' => array(
        'Log\App' => array(
            'writers' => array(
                array(
                    'name' => 'stream',
                    'priority' => 1000,
                    'options' => array(
                        'stream' => 'data/logs/app.log',
                    ),
                ),
            ),
        ),
    ),
);
.

절대 경로 \

를 사용하여 다시 시도하십시오.
$writer = new \Zend\Log\Writer\Stream('log.log');
$logger = new \Zend\Log\Logger($writer);
.

i 내 부트 스트랩에 기본 데이터베이스 작성자 개체를 만들고 ServiceManager에 등록했습니다.

public function onBootstrap(MvcEvent $e)
{
    ...

    $serviceManager     = $e->getApplication()->getServiceManager();
    $dbAdapter          = $serviceManager->get('Zend\Db\Adapter\Adapter');

    $writer = new \Zend\Log\Writer\Db($dbAdapter, 'log_database_table');
    $logger = new \Zend\Log\Logger();
    $logger->addWriter($writer);

    // this is optional but nice to have
    \Zend\Log\Logger::registerErrorHandler($logger);

    $serviceManager->setService('Zend\Log', $logger);
}
.

AbstractController는 "serviceLocatowareInterface"의 인스턴스입니다.그래서 나는 내 컨트롤러에서 전화 할 수 있습니다

public function indexAction()
{
    ...

    $this->getServiceLocator()->get('Zend\Log')->info('this is a test log message');

    ...
}
.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top