개발일기장
아마도 Log parser - 1 본문
728x90
로그 째려보다가 눈깔 빠질거같은데 대부분의 로그가 flag에 대한 검사..
그 부분만 지우고 다른부분 정리만 하면 뭔가 편해지지 않을까
1. 로그 종류
일단 기본적으로 이게 있다고 치자(현실은 좀더 복잡하던데 여기 쓸수가 없네)
const save_tag = ['S', 'Z', 'I']; // -> 요거는 확인용
const del_tag = ['Q']; // -> 필요없는 로그
const check_tag = ['A', 'B', 'C']; // -> 저장해야함
A,B,C중에 내용에 특정 내용이 있으면 delFlag체크를 하고 삭제하자
2. 코드(refactoring 계속 해줘야지)
const fs = require('fs');
const readline = require('readline');
function logParser(line) {
const info = { timekey: null, type: null, delFlag: false };
//위에거랑 같은 경우
let num = line.indexOf(']') - 1;
if (num === -2) return null;
//find timekey
info.timekey = line.substr(1, num);
console.log('timekey ==> ' + info.timekey);
line = line.substr(num + 3);
//find type
num = line.indexOf(']') - 1;
info.type = line.substr(1, num);
console.log('type ==> ' + info.type);
line = line.substr(num + 3);
if (info.type === 'B') {
if (line.indexOf('ZQZQZ') >= 0) {
info.delFlag = true;
}
}
return info;
}
async function main(file_name) {
const save_tag = ['S', 'Z', 'I'];
const del_tag = ['Q'];
const check_tag = ['A', 'B', 'C'];
const fread_stream = fs.createReadStream(`./${file_name}.txt`);
const fwrite_Stream = fs.createWriteStream(`./${file_name}-after.txt`);
const rl = readline.createInterface({
input: fread_stream,
crlfDelay: Infinity,
});
let count = 0;
const map = new Map();
let before_info = { timekey: null, type: null, delFlag: null };
let store = '';
for await (const line of rl) {
const info = logParser(line);
console.log(`${count++} ==>`);
console.log(info, line, '\n');
//timekey -> map key
//type -> log type
//delFlag -> 기록하지말고 삭제해야하는 key
//시작부분 체크
if (info && before_info.timekey === null) {
before_info.timekey = info.timekey;
before_info.type = info.type;
before_info.delFlag = info.delFlag;
store = line;
continue;
}
if (info) {
const timekey = before_info.timekey;
const type = before_info.type;
const delFlag = before_info.delFlag;
// START 로그 && END 로그 && INFO 로그
if (save_tag.includes(type)) {
fwrite_Stream.write(`****** ${store} ******\n`);
map.delete(timekey);
}
// 필요없는 로그
if (del_tag.includes(type)) {
fwrite_Stream.write(`--del--${store}--del--\n`);
map.delete(timekey);
}
if (check_tag.includes(type)) {
let obj = map.get(timekey);
if (obj) {
obj.count++;
obj[type] = store;
if (delFlag) {
obj.delFlag = true;
}
if (obj.count === 3) {
if (obj.delFlag === false) {
fwrite_Stream.write(obj.A + '\n');
fwrite_Stream.write(obj.B + '\n');
fwrite_Stream.write(obj.C + '\n');
}
map.delete(timekey);
}
} else {
obj = {
count: 1,
A: null,
B: null,
C: null,
delFlag: false,
};
obj[type] = store;
if (delFlag) {
obj.delFlag = true;
}
map.set(timekey, obj);
}
}
store = line;
before_info = info;
} else {
//뭐 없으면 데이터 이어넣기
store = store + '\n' + line;
}
}
console.log(map);
//마지막 처리
if (map.size === 0) {
// 뭐 하나만 남은 경우임
fwrite_Stream.write(store);
}
let obj = map.get(before_info.timekey);
const timekey = before_info.timekey;
const type = before_info.type;
const delFlag = before_info.delFlag;
if (obj) {
obj.count++;
obj[type] = store;
if (delFlag) {
obj.delFlag = true;
}
if (obj.count === 3) {
if (obj.delFlag === false) {
fwrite_Stream.write(obj.A + '\n');
fwrite_Stream.write(obj.B + '\n');
fwrite_Stream.write(obj.C + '\n');
}
map.delete(timekey);
}
} else {
obj = {
count: 1,
A: null,
B: null,
C: null,
delFlag: false,
};
obj[type] = store;
if (delFlag) {
obj.delFlag = true;
}
map.set(timekey, obj);
}
fwrite_Stream.end();
}
try {
main('read');
} catch (err) {
console.error(err);
}
3. 예시
before
[111,,,1111] [A] fdfsfdfsdafsd
fdfsfdfsdafsd
sadfdfererer123
[0000000] [S] 1231234123133
fdfsfdfsdafsd
[111,,,1111] [B] asdfasdf
[111,,,1111] [C] dfdsagsdfasd
asdfasdf
asdfasdfasdf
asdgasdgasdg
asdgasdgasdg
[22222++22] [B] fsdafasdf
asdgasdgasdg
[22222++22] [A] asdgsadgasdgasdg
asdfasdfasdfas
[3333--333] [A] fasdgasdgasdf
asdfasdf
asdfasdfasdf
asdgasdgasdg
asdgasdgasdg
[22222++22] [C] asdgasdf
asdgasdgasdg
[3333--333] [C] asdgsadgasdgasdg
[3333--333] [B] 'ZQZQZ'dfasdf
asdfasdf
asdfasdfasdf
[1231231] [Q] adsfasdfas
[4444444] [I] asdgasdgasdg
asdgasdgasdg
[555:55:55] [A] qwefasdfasdfasdfasdf
asdgasdgasdg
[555:55:55] [B] qwefasdfasdfasdfasdf
[99999999] [I] asdgasdgasdg
asdgasdgasdg
[555:55:55] [C] qwefasdfasdfasdfasdf
[1124125146] [Z] qwegfqwdfasdfasdf
qweqwe
after
****** [0000000] [S] 1231234123133
fdfsfdfsdafsd ******
[111,,,1111] [A] fdfsfdfsdafsd
fdfsfdfsdafsd
sadfdfererer123
[111,,,1111] [B] asdfasdf
[111,,,1111] [C] dfdsagsdfasd
asdfasdf
asdfasdfasdf
asdgasdgasdg
asdgasdgasdg
[22222++22] [A] asdgsadgasdgasdg
asdfasdfasdfas
[22222++22] [B] fsdafasdf
asdgasdgasdg
[22222++22] [C] asdgasdf
asdgasdgasdg
--del--[1231231] [Q] adsfasdfas--del--
****** [4444444] [I] asdgasdgasdg
asdgasdgasdg ******
****** [99999999] [I] asdgasdgasdg
asdgasdgasdg ******
[555:55:55] [A] qwefasdfasdfasdfasdf
asdgasdgasdg
[555:55:55] [B] qwefasdfasdfasdfasdf
[555:55:55] [C] qwefasdfasdfasdfasdf
[1124125146] [Z] qwegfqwdfasdfasdf
qweqwe
3333-333은 delFlag에 잡혀서 사라짐
1231231는 type 이 Q라서 사라짐
그냥 TEXT읽는거라서 log가 몇십만줄인것도 있는게 그거는 어떻게 최적화할지 고민해 봐야겠다.
근대 사실상 저거대로 delFlag에 걸리는게 절반인거같음
씨팔!
728x90
'STUDY > 이것저것 만들어 보자' 카테고리의 다른 글
아마도 Log parser - 2 (정규식) (0) | 2022.12.08 |
---|---|
구간 다 구하기 (0) | 2021.08.03 |
Comments