Skip to content

Commit 039ebeb

Browse files
committed
✨ Feature: Add YAML-based configuration override for logger
- Enable overriding default logging settings via a `logger-config.yaml` file at the project root
1 parent ee0cf9f commit 039ebeb

4 files changed

Lines changed: 50 additions & 29 deletions

File tree

README.md

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -111,33 +111,30 @@ logs/
111111

112112
| Feature | Description |
113113
|--------------------------------------------|-------------------------------------------------------------------------|
114-
| **다중 전송 로깅 (Multi-Transport Logging)** | - 콘솔 출력과 파일 저장을 동시에 지원<br>- 일정 크기(예: 20MB) 또는 일정 주기(예: 15일)에 따라 자동으로 로그 파일 회전<br>- 로그 파일 예시: `combined-YYYY-MM-DD.log`, `error-YYYY-MM-DD.log`, `exceptions-YYYY-MM-DD.log`, `rejections-YYYY-MM-DD.log` 등의 이름으로 날짜가 붙은 형식으로 저장 |
114+
| **다중 전송 로깅 (Multi-Transport Logging)** | - 콘솔 출력과 파일 저장을 동시에 지원<br>- 일정 크기(예: 20MB) 또는 일정 주기(예: 15일)에 따라 자동으로 로그 파일 회전<br>- 로그 파일 예시: `combined-YYYY-MM-DD.log`, `error-YYYY-MM-DD.log`, `exceptions-YYYY-MM-DD.log`, `rejections-YYYY-MM-DD.log`|
115115
| **구조화된 로그 출력 (Structured Logging)** | - UUIDv5를 사용해 고유 LogID 생성<br>- `{timestamp, level, message}` 형식의 표준 JSON 포맷으로 출력되어 외부 시스템 연동 용이 |
116116
| **모듈별 컨텍스트 추적 (Contextual Tracing)** | - `BlancLoggerMiddleware`를 활용하여 HTTP 요청에서 모듈명 자동 추출<br>- `[UserService → AuthModule → Subsystem]`과 같이 계층 구조로 표시 |
117117
| **동적 로그 레벨 관리 (Dynamic Log Levels)** | - 개발 및 운영 환경에 따라 `debug, verbose, info, warn, error` 로그 레벨을 실시간으로 조절 가능<br>- 필요한 정보만 선별 기록하여 로그의 가독성과 관리 효율성을 향상 |
118118
| **SQL 구문 하이라이팅 (SQL Syntax Highlighting)** | - SQL 쿼리의 키워드, 값, 테이블명을 색상 강조 및 들여쓰기로 구분<br>- 파라미터 값 컨텍스트 인식 강조 |
119119
| **쿼리 성능 분석 (Query Analysis)** | - SQL 성능 저하 유발 패턴 자동 감지 (`SELECT *`, `JOIN 조건 누락` 등) |
120120
| **에러 진단 및 스택 추적 (Error Diagnostics)** | - 에러 발생 시 다중 스택 레이어와 추가 메타데이터를 포함하여 상세한 에러 로그 기록 |
121121
| **성능 모니터링 (Performance Monitoring)** | - HTTP 요청 처리 시간 및 `Slow Query`(예: 100ms) 경고 로그 생성<br>- 실행 계획(Explain Plan) 리포트 시각화 |
122-
| **커스터마이징 (Customization)** | - `logger.config.ts`파일을 통해 로그 저장 경로, 로그 레벨, 파일 크기, 회전 주기 등을 쉽게 조정 가능 |
122+
| **커스터마이징 (Customization)** | - `logger-config.yaml`파일을 통해 로그 저장 경로, 로그 레벨, 파일 크기, 회전 주기 등을 쉽게 조정 가능 |
123123

124124
---
125125

126126
## Configuration
127127

