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: callback($this->mailer)->invoke($message, $this->email);
67: }
68: return $res;
69: }
70:
71:
72:
73: 74: 75: 76: 77: 78:
79: public static function defaultMailer($message, $email)
80: {
81: $host = '';
82: foreach (array('HTTP_HOST','SERVER_NAME', 'HOSTNAME') as $item) {
83: if (isset($_SERVER[$item])) {
84: $host = $_SERVER[$item]; break;
85: }
86: }
87:
88: $parts = str_replace(
89: array("\r\n", "\n"),
90: array("\n", PHP_EOL),
91: array(
92: 'headers' => "From: noreply@$host\nX-Mailer: Nette Framework\n",
93: 'subject' => "PHP: An error occurred on the server $host",
94: 'body' => "[" . @date('Y-m-d H:i:s') . "] $message",
95: )
96: );
97:
98: mail($email, $parts['subject'], $parts['body'], $parts['headers']);
99: }
100:
101: }
102: