개발일기장

아마도 Log parser - 2 (정규식) 본문

STUDY/이것저것 만들어 보자

아마도 Log parser - 2 (정규식)

게슬 2022. 12. 8. 23:39
728x90

로그 읽기 쉽게 만들어주는 사내에서 개발한 사람들도 좀 있는거 같고..

그거 쓰면 될거같지만 그냥 정규식 공부+퇴근하고 개발이나 좀 끄적이자~ 라는 느낌으로  ㅎㅎ...

 

https://tlqckd0.tistory.com/59

 

아마도 Log parser - 1

로그 째려보다가 눈깔 빠질거같은데 대부분의 로그가 flag에 대한 검사.. 그 부분만 지우고 다른부분 정리만 하면 뭔가 편해지지 않을까 1. 로그 종류 일단 기본적으로 이게 있다고 치자(현실은

tlqckd0.tistory.com

근대 여기서 만든거에서 문제점

 savetag를 3개를 모아서 한번에 저장한다는 느낌으로 생각했는데 timekey는 3개가 일치하지 않음..

사실 쿼리, 파라미터, 결과 이거를 정리하겠다는건데 

생각만 좀 해도 쿼리랑 파라미터 던지고 나서 결과 DB에서 가지고 오는거 시간차이가 있을탠대 그걸 고려하지 않았음

그리고 log서버에서 서버  log를 가지고 가서 append 할 떄 순서가 틀려지는 것도 있음..

그래서 그냥 Queue 3개를 모아서 3개 쌓이면 -> 모아서 저장 하는 느낌으로 변경해야 할 것 같다.

 

1. 정규식

[0000000] [S] [typeppp] 1231234123133

이런 로그 줄이 있을 때 대괄호 안에 3개를 뽑아서 timekey, log type, method로 분리를 해야함

저게 시작점이기 때문에 한줄로 끝날 수 있고 여러줄이 될 수 있음

 

//regx_parser.js//

const re = new RegExp('\\[(.*?)\\]', 'g');

module.exports = (str) => {
    const match_ary = str.match(re);

    if (match_ary === null || match_ary.length < 3) {
        return null;
    }

    const timekey = match_ary[0].substr(1, match_ary[0].length-2);
    const type = match_ary[1].substr(1, match_ary[1].length-2);
    const method = match_ary[2].substr(1, match_ary[2].length-2);
    return {
        timekey ,
        type,
        method,
    };
};

그래서 일단 이렇게 해서 null이 반환되는 경우와 3개가 없는 경우 반환하는걸로 하자

{ timekey: '1124125146', type: 'Z', method: 'typeppp' }
[1124125146] [Z] [typeppp] qwegfqwdfasdfasdf

저렇게 하면  이렇게 추출 할 수 있음.

 

2. Log가 여러줄인 경우

일단 저기서  null이 아니면 null이 아닌 다음꺼 까지 다 읽는 방식

 

// file_reader.js //

const fs = require('fs');
const readline = require('readline');
const regx_parser = require('./regx_parser');

module.exports = async ({file_name}) =>{   
    
    // 1. file read stream
    const fread_stream = fs.createReadStream(`./${file_name}.txt`);

    // 2. read line from stream
    const rl = readline.createInterface({
        input : fread_stream,
        crlfDelay : Infinity
    });

    let first_line = true;
    let line_list = [];
    const cur_log_info = {};

    // 3. 한줄 씩 읽으면서 파싱하자~
    for await (const line of rl){ 
        // 정규화 이용       
        const res = regx_parser(line);

        if(res !== null){
            if(first_line){
                first_line = false;
                line_list.push(line)
            }else{
                //새로운 log line -> 기존 log는 넘기고 -> lins_list 초기화
                console.log(line_list,'\n');//여기에 로직 추가해주자.
                line_list.length = 0;
                line_list.push(line)
            }
        }else{
            line_list.push(line);
        }
    }
    console.log(line_list);//여기에 로직 추가해주자.
    line_list.length = 0;
}
// main //

const reader = require('./file_reader');

async function main() {
    if (process.argv.length != 3) {
        console.log('input filename as argument');
        return;
    }
    const file_name = process.argv[2];
    await reader({file_name});
}

//START
(async () => {
    await main();
})();

 

일단 콘솔에만 찍었는데 생각대로 됐음

ㄹㅇ 잠오니깐 내일하자

728x90

'STUDY > 이것저것 만들어 보자' 카테고리의 다른 글

아마도 Log parser - 1  (0) 2022.11.16
구간 다 구하기  (0) 2021.08.03
Comments