autotoc_md1633
doc_id: "LOG-FEAT-001" doc_title: "Logger System - 상세 기능" doc_version: "1.0.0" doc_date: "2026-04-04" doc_status: "Released" project: "logger_system"
category: "FEAT"
Logger System - 상세 기능
SSOT: This document is the single source of truth for Logger System - 상세 기능.
언어: English | 한국어
최종 업데이트: 2026-02-08 버전: 0.4.0
이 문서는 Logger System의 모든 기능에 대한 포괄적인 세부 정보를 제공합니다.
목차
- 핵심 기능
- 로그 레벨
- 로그 작성자
- 포맷팅
- 필터링
- 비동기 로깅
- 성능 특성
- 통합 기능
- OTLP 통합
- 로그 샘플링
- 실시간 로그 분석
핵심 기능
설계 원칙
Logger System은 다음 원칙을 따라 설계되었습니다:
- 고성능: 비동기 로깅으로 애플리케이션 성능에 최소한의 영향
- 유연성: 다양한 출력 대상 및 포맷 지원
- 스레드 안전성: 다중 스레드 환경에서 안전한 사용
- 확장성: 커스텀 작성자 및 포맷터 지원
- 통합 용이성: 에코시스템 컴포넌트와 원활한 통합
주요 기능
| 기능 | 설명 | 상태 |
| 비동기 로깅 | 백그라운드 스레드에서 로그 처리 | ✅ |
| 다중 출력 | 콘솔, 파일, 원격 등 | ✅ |
| 로그 로테이션 | 크기/시간 기반 자동 로테이션 | ✅ |
| 구조화된 로깅 | JSON 형식 로그 지원 | ✅ |
| 컨텍스트 추적 | 요청 ID, 트레이스 ID 전파 | ✅ |
| 조건부 로깅 | 런타임 레벨 조정 | ✅ |
로그 레벨
레벨 정의
enum class log_level {
debug = 1,
info = 2,
warning = 3,
error = 4,
critical = 5
};
}
@ trace
Distributed tracing (trace_id, span_id, parent_span_id)
레벨별 사용 지침
| 레벨 | 사용 시나리오 | 예시 |
| TRACE | 상세 실행 흐름 추적 | 함수 진입/종료, 변수 값 |
| DEBUG | 개발 중 디버깅 정보 | 알고리즘 단계, 중간 결과 |
| INFO | 일반 운영 정보 | 서비스 시작/종료, 설정 로드 |
| WARNING | 잠재적 문제 경고 | 사용 중단 API, 리소스 부족 |
| ERROR | 복구 가능한 오류 | 네트워크 오류, 파일 읽기 실패 |
| CRITICAL | 시스템 위험 상황 | 메모리 부족, 데이터 손상 |
사용 예시
#include <kcenon/logger/logger.h>
auto logger = create_logger(
"my_app");
logger->trace(
"함수 진입: process_data()");
logger->debug(
"처리할 항목 수: {}", items.size());
logger->info(
"서버가 포트 {}에서 시작됨", port);
logger->warning(
"캐시 사용량 {}% 도달", cache_usage);
logger->error(
"데이터베이스 연결 실패: {}", error_msg);
logger->critical(
"메모리 할당 실패, 시스템 종료 중");
로그 작성자
콘솔 작성자
auto console = std::make_shared<console_writer>();
console->enable_colors(true);
Console writer for logging to stdout/stderr.
파일 작성자
auto file = std::make_shared<file_writer>("/var/log/app.log");
file->set_max_size(10 * 1024 * 1024);
file->set_max_files(5);
File writer for logging to files with optional buffering.
회전 파일 작성자
auto daily = std::make_shared<rotating_file_writer>(
"/var/log/app.log",
rotation_policy::daily
);
auto sized = std::make_shared<rotating_file_writer>(
"/var/log/app.log",
rotation_policy::size_based,
50 * 1024 * 1024
);
Rotating file writer with size and time-based rotation.
원격 작성자
#include <kcenon/logger/writers/remote_writer.h>
auto remote = std::make_shared<remote_writer>(
"log-server.example.com",
5514,
remote_protocol::syslog
);
remote->enable_tls(true);
커스텀 작성자
class custom_writer : public log_writer {
public:
void write(
const log_entry& entry)
override {
send_to_external_service(entry);
}
void flush() override {
}
};
auto custom = std::make_shared<custom_writer>();
@ custom
User-defined custom fields.
Represents a single log entry with all associated metadata.
포맷팅
기본 포맷
logger->set_pattern(
"[%Y-%m-%d %H:%M:%S.%e] [%l] [%n] %v");
JSON 포맷
커스텀 포맷터
class custom_formatter : public log_formatter {
public:
std::string format(
const log_entry& entry)
override {
return fmt::format("[{}] {} - {}",
entry.level_name(),
entry.timestamp_str(),
}
};
auto custom = std::make_shared<custom_formatter>();
logger->set_formatter(custom);
small_string_256 message
The actual log message.
필터링
레벨 필터링
logger->set_level(log_level::info);
Core console writer for logging to stdout/stderr.
Core file writer for logging to files.
패턴 필터링
#include <kcenon/logger/filters/pattern_filter.h>
auto filter = std::make_shared<pattern_filter>();
filter->include_pattern(".*database.*");
filter->exclude_pattern(".*password.*");
조건부 필터링
#include <kcenon/logger/filters/conditional_filter.h>
auto filter = std::make_shared<conditional_filter>([](
const log_entry& entry) {
if (entry.
level() == log_level::info) {
return hour >= 9 && hour <= 18;
}
return true;
});
log_level level
Severity level of the log message.
std::chrono::system_clock::time_point timestamp
Timestamp when the log entry was created.
비동기 로깅
비동기 모드 활성화
#include <kcenon/logger/async_logger.h>
auto async_logger = create_async_logger("my_app", {
.queue_size = 8192,
.flush_interval_ms = 100,
.overflow_policy = overflow_policy::block
});
성능 비교
| 모드 | 처리량 | 지연시간 (p99) |
| 동기 | 100K logs/s | 10μs |
| 비동기 (block) | 1M logs/s | 1μs |
| 비동기 (drop) | 2M logs/s | 500ns |
성능 특성
벤치마크 결과
| 시나리오 | 처리량 | 지연시간 (p50) | 지연시간 (p99) |
| 콘솔 출력 | 50K/s | 5μs | 20μs |
| 파일 쓰기 | 200K/s | 2μs | 10μs |
| 비동기 큐 | 1M/s | 200ns | 1μs |
| JSON 포맷 | 100K/s | 3μs | 15μs |
최적화 팁
- 비동기 로깅 사용: 고처리량 애플리케이션에 필수
- 적절한 레벨 설정: 프로덕션에서는 INFO 이상 권장
- 버퍼링 활용: 파일 작성자의 버퍼 크기 조정
- 필터 최소화: 필터가 많을수록 성능 저하
통합 기능
thread_system 통합
#include <kcenon/logger/integration/thread_logger.h>
auto pool = create_thread_pool(4);
auto logger = create_thread_logger(
"worker", pool);
});
monitoring_system 통합
#include <kcenon/logger/integration/metrics_logger.h>
auto metrics = create_metrics_collector();
logger->set_metrics_collector(metrics);
common_system 통합
#include <kcenon/logger/integration/result_logger.h>
auto result = perform_operation();
}
구성 예시
프로덕션 설정
auto logger = create_async_logger(
"production_app", {
.queue_size = 16384,
.flush_interval_ms = 50,
.overflow_policy = overflow_policy::drop_oldest
});
logger->set_level(log_level::info);
auto file = std::make_shared<rotating_file_writer>(
"/var/log/app/app.log",
rotation_policy::daily,
0,
30
);
file->set_level(log_level::info);
auto error_file = std::make_shared<file_writer>("/var/log/app/error.log");
error_file->set_level(log_level::error);
logger->add_writer(error_file);
개발 설정
auto logger = create_logger(
"dev_app");
logger->set_level(log_level::debug);
auto console = std::make_shared<console_writer>();
console->enable_colors(true);
console->set_level(log_level::debug);
logger->set_pattern(
"[%Y-%m-%d %H:%M:%S.%e] [%l] [%t] [%@] %v");
OTLP 통합
관찰성 백엔드로 로그를 내보내기 위한 OpenTelemetry Protocol (OTLP) 지원입니다.
개요
OTLP writer는 분산 추적 상관관계를 위한 W3C Trace Context 지원과 함께 OpenTelemetry 호환 컬렉터(Jaeger, Zipkin, Grafana Tempo 등)로 로그 항목을 내보냅니다.
OTLP Writer 설정
kcenon::logger::writers::otlp_writer::config cfg;
cfg.endpoint = "http://localhost:4318/v1/logs";
cfg.protocol = kcenon::logger::writers::otlp_writer::protocol_type::http;
cfg.service_name = "my-service";
cfg.service_version = "1.0.0";
cfg.max_batch_size = 512;
cfg.flush_interval = std::chrono::milliseconds{5000};
cfg.max_retries = 3;
cfg.retry_delay = std::chrono::milliseconds{100};
auto otlp = std::make_unique<kcenon::logger::writers::otlp_writer>(cfg);
logger->add_writer(
"otlp", std::move(otlp));
OpenTelemetry Protocol (OTLP) log writer for observability kcenon.
Trace Context 전파
ctx.
trace_id =
"0af7651916cd43dd8448eb211c80319c";
{
logger->log(log_level::info,
"Processing request");
}
RAII guard for OpenTelemetry context.
OpenTelemetry context for trace correlation.
프로토콜 지원
| 프로토콜 | 기본 포트 | 사용 사례 |
http | 4318 | 표준 OTLP/HTTP, 방화벽 친화적 |
grpc | 4317 | 고처리량, 스트리밍 |
기능
- W3C Trace Context: trace_id, span_id, trace_flags 전파
- 배치 내보내기: 구성 가능한 배치 크기 및 플러시 간격
- 지수 백오프 재시도: 내보내기 실패 시 자동 재시도
- 리소스 속성: 서비스명, 버전, 네임스페이스, 커스텀 속성
- 이중 프로토콜: HTTP 및 gRPC 지원
- TLS 지원: 프로덕션 배포를 위한 보안 전송
로그 샘플링
중요한 메시지를 보존하면서 볼륨을 제어하는 적응형 로그 샘플링입니다.
샘플링 전략
| 전략 | 설명 | 적합한 용도 |
random | 비율 기반 확률적 샘플링 | 일반 볼륨 감소 |
rate_limiting | 시간 윈도우당 N개 로그 | 엄격한 비율 제어 |
adaptive | 볼륨 기반 비율 자동 조절 | 가변 트래픽 패턴 |
hash_based | 메시지 내용 기반 결정적 샘플링 | 재현 가능한 샘플링 |
빠른 설정
auto sampler = sampler_factory::create_random(0.1);
auto sampler = sampler_factory::create_rate_limited(1000);
auto sampler = sampler_factory::create_adaptive(10000, 0.01);
auto sampler = sampler_factory::create_production(0.1,
{log_level::error, log_level::critical});
logger->set_sampler(std::move(sampler));
설정
config.
strategy = sampling_strategy::adaptive;
{"security", 1.0},
{"debug", 0.01},
};
auto sampler = std::make_unique<log_sampler>(config);
logger->set_sampler(std::move(sampler));
Configuration for log sampling behavior.
double rate
Base sampling rate (0.0 to 1.0)
std::size_t adaptive_threshold
Threshold (messages/second) to trigger adaptive sampling.
std::unordered_map< std::string, double > category_rates
bool adaptive_enabled
Enable adaptive sampling.
double adaptive_min_rate
Minimum sampling rate when adaptive sampling is active.
sampling_strategy strategy
Sampling strategy to use.
std::vector< log_level > always_log_levels
Log levels that are never sampled (always logged)
bool enabled
Enable or disable sampling.
기능
- 항상 로깅 레벨: 중요 메시지는 샘플링을 완전히 우회
- 카테고리별 비율: 로그 카테고리별 다른 샘플링 비율
- 적응형 스로틀링: 고부하 시 자동 비율 감소
- 런타임 재설정: 재시작 없이 샘플링 설정 변경
- 고성능: 빠른 xorshift64 PRNG, FNV-1a 해싱
실시간 로그 분석
실시간 이상 감지 및 패턴 기반 알림 시스템입니다.
이상 유형
| 유형 | 설명 | 트리거 |
error_spike | 갑작스러운 오류 증가 | 윈도우당 오류 수 임계값 초과 |
pattern_match | Regex 패턴 감지 | 로그 메시지가 설정된 패턴과 일치 |
rate_anomaly | 비정상 로그 비율 | 비율이 기준선에서 크게 벗어남 |
new_error_type | 이전에 없던 오류 | 처음 보는 오류 메시지 |
사용법
50,
std::cerr << "이상 감지: " << event.description << std::endl;
}
);
analyzer->add_pattern_alert("OutOfMemory|OOM", log_level::error);
logger->set_realtime_analyzer(std::move(analyzer));
static std::unique_ptr< realtime_log_analyzer > create_production(size_t error_threshold=50, realtime_log_analyzer::anomaly_callback callback=nullptr)
Create a production-ready analyzer with sensible defaults.
Real-time log analysis with anomaly detection.
Represents an anomaly event detected during real-time analysis.
참고사항
스레드 안전성
- 로거: 스레드 안전 (내부 동기화)
- 작성자: 대부분 스레드 안전 (구현에 따름)
- 포맷터: 상태 없음, 스레드 안전
주의사항
- 로거 생성은 비용이 있음 - 한 번 생성 후 재사용
- 비동기 로거는 종료 시 flush() 호출 필요
- 로그 레벨을 낮게 설정하면 성능 저하 가능
최종 업데이트: 2026-02-08 버전: 0.4.0
Made with ❤️ by 🍀☀🌕🌥 🌊