File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
const { LOG_BASE_DIR, SERVICE_STATUS } = require('../../../Global');
const fs = require('fs');
const Queue = require('../util/Queue');
/**
* @author : 하석형
* @since : 2023.08.24
* @dscription : Log 생성기 모듈 입니다.
*/
const Logger = (function () {
/* let testInterval = setInterval(() => {
const date = new Date();
var now = `${date.getFullYear()}.${(date.getMonth()+1)}.${date.getDate()} ${date.getHours()}:${date.getMinutes()}:${date.getSeconds()}.${date.getMilliseconds()}`;
console.log('now :', now);
}, 1000) */
//로그 쓰기 전, 대기 저장소
const eventQueue = new Queue();
//로그 쓰는 중인지 아닌지 상태값
let isLogging = false;
/**
* @author : 하석형
* @since : 2023.08.24
* @dscription : Log 처리
*/
const logging = (message) => {
const date = new Date();
let year = date.getFullYear();
let month = prefixZero((date.getMonth() + 1), 2);
let day = prefixZero(date.getDate(), 2);
let hour = prefixZero(date.getHours(), 2);
let minute = prefixZero(date.getMinutes(), 2);
let second = prefixZero(date.getSeconds(), 2);
let millisecond = prefixZero(date.getMilliseconds(), 3);
//로그에 쓰일 정보
const logMessage = {
message: message,
datetime: `${year}.${month}.${day} ${hour}:${minute}:${second}.${millisecond}`,
logFolderDir: `${LOG_BASE_DIR}/${year}${month}`,//log 폴더 경로
logFileName: `log-${year}${month}${day}.log`//log 파일명
}
//로그 쓰는 중이면, 대기 저장소에 등록
if (isLogging == true) {
eventQueue.push(logMessage);
} else {//로그 쓰는 중이 아니면, 로그 쓰는 중인 상태로 변경 후, 로그 쓰기
isLogging = true;
try {
//log 폴더 생성
if (!fs.existsSync(logMessage.logFolderDir)) {
fs.mkdirSync(logMessage.logFolderDir, { recursive: true/*재귀적 폴더 생성*/ });
}
//log 파일 Full Path
let logFileFullPath = `${logMessage.logFolderDir}/${logMessage.logFileName}`;
//log 내용
let logContent = `[${logMessage.datetime}] ${logMessage.message}`;
//log 내용 쓰기
writeLogFile(logFileFullPath, logContent);
} catch (error) {
console.log('logging error : ', error);
} finally {
isLogging = false;
}
}
}
/**
* @author : 하석형
* @since : 2023.08.24
* @dscription : Log 내용 쓰기
*/
const writeLogFile = (path, content) => {
if (SERVICE_STATUS == 'development') {
console.log(content);
}
//파일 쓰기
fs.appendFileSync(path, `${content}\n`, 'utf8');
//로그 쓰기 저장소에서 로그 메세지 꺼내기
let logMessage = eventQueue.pop();
//메세지가 존재하면 => Log 내용 쓰기 (재귀 호출)
if (logMessage != undefined) {
//log 파일 Full Path
let logFileFullPath = `${logMessage.logFolderDir}/${logMessage.logFileName}`;
//log 내용
let logContent = `[${logMessage.datetime}] ${logMessage.message}`;
//Log 내용 쓰기 (재귀 호출)
writeLogFile(logFileFullPath, logContent);
} else {
return;
}
}
/**
* @author : 하석형
* @since : 2023.08.24
* @dscription : 특정 길이만큼 앞에 '0' 붙이기
*/
const prefixZero = (target, length) => {
let zero = '';
let suffix = target;
let result = '';
if ((typeof target) === "number") {
suffix = target.toString();
}
if (suffix.length < length) {
for (i = 0; i < length - suffix.length; i++) {
zero += '0';
}
}
result = zero + suffix;
return result;
}
return {
logging: logging
}
})();
//Module Export
module.exports = Logger;