|
22 | 22 | */
|
23 | 23 | class GelfMessageFormatter extends NormalizerFormatter
|
24 | 24 | {
|
| 25 | + const MAX_LENGTH = 32766; |
| 26 | + |
25 | 27 | /**
|
26 | 28 | * @var string the name of the system for the Gelf log message
|
27 | 29 | */
|
@@ -79,24 +81,48 @@ public function format(array $record)
|
79 | 81 | ->setHost($this->systemName)
|
80 | 82 | ->setLevel($this->logLevels[$record['level']]);
|
81 | 83 |
|
| 84 | + // start count with message length + system name length + 200 for padding / metadata |
| 85 | + $len = 200 + strlen((string) $record['message']) + strlen($this->systemName); |
| 86 | + |
| 87 | + if ($len > self::MAX_LENGTH) { |
| 88 | + $message->setShortMessage(substr($record['message'], 0, self::MAX_LENGTH - 200)); |
| 89 | + |
| 90 | + return $message; |
| 91 | + } |
| 92 | + |
82 | 93 | if (isset($record['channel'])) {
|
83 | 94 | $message->setFacility($record['channel']);
|
| 95 | + $len += strlen($record['channel']); |
84 | 96 | }
|
85 | 97 | if (isset($record['extra']['line'])) {
|
86 | 98 | $message->setLine($record['extra']['line']);
|
| 99 | + $len += 10; |
87 | 100 | unset($record['extra']['line']);
|
88 | 101 | }
|
89 | 102 | if (isset($record['extra']['file'])) {
|
90 | 103 | $message->setFile($record['extra']['file']);
|
| 104 | + $len += strlen($record['extra']['file']); |
91 | 105 | unset($record['extra']['file']);
|
92 | 106 | }
|
93 | 107 |
|
94 | 108 | foreach ($record['extra'] as $key => $val) {
|
95 |
| - $message->setAdditional($this->extraPrefix . $key, is_scalar($val) ? $val : $this->toJson($val)); |
| 109 | + $val = is_scalar($val) ? $val : $this->toJson($val); |
| 110 | + $len += strlen($this->extraPrefix . $key . $val); |
| 111 | + if ($len > self::MAX_LENGTH) { |
| 112 | + $message->setAdditional($this->extraPrefix . $key, substr($val, 0, self::MAX_LENGTH - $len)); |
| 113 | + break; |
| 114 | + } |
| 115 | + $message->setAdditional($this->extraPrefix . $key, $val); |
96 | 116 | }
|
97 | 117 |
|
98 | 118 | foreach ($record['context'] as $key => $val) {
|
99 |
| - $message->setAdditional($this->contextPrefix . $key, is_scalar($val) ? $val : $this->toJson($val)); |
| 119 | + $val = is_scalar($val) ? $val : $this->toJson($val); |
| 120 | + $len += strlen($this->contextPrefix . $key . $val); |
| 121 | + if ($len > self::MAX_LENGTH) { |
| 122 | + $message->setAdditional($this->contextPrefix . $key, substr($val, 0, self::MAX_LENGTH - $len)); |
| 123 | + break; |
| 124 | + } |
| 125 | + $message->setAdditional($this->contextPrefix . $key, $val); |
100 | 126 | }
|
101 | 127 |
|
102 | 128 | if (null === $message->getFile() && isset($record['context']['exception']['file'])) {
|
|
0 commit comments