Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions apps/pre-processing-service/app/core/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,10 +76,15 @@ class BaseSettingsConfig(BaseSettings):
db_pass: str
db_name: str
env_name: str
app_name: str

# MeCab 사전 경로 (자동 감지)
mecab_path: Optional[str] = None

# Loki 설정
loki_host: str = "localhost"
loki_port: int = 3100

# 테스트/추가용 필드
openai_api_key: Optional[str] = None # << 이 부분 추가

Expand Down
95 changes: 95 additions & 0 deletions apps/pre-processing-service/app/core/logging_config.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
import os
from loguru import logger
import sys
from contextvars import ContextVar

# trace_id context 변수 import
try:
from app.middleware.ServiceLoggerMiddleware import trace_id_context
except ImportError:
# 모듈이 아직 로드되지 않은 경우를 위한 기본값
trace_id_context: ContextVar[str] = ContextVar("trace_id", default="")


def setup_file_logging():
"""
PromTail을 통해 Loki로 전송하기 위한 파일 로깅 설정
"""
# 기존 loguru 핸들러 제거 (기본 콘솔 출력 제거)
logger.remove()

# 환경변수로 로그 디렉토리 설정 (기본값: logs/develop)
log_dir = "../../docker/local/logs/develop"

# 로그 디렉토리가 없으면 생성

# 로그 파일 경로 설정
log_file_path = log_dir + "/pre-processing-app.log"
error_log_file_path = log_dir + "/pre-processing-app-error.log"

# trace_id를 포함한 간단한 포맷 문자열 사용
def add_trace_id_filter(record):
try:
current_trace_id = trace_id_context.get()
if current_trace_id:
record["extra"]["trace_id"] = current_trace_id
else:
record["extra"]["trace_id"] = ""
except LookupError:
record["extra"]["trace_id"] = ""
return record

# 파일 로깅에서 LoggingMiddleware 제외하는 필터
def exclude_logging_middleware_filter(record):
# LoggingMiddleware의 로그는 파일에 기록하지 않음
if record["name"] == "app.middleware.logging":
return False
return add_trace_id_filter(record)

# 파일 로깅 핸들러 추가 - trace_id 포함, LoggingMiddleware 제외
logger.add(
log_file_path,
format="[{extra[trace_id]}] {time:YYYY-MM-DD HH:mm:ss.SSS} | {level} | {name}:{function}:{line} | {message}",
level="DEBUG",
rotation="100 MB", # 100MB마다 로테이션
retention="7 days", # 7일간 보관
compression="zip", # 압축
enqueue=True, # 멀티프로세스 안전
serialize=False, # JSON 직렬화 비활성화 (PromTail에서 파싱)
backtrace=True, # 백트레이스 포함
diagnose=True, # 진단 정보 포함
filter=exclude_logging_middleware_filter,
)

# 에러 레벨 이상은 별도 파일에도 기록 - trace_id 포함, LoggingMiddleware 제외
logger.add(
error_log_file_path,
format="[{extra[trace_id]}] {time:YYYY-MM-DD HH:mm:ss.SSS} | {level} | {name}:{function}:{line} | {message}",
level="ERROR",
rotation="50 MB",
retention="30 days",
compression="zip",
enqueue=True,
serialize=False,
backtrace=True,
diagnose=True,
filter=exclude_logging_middleware_filter,
)

# 개발 환경에서는 콘솔 출력도 유지
if os.getenv("ENVIRONMENT", "development") == "development":
logger.add(
sys.stdout,
format="[{extra[trace_id]}] {time:YYYY-MM-DD HH:mm:ss} | {level: <8} | {name}:{function}:{line} | {message}",
level="DEBUG",
colorize=False, # colorize 비활성화하여 태그 충돌 방지
filter=add_trace_id_filter,
)

logger.info("File logging setup completed for PromTail integration")
return logger


def get_logger():
"""구성된 로거 인스턴스 반환"""
return logger
5 changes: 5 additions & 0 deletions apps/pre-processing-service/app/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,11 @@
from fastapi.exceptions import RequestValidationError
from app.middleware.ServiceLoggerMiddleware import ServiceLoggerMiddleware

# 파일 로깅 설정 초기화
from app.core.logging_config import setup_file_logging

setup_file_logging()

# --- 애플리케이션 구성 요소 임포트 ---
from app.api.router import api_router
from app.middleware.logging import LoggingMiddleware
Expand Down
Loading
Loading