ZF2의 ServiceManager에 Zend\Log 인스턴스를 등록하는 방법
-
12-12-2019 - |
문제
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'
));
일반 공장 대신 구성을 위해 추상적 인 로거 팩토리를 사용할 수 있습니다
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');
...
}
. 제휴하지 않습니다 StackOverflow