1: <?php
2:
3: 4: 5: 6: 7: 8: 9: 10:
11:
12: namespace Nette\Diagnostics;
13:
14: use Nette;
15:
16:
17:
18: 19: 20: 21: 22:
23: class Logger extends Nette\Object
24: {
25: const DEBUG = 'debug',
26: INFO = 'info',
27: WARNING = 'warning',
28: ERROR = 'error',
29: CRITICAL = 'critical';
30:
31:
32: public static $emailSnooze = 172800;
33:
34:
35: public $mailer = array(__CLASS__, 'defaultMailer');
36:
37:
38: public $directory;
39:
40:
41: public $email;
42:
43:
44:
45: 46: 47: 48: 49: 50:
51: public function log($message, $priority = self::INFO)
52: {
53: if (!is_dir($this->directory)) {
54: throw new Nette\DirectoryNotFoundException("Directory '$this->directory' is not found or is not directory.");
55: }
56:
57: if (is_array($message)) {
58: $message = implode(' ', $message);
59: }
60: $res = error_log(trim($message) . PHP_EOL, 3, $this->directory . '/' . strtolower($priority) . '.log');
61:
62: if (($priority === self::ERROR || $priority === self::CRITICAL) && $this->email && $this->mailer
63: && @filemtime($this->directory . '/email-sent') + self::$emailSnooze < time()
64: && @file_put_contents($this->directory . '/email-sent', 'sent')
65: ) {
66: call_user_func($this->mailer, $message, $this->email);
67: }
68: return $res;
69: }
70:
71:
72:
73: 74: 75: 76: 77: 78:
79: private static function defaultMailer($message, $email)
80: {
81: $host = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] :
82: (isset($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : '');
83:
84: $parts = str_replace(
85: array("\r\n", "\n"),
86: array("\n", PHP_EOL),
87: array(
88: 'headers' => "From: noreply@$host\nX-Mailer: Nette Framework\n",
89: 'subject' => "PHP: An error occurred on the server $host",
90: 'body' => "[" . @date('Y-m-d H:i:s') . "] $message",
91: )
92: );
93:
94: mail($email, $parts['subject'], $parts['body'], $parts['headers']);
95: }
96:
97: }
98: