개발일기장
아마도 Log parser - 2 (정규식) 본문
728x90
로그 읽기 쉽게 만들어주는 사내에서 개발한 사람들도 좀 있는거 같고..
그거 쓰면 될거같지만 그냥 정규식 공부+퇴근하고 개발이나 좀 끄적이자~ 라는 느낌으로 ㅎㅎ...
https://tlqckd0.tistory.com/59
근대 여기서 만든거에서 문제점
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