generated from ModusCreateOrg/template
-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathfind_log_errors.js
executable file
·86 lines (69 loc) · 3.08 KB
/
find_log_errors.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
import fs from 'fs';
import path from 'path';
// Default values
const defaultLogFile = 'find_log_errors.log';
const defaultLogDirectory = process.cwd();
// Function to log messages
const log = (message) => {
const timestamp = new Date().toISOString().replace(/T/, ' ').replace(/\..+/, '');
const logMessage = `[${timestamp}] ${message}`;
fs.appendFileSync(logOptions.logFile, `${logMessage}\n`);
console.log(logMessage);
};
// Function to print usage
const printUsage = () => {
console.log('Usage: node script.js [-d [log_directory]] [-l [log_file]]');
console.log('This script examines a directory containing all the log files after starting migrations with the GEI tool, and finds which ones failed with errors.');
console.log('It outputs a list of the source org, source repo, destination org, destination repo, and the error message.');
console.log('-d [log_directory] Directory containing log files (optional, default: current working directory)');
console.log('-l [log_file] Log file path (optional, default: find_log_errors.log)');
};
// Parse command-line arguments
const logOptions = {
logFile: defaultLogFile,
logDirectory: defaultLogDirectory,
};
const args = process.argv.slice(2);
for (let i = 0; i < args.length; i++) {
if (args[i] === '-d') {
logOptions.logDirectory = args[++i];
} else if (args[i] === '-l') {
logOptions.logFile = args[++i];
} else if (args[i] === '-h') {
printUsage();
process.exit(0);
} else {
console.error(`Invalid argument: ${args[i]}`);
printUsage();
process.exit(1);
}
}
// Check if the log directory exists
if (!fs.existsSync(logOptions.logDirectory)) {
log(`Error: Log directory '${logOptions.logDirectory}' does not exist.`);
process.exit(1);
}
// Check if log files exist in the specified directory
const logFiles = fs.readdirSync(logOptions.logDirectory).filter(file => file.endsWith('.octoshift.log'));
if (logFiles.length === 0) {
log(`Error: No log files found in the directory '${logOptions.logDirectory}'.`);
printUsage();
process.exit(1);
}
log(`Searching for errors in log files in '${logOptions.logDirectory}'...`);
// Print the header
log('source_org,source_repo,destination_org,destination_repo,error_message');
// Process each log file
logFiles.forEach(logFile => {
const logFilePath = path.join(logOptions.logDirectory, logFile);
const verboseLogFilePath = logFilePath.replace('.octoshift.log', '.octoshift.verbose.log');
const logFileContent = fs.readFileSync(logFilePath, 'utf8');
const verboseLogFileContent = fs.readFileSync(verboseLogFilePath, 'utf8');
const errorMatch = verboseLogFileContent.match(/\[ERROR\] (.*)/);
const error = errorMatch ? errorMatch[1] : '';
const sourceOrg = logFileContent.match(/GITHUB SOURCE ORG: ([^\s]*)/)?.[1] || '';
const sourceRepo = logFileContent.match(/SOURCE REPO: ([^\s]*)/)?.[1] || '';
const destinationOrg = logFileContent.match(/GITHUB TARGET ORG: ([^\s]*)/)?.[1] || '';
const destinationRepo = logFileContent.match(/TARGET REPO: ([^\s]*)/)?.[1] || '';
log(`${sourceOrg},${sourceRepo},${destinationOrg},${destinationRepo},"${error}"`);
});