-
Notifications
You must be signed in to change notification settings - Fork 21
/
LogHandler.php
109 lines (96 loc) · 3.19 KB
/
LogHandler.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
<?php
namespace Honeybadger;
use Honeybadger\Contracts\Reporter;
use Monolog\Formatter\FormatterInterface;
use Monolog\Formatter\LineFormatter;
use Monolog\Handler\AbstractProcessingHandler;
use Monolog\Logger;
class LogHandler extends AbstractProcessingHandler
{
/**
* @var \Honeybadger\Contracts\Reporter
*/
protected $honeybadger;
/**
* @param \Honeybadger\Contracts\Reporter $honeybadger
* @param $level
* @param bool $bubble
*/
public function __construct(Reporter $honeybadger, $level = Logger::ERROR, bool $bubble = true)
{
parent::__construct($level, $bubble);
$this->honeybadger = $honeybadger;
}
/**
* @param array|\Monolog\LogRecord $record
*/
protected function write($record): void
{
if (!$this->isHandling($record)) {
return;
}
$this->honeybadger->rawNotification(function ($config) use ($record) {
return [
'notifier' => array_merge($config['notifier'], ['name' => 'Honeybadger Log Handler']),
'error' => $this->getHoneybadgerErrorFromMonologRecord($record, $config),
'request' => [
'context' => $this->getHoneybadgerContextFromMonologRecord($record),
],
'server' => [
'environment_name' => $config['environment_name'],
'time' => $record['datetime']->format("Y-m-d\TH:i:sP"),
],
];
});
}
/**
* {@inheritdoc}
*/
public function getFormatter(): FormatterInterface
{
return new LineFormatter('[%datetime%] %channel%.%level_name%: %message%');
}
/**
* @param array|\Monolog\LogRecord $record
*/
protected function getHoneybadgerErrorFromMonologRecord($record, $config): array
{
$error = [
'tags' => [
'log',
sprintf('%s.%s', $record['channel'], $record['level_name']),
],
'fingerprint' => md5($record['level_name'].$record['message']),
];
$e = $record['context']['exception'] ?? null;
if ($e instanceof \Throwable) {
$error['class'] = get_class($e);
$error['message'] = $e->getMessage();
$error['backtrace'] = (new BacktraceFactory($e, $config))->trace();
} else {
$error['class'] = "{$record['level_name']} Log";
$error['message'] = $record['message'];
}
return $error;
}
/**
* @param array|\Monolog\LogRecord $record
*/
protected function getHoneybadgerContextFromMonologRecord($record): array
{
$context = $record['context'];
$context['level_name'] = $record['level_name'];
$context['log_channel'] = $record['channel'];
$e = $context['exception'] ?? null;
if ($e && $e instanceof \Throwable) {
// Format Exception objects properly
$context['exception'] = [
'message' => $e->getMessage(),
'code' => $e->getCode(),
'file' => $e->getFile(),
'line' => $e->getLine(),
];
}
return $context;
}
}