forked from Github/frigate
Improve efficiency of log and metrics pages (#11622)
* Rework stats pages * Handle limited data case * Handle page and arrow keys * Adjust sizing
This commit is contained in:
133
web/src/utils/logUtil.ts
Normal file
133
web/src/utils/logUtil.ts
Normal file
@@ -0,0 +1,133 @@
|
||||
import { LogLine, LogSeverity, LogType } from "@/types/log";
|
||||
|
||||
const frigateDateStamp = /\[[\d\s-:]*]/;
|
||||
const frigateSeverity = /(DEBUG)|(INFO)|(WARNING)|(ERROR)/;
|
||||
const frigateSection = /[\w.]*/;
|
||||
|
||||
const goSeverity = /(DEB )|(INF )|(WRN )|(ERR )/;
|
||||
const goSection = /\[[\w]*]/;
|
||||
|
||||
const ngSeverity = /(GET)|(POST)|(PUT)|(PATCH)|(DELETE)/;
|
||||
|
||||
export function parseLogLines(logService: LogType, logs: string[]) {
|
||||
if (logService == "frigate") {
|
||||
return logs
|
||||
.map((line) => {
|
||||
const match = frigateDateStamp.exec(line);
|
||||
|
||||
if (!match) {
|
||||
const infoIndex = line.indexOf("[INFO]");
|
||||
|
||||
if (infoIndex != -1) {
|
||||
return {
|
||||
dateStamp: line.substring(0, 19),
|
||||
severity: "info",
|
||||
section: "startup",
|
||||
content: line.substring(infoIndex + 6).trim(),
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
dateStamp: line.substring(0, 19),
|
||||
severity: "unknown",
|
||||
section: "unknown",
|
||||
content: line.substring(30).trim(),
|
||||
};
|
||||
}
|
||||
|
||||
const sectionMatch = frigateSection.exec(
|
||||
line.substring(match.index + match[0].length).trim(),
|
||||
);
|
||||
|
||||
if (!sectionMatch) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return {
|
||||
dateStamp: match.toString().slice(1, -1),
|
||||
severity: frigateSeverity
|
||||
.exec(line)
|
||||
?.at(0)
|
||||
?.toString()
|
||||
?.toLowerCase() as LogSeverity,
|
||||
section: sectionMatch.toString(),
|
||||
content: line
|
||||
.substring(line.indexOf(":", match.index + match[0].length) + 2)
|
||||
.trim(),
|
||||
};
|
||||
})
|
||||
.filter((value) => value != null) as LogLine[];
|
||||
} else if (logService == "go2rtc") {
|
||||
return logs
|
||||
.map((line) => {
|
||||
if (line.length == 0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const severity = goSeverity.exec(line);
|
||||
|
||||
let section =
|
||||
goSection.exec(line)?.toString()?.slice(1, -1) ?? "startup";
|
||||
|
||||
if (frigateSeverity.exec(section)) {
|
||||
section = "startup";
|
||||
}
|
||||
|
||||
let contentStart;
|
||||
|
||||
if (section == "startup") {
|
||||
if (severity) {
|
||||
contentStart = severity.index + severity[0].length;
|
||||
} else {
|
||||
contentStart = line.lastIndexOf("]") + 1;
|
||||
}
|
||||
} else {
|
||||
contentStart = line.indexOf(section) + section.length + 2;
|
||||
}
|
||||
|
||||
let severityCat: LogSeverity;
|
||||
switch (severity?.at(0)?.toString().trim()) {
|
||||
case "INF":
|
||||
severityCat = "info";
|
||||
break;
|
||||
case "WRN":
|
||||
severityCat = "warning";
|
||||
break;
|
||||
case "ERR":
|
||||
severityCat = "error";
|
||||
break;
|
||||
case "DBG":
|
||||
case "TRC":
|
||||
severityCat = "debug";
|
||||
break;
|
||||
default:
|
||||
severityCat = "info";
|
||||
}
|
||||
|
||||
return {
|
||||
dateStamp: line.substring(0, 19),
|
||||
severity: severityCat,
|
||||
section: section,
|
||||
content: line.substring(contentStart).trim(),
|
||||
};
|
||||
})
|
||||
.filter((value) => value != null) as LogLine[];
|
||||
} else if (logService == "nginx") {
|
||||
return logs
|
||||
.map((line) => {
|
||||
if (line.length == 0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return {
|
||||
dateStamp: line.substring(0, 19),
|
||||
severity: "info",
|
||||
section: ngSeverity.exec(line)?.at(0)?.toString() ?? "META",
|
||||
content: line.substring(line.indexOf(" ", 20)).trim(),
|
||||
};
|
||||
})
|
||||
.filter((value) => value != null) as LogLine[];
|
||||
}
|
||||
|
||||
return [];
|
||||
}
|
||||
Reference in New Issue
Block a user