128128
> Blanc Logger는 기본 설정을 제공하지만, 필요에 따라 **사용자 환경**에 맞게 커스터마이징 할 수 있습니다.
129-
> 설정을 변경하려면 프로젝트에 `logger.config.ts` 파일을 생성하고 아래와 같이 `Override`할 수 있습니다.
129+
> 설정을 변경하려면 `프로젝트 루트``logger-config.yaml` 파일을 생성하고 아래와 같이 `Override`할 수 있습니다.
130+
131+
```yaml
132+
LOG_DIR: logs # 로그 파일 저장 경로 (기본: 프로젝트 루트/logs)
133+
CONSOLE_LOG_LEVEL: info # 콘솔 출력 로그 레벨 (debug, info, warn, error)
134+
FILE_LOG_LEVEL: error # 파일 출력 로그 레벨
135+
ROTATION_DAYS: 30d # 로그 파일 보관 기간 (예: 30일)
136+
MAX_FILE_SIZE: 20m # 단일 파일 최대 크기 (예: 20MB)
130137

131-
```typescript
132-
import { setLoggingConfig } from 'blanc-logger';
133-
134-
setLoggingConfig({
135-
LOG_DIR: 'logs', // 로그 파일 저장 경로 (기본: 프로젝트 루트/logs)
136-
CONSOLE_LOG_LEVEL: 'info', // 콘솔 출력 로그 레벨 (debug, info, warn, error)
137-
FILE_LOG_LEVEL: 'error', // 파일 출력 로그 레벨
138-
ROTATION_DAYS: '30d', // 로그 파일 보관 기간 (예: 30일)
139-
MAX_FILE_SIZE: '20m' // 단일 파일 최대 크기 (예: 20MB)
140-
});
141138
```
142139
---
143140

package-lock.json

Lines changed: 12 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
{
22
"name": "blanc-logger",
3-
"version": "1.0.8",
3+
"version": "1.0.9",
44
"description": "Advanced Winston logger for NestJS & TypeORM with structured logging (npm package).",
55
"main": "dist/index.js",
66
"types": "dist/index.d.ts",
7-
"files": ["dist"],
7+
"files": [
8+
"dist"
9+
],
810
"exports": {
911
".": {
1012
"import": "./dist/index.js",
@@ -34,6 +36,7 @@
3436
"dependencies": {
3537
"@nestjs/common": "^9.0.0",
3638
"chalk": "^4.1.0",
39+
"js-yaml": "^4.1.0",
3740
"nest-winston": "^1.0.0",
3841
"typeorm": "^0.3.20",
3942
"uuid": "^9.0.0",
@@ -42,6 +45,7 @@
4245
},
4346
"devDependencies": {
4447
"@types/express": "^5.0.0",
48+
"@types/js-yaml": "^4.0.9",
4549
"@types/uuid": "^10.0.0",
4650
"eslint": "^8.0.0",
4751
"express": "^4.21.2",

src/logger/logger.config.ts

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
import * as fs from 'fs';
2+
import * as yaml from 'js-yaml';
3+
import * as path from 'path';
4+
15
export interface LoggingConfig {
26
LOG_DIR: string; // 로그 파일 저장 디렉토리
37
CONSOLE_LOG_LEVEL: string; // 콘솔 로그 레벨
@@ -6,17 +10,26 @@ export interface LoggingConfig {
610
MAX_FILE_SIZE: string; // 단일 파일 최대 크기
711
}
812

9-
const defaultLoggingConfig: LoggingConfig = {
10-
LOG_DIR: 'logs', // 기본 로그 파일 저장 디렉토리
11-
CONSOLE_LOG_LEVEL: 'info', // 기본 콘솔 로그 레벨
12-
FILE_LOG_LEVEL: 'error', // 기본 파일 로그 레벨
13-
ROTATION_DAYS: '30d', // 기본 로그 파일 보관 기간
14-
MAX_FILE_SIZE: '20m', // 기본 단일 파일 최대 크기
13+
const DEFAULT_LOGGING_CONFIG: LoggingConfig = {
14+
LOG_DIR: 'logs',
15+
CONSOLE_LOG_LEVEL: 'info',
16+
FILE_LOG_LEVEL: 'error',
17+
ROTATION_DAYS: '30d',
18+
MAX_FILE_SIZE: '20m',
1519
};
1620

17-
export let LOGGING_CONFIG: LoggingConfig = { ...defaultLoggingConfig };
21+
function loadUserConfig(configFileName: string = 'logger-config.yaml'): Partial<LoggingConfig> {
22+
const configPath = path.resolve(process.cwd(), configFileName);
23+
if (!fs.existsSync(configPath)) return {};
24+
const fileContents = fs.readFileSync(configPath, 'utf8');
25+
return yaml.load(fileContents) as Partial<LoggingConfig>;
26+
}
27+
28+
export let LOGGING_CONFIG: LoggingConfig = {
29+
...DEFAULT_LOGGING_CONFIG,
30+
...loadUserConfig(),
31+
};
1832

19-
// 유저가 원하는 값으로 오버라이드
2033
export function setLoggingConfig(userConfig: Partial<LoggingConfig>): void {
21-
LOGGING_CONFIG = { ...defaultLoggingConfig, ...userConfig };
34+
LOGGING_CONFIG = { ...DEFAULT_LOGGING_CONFIG, ...userConfig };
2235
}

0 commit comments

Comments
 (0)