feat(phase-5-3): 모니터링 강화

logger.ts, metrics.ts, /api/metrics 추가
Version: e3bcb4ae
This commit is contained in:
kappa
2026-01-19 16:43:36 +09:00
parent a2194a5d45
commit c0e47482c4
12 changed files with 2491 additions and 5 deletions

View File

@@ -0,0 +1,114 @@
/**
* Logger 데모 스크립트
*
* 실제 출력을 보여주기 위한 데모 코드
*/
import { createLogger, createDebugLogger } from '../logger';
console.log('='.repeat(80));
console.log('Logger Demo - 구조화된 로깅 유틸리티');
console.log('='.repeat(80));
// 1. 기본 로깅
console.log('\n[1] 기본 로깅 (INFO 레벨)');
console.log('-'.repeat(80));
const logger = createLogger('demo');
logger.info('서비스 시작');
logger.info('설정 로드 완료', { configFile: 'app.config.json', version: '1.0.0' });
// 2. 다양한 로그 레벨
console.log('\n[2] 로그 레벨별 출력');
console.log('-'.repeat(80));
const levelLogger = createLogger('levels');
levelLogger.debug('디버그 메시지 (출력 안됨 - INFO 레벨 이상만)');
levelLogger.info('일반 정보 메시지');
levelLogger.warn('경고 메시지', { threshold: 100, current: 150 });
try {
throw new Error('테스트 에러');
} catch (error) {
levelLogger.error('에러 발생', error as Error, { context: 'test' });
}
// 3. 디버그 로거
console.log('\n[3] 디버그 로거 (DEBUG 레벨 포함)');
console.log('-'.repeat(80));
const debugLogger = createDebugLogger('debug');
debugLogger.debug('디버그 정보 출력됨', { data: [1, 2, 3] });
debugLogger.info('일반 정보');
// 4. 성능 측정
console.log('\n[4] 성능 측정 (타이머)');
console.log('-'.repeat(80));
const perfLogger = createLogger('performance');
const endTimer = perfLogger.startTimer('작업 완료', { operation: 'data-processing' });
// 시뮬레이션: 1초 대기
setTimeout(() => {
endTimer(); // duration이 자동으로 로그에 포함됨
}, 1000);
// 5. 사용자 컨텍스트
console.log('\n[5] 사용자 컨텍스트 (userId 자동 포함)');
console.log('-'.repeat(80));
const userLogger = createLogger('telegram').withUser('821596605');
userLogger.info('메시지 수신', { messageType: 'text', length: 42 });
userLogger.info('AI 응답 전송', { responseLength: 150 });
// 6. 서비스별 로거
console.log('\n[6] 서비스별 로거');
console.log('-'.repeat(80));
const openaiLogger = createLogger('openai');
openaiLogger.info('API 호출', { model: 'gpt-4o-mini', tokens: 1000 });
const depositLogger = createLogger('deposit');
depositLogger.info('입금 확인', { depositorName: '홍길동', amount: 50000 });
const domainLogger = createLogger('domain');
domainLogger.info('도메인 등록', { domain: 'example.com', price: 15000 });
// 7. 에러 체인
console.log('\n[7] 에러 스택 트레이스');
console.log('-'.repeat(80));
const errorLogger = createLogger('error-handler');
try {
try {
throw new Error('내부 에러: 데이터베이스 연결 실패');
} catch (innerError) {
throw new Error('외부 에러: 처리 중 예외 발생');
}
} catch (outerError) {
errorLogger.error('최종 에러', outerError as Error, {
service: 'database',
operation: 'connect',
});
}
console.log('\n' + '='.repeat(80));
console.log('Demo 완료');
console.log('='.repeat(80));
// 8. JSON 출력 시뮬레이션 (프로덕션 모드)
console.log('\n[8] 프로덕션 모드 (JSON 출력) 시뮬레이션');
console.log('-'.repeat(80));
console.log('// wrangler.toml: ENVIRONMENT = "production"');
console.log('// 실제 출력:');
console.log(
JSON.stringify(
{
timestamp: new Date().toISOString(),
level: 'INFO',
service: 'openai',
message: 'AI 응답 생성 시작',
userId: '821596605',
context: {
model: 'gpt-4o-mini',
messageLength: 42,
},
},
null,
2
)
);
console.log('\n' + '='.repeat(80));