logger
- xTrip
- Člen | 15
Tož, tak sem se před chvilkou ztrapnil skrze
{!=Framework:promo()}
tak su zvědavý, jestli jsem něco
nepřehlédl i v následujícím postřehu. Geniální řešení konfigurace
v Nette mi způsobuje malý problémeček. Ale není to problém Nette, ale
spíš Zendu. Nette obsahuje třídu Logger:
/**
* Message logger.
*
* @author David Grudl
* @copyright Copyright (c) 2004, 2009 David Grudl
* @package Nette
*/
class Logger extends Object
{
public function __construct()
{
throw new /*\*/NotImplementedException;
}
}
Což je nepoužitelné :-)
Maličký problém je ten, že už si nemůžete vytvořit vlastní třídu s poetickým názvem Logger a musíte zvolit jiné, méně zábavné jméno. (To platí samozřejmě ve verzi bez jmených prostorů) Ale to by nevadilo. Pokračujeme dál, využíjeme to nejlepší co nabízí Nette a konkurenční kooperační ZF. Cílem je používat toto:
$logger = Environment::getService('Muj\Logger');
Nejprve ten logger:
require_once 'Zend/Log.php';
class MujLogger extends Zend_Log {
$config = Environment::getConfig('logger');
$formatter = new Zend_Log_Formatter_Simple($config->format . PHP_EOL);
$writer = new Zend_Log_Writer_Stream($config->output);
$writer->setFormatter($formatter);
parent::__construct($writter);
}
Což nevypadá věru zle. Zbývá napsat do config.ini něco takovéhoto:
[common]
service.Muj-Logger = MujLogger
logger.output = %appDir%/log/mujLogger.log
format = <div class="%priorityName%">%message%</div>
[console < common]
logger.output = php://output
format = %priorityName%: %message%
A tady vzniká ten problém. Programátoři Zend Frameworku úplně kašlou
na nějakou kompatibilitu s Nette a používají znak %
pro
formatovácí řetězec v Zend_Log_Formatter. Nenapadlo mně nic lepšího,
než si konfiguraci pro logger napsat do zvláštného souboru a ten si načíst
jen pro tyto případy:
EDIT: Elegantní řešení problému viz. další příspěvek.
$conf = Config::fromFile(APP_DIR . '/logger.ini', Environment::getName());
což není v principu zlé. Jen už ta konfigurace není pohromadě v jediném souboru. Možná by se to dalo řešit i nějak takto:
[common]
....
[commonLogger]
service.Muj-Logger = Log
logger.output = %appDir%/log/mujLogger.log
format = <div class="%priorityName%">%message%</div>
[console]
...
[consoleLogger < commonLogger]
logger.output = php://output
format = %priorityName%: %message%
$conf = Config::fromFile(APP_DIR . '/logger.ini', Environment::getName() . 'Logger');
Což sice také ubírá na půvabu, ale zůstává nám jedinný konfigurační soubor.
Je možné nějak přinutit Configurator, aby ten řetězec nechal být a
nesnažil se nahradit tu část %...%
neexistujicí hodnotou ?
Tak to je na dobrou noc vše.
mějte se
Editoval xTrip (21. 5. 2009 1:03)
- David Grudl
- Nette Core | 8218
kravco napsal(a):
Pri načítaní a (auto)expandovaní sa zdvojené percento preloží na jednoduché.
To je perfektní, díky za tip!