logger

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
xTrip
Člen | 15
+
0
-

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)

kravčo
Člen | 721
+
0
-

Zdvojenie percenta u mňa zafungovalo.

[common]

logger.output = "php://output"
logger.format = "%%priority%%: %%message%%"

Pri načítaní a (auto)expandovaní sa zdvojené percento preloží na jednoduché.

xTrip
Člen | 15
+
0
-

Ďakujem velmi pekne. Jak snadné. Teď jsem spokojený :-)

David Grudl
Nette Core | 8218
+
0
-

kravco napsal(a):

Pri načítaní a (auto)expandovaní sa zdvojené percento preloží na jednoduché.

To je perfektní, díky za tip!