ZENDEMENAGERにZEND \ Logインスタンスを登録する方法ZF2
-
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')
.
私はa:
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);
. 私のブートストラップにデフォルトのデータベースライターオブジェクトを作成し、それを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は、 "ServiceLocatorAwareInterface"のインスタンスです。だから私はただ私のコントローラーで呼び出すことができます
public function indexAction()
{
...
$this->getServiceLocator()->get('Zend\Log')->info('this is a test log message');
...
}
. 所属していません StackOverflow