|
3 | 3 | const isObject = require('type/object/is');
|
4 | 4 | const createErrorCapturedEvent = require('./create-error-captured-event');
|
5 | 5 | const createWarningCapturedEvent = require('./create-warning-captured-event');
|
| 6 | +const reportError = require('./report-error'); |
| 7 | + |
| 8 | +const safeJsonParse = (logLine) => { |
| 9 | + try { |
| 10 | + return JSON.parse(logLine); |
| 11 | + } catch { |
| 12 | + return null; |
| 13 | + } |
| 14 | +}; |
| 15 | + |
| 16 | +const supportedLevels = new Set(['WARN', 'ERROR']); |
6 | 17 |
|
7 | 18 | const parseLogLevel = (level) => {
|
8 | 19 | if (typeof level === 'string') {
|
9 | 20 | const levelUpperCase = level.toUpperCase();
|
10 |
| - if (levelUpperCase !== 'ERROR' && levelUpperCase !== 'WARN') { |
11 |
| - throw new Error('Unsupported level'); |
12 |
| - } |
13 |
| - return levelUpperCase; |
| 21 | + if (supportedLevels.has(levelUpperCase)) return levelUpperCase; |
14 | 22 | } else if (typeof level === 'number') {
|
15 |
| - if (level <= 30) { |
16 |
| - throw new Error('Unsupported level'); |
17 |
| - } |
18 |
| - |
19 |
| - if (level <= 40) { |
20 |
| - return 'WARN'; |
21 |
| - } |
22 |
| - return 'ERROR'; |
| 23 | + if (level <= 30) return null; |
| 24 | + if (level <= 40) return 'WARN'; |
| 25 | + if (level > 40) return 'ERROR'; |
23 | 26 | }
|
24 |
| - throw new Error('Unsupported level'); |
| 27 | + return null; |
25 | 28 | };
|
26 | 29 |
|
27 | 30 | const highCardinalityAttributes = [
|
@@ -119,16 +122,21 @@ module.exports.attemptParseStructuredLogAndCapture = (logLine) => {
|
119 | 122 | try {
|
120 | 123 | if (typeof logLine !== 'string') return;
|
121 | 124 | if (logLine[0] !== '{') return;
|
122 |
| - const logLineParsed = JSON.parse(logLine); |
123 |
| - if ('level' in logLineParsed) { |
124 |
| - const logLevel = parseLogLevel(logLineParsed.level); |
125 |
| - if (logLevel === 'ERROR') { |
| 125 | + const logLineParsed = safeJsonParse(logLine); |
| 126 | + if (!logLineParsed) return; |
| 127 | + if (!logLineParsed.level) return; |
| 128 | + const logLevel = parseLogLevel(logLineParsed.level); |
| 129 | + switch (logLevel) { |
| 130 | + case 'ERROR': |
126 | 131 | handleErrorLog(logLineParsed);
|
127 |
| - } else if (logLevel === 'WARN') { |
| 132 | + return; |
| 133 | + case 'WARN': |
128 | 134 | handleWarningLog(logLineParsed);
|
129 |
| - } |
| 135 | + return; |
| 136 | + default: |
| 137 | + throw new Error(`Unsupported log level: ${logLevel}`); |
130 | 138 | }
|
131 |
| - } catch (err) { |
132 |
| - // Not a structured logline |
| 139 | + } catch (error) { |
| 140 | + reportError(error); |
133 | 141 | }
|
134 | 142 | };
|
0 commit comments