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: class Logger extends Nette\Object
23: {
24: const DEBUG = 'debug',
25: INFO = 'info',
26: WARNING = 'warning',
27: ERROR = 'error',
28: CRITICAL = 'critical';
29:
30:
31: public static $emailSnooze = 172800;
32:
33:
34: public $mailer = array(__CLASS__, 'defaultMailer');
35:
36:
37: public $directory;
38:
39:
40: public $email;
41:
42:
43: 44: 45: 46: 47: 48:
49: public function log($message, $priority = self::INFO)
50: {
51: if (!is_dir($this->directory)) {
52: throw new Nette\DirectoryNotFoundException("Directory '$this->directory' is not found or is not directory.");
53: }
54:
55: if (is_array($message)) {
56: $message = implode(' ', $message);
57: }
58: $res = error_log(trim($message) . PHP_EOL, 3, $this->directory . '/' . strtolower($priority) . '.log');
59:
60: if (($priority === self::ERROR || $priority === self::CRITICAL) && $this->email && $this->mailer
61: && @filemtime($this->directory . '/email-sent') + self::$emailSnooze < time()
62: && @file_put_contents($this->directory . '/email-sent', 'sent')
63: ) {
64: Nette\Callback::create($this->mailer)->invoke($message, $this->email);
65: }
66: return $res;
67: }
68:
69:
70: 71: 72: 73: 74: 75:
76: public static function defaultMailer($message, $email)
77: {
78: $host = php_uname('n');
79: foreach (array('HTTP_HOST','SERVER_NAME', 'HOSTNAME') as $item) {
80: if (isset($_SERVER[$item])) {
81: $host = $_SERVER[$item]; break;
82: }
83: }
84:
85: $parts = str_replace(
86: array("\r\n", "\n"),
87: array("\n", PHP_EOL),
88: array(
89: 'headers' => implode("\n", array(
90: "From: noreply@$host",
91: 'X-Mailer: Nette Framework',
92: 'Content-Type: text/plain; charset=UTF-8',
93: 'Content-Transfer-Encoding: 8bit',
94: )) . "\n",
95: 'subject' => "PHP: An error occurred on the server $host",
96: 'body' => "[" . @date('Y-m-d H:i:s') . "] $message",
97: )
98: );
99:
100: mail($email, $parts['subject'], $parts['body'], $parts['headers']);
101: }
102:
103: }
104: