개발일기장

아마도 Log parser - 1 본문

STUDY/이것저것 만들어 보자

아마도 Log parser - 1

게슬 2022. 11. 16. 23:58
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