Ladenka v autodetekci a zasilani emailu

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

Ahoj posila vam ladenka emaily kdyz ji inicializujete takto?

<?php
	Debug::enable(NULL, NULL, "example@example.com");
?>

tj. necha se aby si brala info kam logovat z Environmentu… me neposila (ani nevytvari .monitor) ackoli logy se ukladaji normalne

pokud pouziju

<?php
	Debug::enable(NULL, "/var/www/..../fw_app/log/php_error.log", "example@example.com");
?>

tak funguje logovani i odesilani emailu

btw: ze zdrojaku jsem tak nejak pochopil ze pro logovani staci udelat v aplikacnim adresari jen adresar log a tomu povolit zapis… Environment logDir se tak defaultne nastavuje ze?

pmg
Člen | 372
+
0
-

Koukněme na řádek 354 v Laděnce:

self::$sendEmails = $logFile && $email;

Pokud jako druhý parametr Debug::enable místo NULL zadáme TRUE, proběhne autodetekce logovacího souboru stejně. Uvedený výraz ale vrátí TRUE, takže se email bude posílat.

Debug::enable(NULL, TRUE, "example@example.com");

Navrhuji úpravu řádku 354:

self::$sendEmails = $logFile !== FALSE && $email;

Pozastavím se ještě nad následujícím kódem.

if (mt_rand() / mt_getrandmax() < self::$emailProbability) {
	$monitorFile = self::$logFile . '.monitor';
	$saved = @file_get_contents($monitorFile); // intentionally @
	$actual = (int) @filemtime(self::$logFile); // intentionally @
	if ($saved === FALSE || $actual === 0) {
		file_put_contents($monitorFile, $actual);

	} elseif (is_numeric($saved) && $saved != $actual) { // intentionally ==
		self::sendEmail('Fatal error probably occured');
	}
}

Probíhá první test, soubor monitor neexistuje. Soubor se vytvoří a zapíše se do něj nula, datum modifikace se změní na aktuální čas. Při druhém testu se tak splní druhá podmínka a odešle se informace o možné chybě.

crempa
Člen | 198
+
0
-

Mas pravdu,

kdyz jsem si to procital poprve, tak me uslo ze se tam jeste stale bere $logFile z parametru a podminka tak neni vyhodnocena kladne, diky.

Kdyz jsem uz nacal tu diskusi o ladence, tak co takhle rozsirit moznost odesilat email pouze jednou na identicke chyby, ale neblokovat prvni chybou vsechny dalsi ? Jen tak z patra me napada ukladat treba hashe vypisu (Stack trace) a ty pak porovnavat…

kravčo
Člen | 721
+
0
-

pmg napsal(a):

Probíhá první test, soubor monitor neexistuje. Soubor se vytvoří a zapíše se do něj nula, datum modifikace se změní na aktuální čas. Při druhém testu se tak splní druhá podmínka a odešle se informace o možné chybě.

Prvý prechod je v poriadku, zmení sa dátum modifikácie súboru $monitorFile. V druhom sa porovná obsah súboru $monitorFile s časom poslednej zmeny súboru $logFile, v prípade, že sa zmenil, pošle sa mail o tom, že zrejme nastala nezachytiteľná chyba. Toto nastane len v prípade, že mail nebol zatiaľ odoslaný a log súbor sa zmenil → nastalo niečo, čo Debug nedokázal zachytiť.

crempa napsal(a):

Kdyz jsem uz nacal tu diskusi o ladence, tak co takhle rozsirit moznost odesilat email pouze jednou na identicke chyby, ale neblokovat prvni chybou vsechny dalsi ? Jen tak z patra me napada ukladat treba hashe vypisu (Stack trace) a ty pak porovnavat…

Keď dostaneš mail o chybe, nejde o obsah mailu, ako skôr o to, že niečo nie je v poriadku – treba skontrolovať logy a zistiť čo. Ukladanie všemožných chýb by bol (podľa mňa) naozaj zbytočný overhead. Myslím, že odosielanie mailov je práve na to, aby upozornilo a ostatné info potrebné na opravu už nájdeš na serveri…

Editoval kravco (28. 2. 2009 19:31)

pmg
Člen | 372
+
0
-

Jasně, myslel jsem, že se bere čas souboru .monitor. Dík za nakopnutí.

$actual = (int) @filemtime(self::$logFile);