mobile-react-infinite-calendar
Version:
A mobile-optimized infinite scroll calendar component for React
144 lines (143 loc) • 5.08 kB
JavaScript
/**
* 패키지용 간단한 로거 유틸리티
*/
export var LogLevel;
(function (LogLevel) {
LogLevel[LogLevel["ERROR"] = 0] = "ERROR";
LogLevel[LogLevel["WARN"] = 1] = "WARN";
LogLevel[LogLevel["INFO"] = 2] = "INFO";
LogLevel[LogLevel["DEBUG"] = 3] = "DEBUG";
})(LogLevel || (LogLevel = {}));
const logLevels = {
error: LogLevel.ERROR,
warn: LogLevel.WARN,
info: LogLevel.INFO,
debug: LogLevel.DEBUG
};
// 글로벌 디버그 설정 (기본값: 완전 비활성화)
let globalDebugOptions = {
enabled: false,
level: 'error', // 더 제한적인 기본 레벨
showPerformance: false
};
// 디버그 설정 초기화 (단순화)
export const initializeLogger = (debugOption) => {
if (typeof debugOption === 'boolean') {
globalDebugOptions = {
enabled: debugOption,
level: debugOption ? 'info' : 'error', // debug: true일 때 INFO 레벨까지만 (ERROR, WARN, INFO)
showPerformance: false // 성능 로그는 명시적으로 설정해야 함
};
}
else if (debugOption) {
globalDebugOptions = {
enabled: debugOption.enabled !== false,
level: debugOption.level || 'debug', // 기본레벨을 debug로 변경
showPerformance: debugOption.showPerformance !== false // 기본적으로 성능 로그 활성화
};
}
else {
// 기본값: 완전 비활성화
globalDebugOptions = {
enabled: false,
level: 'error', // 에러만 출력
showPerformance: false
};
}
// 디버그 설정 확인 로그 (항상 출력)
if (globalDebugOptions.enabled) {
console.log('%c[React Infinite Calendar] Debug 로깅 활성화', 'color: #22c55e; font-weight: bold', {
level: globalDebugOptions.level,
showPerformance: globalDebugOptions.showPerformance
});
}
};
// 로그 활성화 체크
const isLogEnabled = (level, context) => {
if (!globalDebugOptions.enabled)
return false;
// Performance 로거는 showPerformance 설정도 확인
if (context === 'Performance' && !globalDebugOptions.showPerformance)
return false;
const configuredLevel = logLevels[globalDebugOptions.level || 'warn'];
return level <= configuredLevel;
};
// 기본 로거 클래스
class Logger {
constructor(context = 'Calendar') {
this.context = context;
}
log(level, message, ...args) {
if (!isLogEnabled(level, this.context))
return;
const timestamp = new Date().toISOString();
const levelName = LogLevel[level];
const prefix = `[${timestamp}] [${levelName}] [${this.context}]`;
switch (level) {
case LogLevel.ERROR:
console.error(prefix, message, ...args);
break;
case LogLevel.WARN:
console.warn(prefix, message, ...args);
break;
case LogLevel.INFO:
console.info(prefix, message, ...args);
break;
case LogLevel.DEBUG:
console.log(prefix, message, ...args);
break;
}
}
error(message, ...args) {
this.log(LogLevel.ERROR, message, ...args);
}
warn(message, ...args) {
this.log(LogLevel.WARN, message, ...args);
}
info(message, ...args) {
this.log(LogLevel.INFO, message, ...args);
}
debug(message, ...args) {
this.log(LogLevel.DEBUG, message, ...args);
}
}
// 전역 로거 인스턴스들
export const logger = new Logger('Calendar');
export const uiLogger = new Logger('CalendarUI');
export const performanceLogger = new Logger('Performance');
// 빈도 제한 로그 (throttled log)
const throttleMap = new Map();
export const throttledLog = (key, message, intervalMs = 1000, level = LogLevel.DEBUG) => {
const now = Date.now();
const lastLogged = throttleMap.get(key) || 0;
if (now - lastLogged >= intervalMs) {
switch (level) {
case LogLevel.ERROR:
logger.error(`[THROTTLED:${key}] ${message}`);
break;
case LogLevel.WARN:
logger.warn(`[THROTTLED:${key}] ${message}`);
break;
case LogLevel.INFO:
logger.info(`[THROTTLED:${key}] ${message}`);
break;
case LogLevel.DEBUG:
logger.debug(`[THROTTLED:${key}] ${message}`);
break;
}
throttleMap.set(key, now);
}
};
// 디버그 상태 확인 함수 (개발자용)
export const getDebugInfo = () => {
return {
enabled: globalDebugOptions.enabled,
level: globalDebugOptions.level,
showPerformance: globalDebugOptions.showPerformance,
currentLogLevel: logLevels[globalDebugOptions.level || 'warn']
};
};
// 전역에서 접근 가능하도록 window 객체에 추가 (브라우저 환경에서)
if (typeof window !== 'undefined') {
window.getCalendarDebugInfo = getDebugInfo;
}