feat(phase-5-3): 모니터링 강화
logger.ts, metrics.ts, /api/metrics 추가 Version: e3bcb4ae
This commit is contained in:
114
src/utils/__demo__/logger-demo.ts
Normal file
114
src/utils/__demo__/logger-demo.ts
Normal 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));
|
||||
Reference in New Issue
Block a user