74 lines
2.1 KiB
JavaScript
74 lines
2.1 KiB
JavaScript
/**
|
||
* syslog-parser.js
|
||
* SYSLOG格式识别 + 关键字段提取
|
||
* 秋秋说:这个文件就像翻译官,把开发者发的日志翻译成电脑能懂的数据
|
||
*/
|
||
|
||
function parseSyslog(message) {
|
||
// 定义返回结构
|
||
const result = {
|
||
isSyslog: false,
|
||
bcNumber: null,
|
||
devId: null,
|
||
phaseNum: null,
|
||
status: null, // 'completed', 'partial', 'blocked'
|
||
summary: null,
|
||
rawMessage: message,
|
||
error: null
|
||
};
|
||
|
||
try {
|
||
// 检查是否包含SYSLOG关键词
|
||
if (!message.includes('SYSLOG')) {
|
||
result.error = '不是SYSLOG格式(缺少SYSLOG关键词)';
|
||
return result;
|
||
}
|
||
|
||
// 提取BC编号(格式:BC-xxx-xxx)
|
||
const bcMatch = message.match(/BC-([A-Z0-9]+)-([A-Z0-9]+)/i);
|
||
if (bcMatch) {
|
||
result.bcNumber = `BC-${bcMatch[1]}-${bcMatch[2]}`;
|
||
}
|
||
|
||
// 提取DEV编号(格式:DEV-xxx)
|
||
const devMatch = message.match(/DEV-([0-9]+)/i);
|
||
if (devMatch) {
|
||
result.devId = `DEV-${devMatch[1]}`;
|
||
}
|
||
|
||
// 提取环节号(格式:环节X 或 phase X)
|
||
const phaseMatch = message.match(/环节\s*([0-9]+)/) || message.match(/phase\s*([0-9]+)/i);
|
||
if (phaseMatch) {
|
||
result.phaseNum = parseInt(phaseMatch[1], 10);
|
||
}
|
||
|
||
// 提取完成状态
|
||
if (message.includes('completed')) {
|
||
result.status = 'completed';
|
||
} else if (message.includes('partial')) {
|
||
result.status = 'partial';
|
||
} else if (message.includes('blocked')) {
|
||
result.status = 'blocked';
|
||
}
|
||
|
||
// 提取技术摘要(如果有)
|
||
const summaryMatch = message.match(/摘要[::]\s*(.+)/) || message.match(/summary[::]\s*(.+)/i);
|
||
if (summaryMatch) {
|
||
result.summary = summaryMatch[1].trim();
|
||
}
|
||
|
||
// 判断是否为完整的SYSLOG(至少要有BC和DEV)
|
||
if (result.bcNumber && result.devId && result.status) {
|
||
result.isSyslog = true;
|
||
} else {
|
||
result.error = 'SYSLOG格式不完整(缺少BC/DEV/状态中的必要字段)';
|
||
}
|
||
|
||
} catch (error) {
|
||
result.error = `解析异常:${error.message}`;
|
||
}
|
||
|
||
return result;
|
||
}
|
||
|
||
module.exports = { parseSyslog }; |