winlogparse
Version:
A parser for parsing Windows Update log files
108 lines (92 loc) • 2.88 kB
JavaScript
async function parseLogFile(filePath) {
const { readLogFile } = await import('./fileOprt.js');
try {
const lines = readLogFile(filePath);
const parsedData = [];
const updateIdPattern = /\b[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}\.[0-9]+\b/;
for await (const line of lines) {
const parts = line.split(' ');
// helper function
const getMessage = (begindex, subStrArray) => {
for (let i = begindex; i < subStrArray.length; i++) {
const item = subStrArray[i].trim();
if (item) {
return subStrArray.slice(i).join(' ');
}
}
}
if (parts.length >= 3) {
const timestamp = `${parts[0]} ${parts[1]}`;
const processID = parts[2].trim();
let threadID, componentName, message;
if (!parts[3]) {
threadID = parts[4].trim();
} else {
threadID = parts[3].trim();
}
if (parts[3] && parts[4]) {
componentName = parts[4].trim();
message = getMessage(5, parts);
} else if (!parts[5]) {
componentName = parts[6].trim();
message = getMessage(7,parts);
} else {
componentName = parts[5].trim();
message = getMessage(6, parts);
}
const updateId = message.match(updateIdPattern)?.[0];
const status = extractStatus(message);
parsedData.push({
timestamp,
processID,
threadID,
componentName,
message,
updateId,
status,
});
}
}
return parsedData;
} catch (err) {
console.error(`Error reading log file: ${err}`);
return [];
}
}
function extractStatus(message) {
if (!message) {
return null;
}
message = message.toLowerCase();
const successKeywords = new Set(["succeeded", "successfully", "completed", "finished"]);
const failureKeywords = new Set(["failed", "error", "failure", "not found", "could not"]);
const inProgressKeywords = new Set(["downloading", "installing", "preparing", "starting", "registering"]);
const pendingKeywords = new Set(["queued", "pending"]);
const cleanupKeywords = new Set(["uninit", "deleting", "purge"]);
// helper function
const hasKeyword = (message, keywords) => {
for (const keyword of keywords) {
if (message.includes(keyword)) {
return true;
}
}
return false;
}
if (hasKeyword(message, successKeywords)) {
return "success";
}
if (hasKeyword(message, failureKeywords)) {
return "failure";
}
if (hasKeyword(message, inProgressKeywords)) {
return "in progress";
}
if (hasKeyword(message, pendingKeywords)) {
return "pending";
}
if (hasKeyword(message, cleanupKeywords)) {
return "cleanup";
}
return "unknown";
}
export default parseLogFile;