PHpullh
학습 라이브러리/Kotlin/로그 파일 분석

KOTLIN · 파일/IO

로그 파일 분석

시퀀스를 활용하여 대용량 로그 파일을 메모리 효율적으로 분석합니다.

파일/IO고급log-analysissequenceregexfile-processing

핵심 설명

시퀀스를 활용하여 대용량 로그 파일을 메모리 효율적으로 분석합니다.

Kotlin code

import java.io.File
import java.time.LocalDateTime
import java.time.format.DateTimeFormatter

data class LogEntry(
    val timestamp: String,
    val level: String,
    val message: String
)

fun parseLogLine(line: String): LogEntry? {
    val regex = Regex("""^[(d{4}-d{2}-d{2} d{2}:d{2}:d{2})][(w+)]s(.+)$""")
    return regex.matchEntire(line)?.let {
        val (ts, level, msg) = it.destructured
        LogEntry(ts, level, msg)
    }
}

fun analyzeLog(lines: Sequence<String>) {
    val entries = lines.mapNotNull { parseLogLine(it) }
    val buffer = mutableListOf<LogEntry>()
    entries.forEach { buffer.add(it) }

    // 레벨별 통계
    val byLevel = buffer.groupBy { it.level }
    println("=== 로그 레벨 통계 ===")
    byLevel.forEach { (level, logs) ->
        println("  $level: ${logs.size}건")
    }

    // 에러 메시지 Top 5
    println("
=== ERROR 메시지 ===")
    buffer.filter { it.level == "ERROR" }
        .groupBy { it.message.take(50) }
        .entries.sortedByDescending { it.value.size }
        .take(5)
        .forEach { println("  ${it.value.size}건: ${it.key}") }
}

fun main() {
    // 시뮬레이션 데이터
    val logData = listOf(
        "[2024-01-15 10:00:00][INFO] 서버 시작",
        "[2024-01-15 10:00:01][DEBUG] 설정 로드",
        "[2024-01-15 10:00:05][ERROR] DB 연결 실패",
        "[2024-01-15 10:00:10][ERROR] DB 연결 실패",
        "[2024-01-15 10:00:15][WARN] 메모리 부족",
    )
    analyzeLog(logData.asSequence())
}

학습 팁

실제 파일 분석 시 File("log.txt").useLines { analyzeLog(it) }로 호출하면 대용량 파일도 스트리밍 처리됩니다.

주의할 점

시퀀스를 두 번 순회하면 두 번째 순회가 실패할 수 있습니다. 여러 집계가 필요하면 리스트로 변환하거나 한 번의 순회로 모든 통계를 수집하세요.

자주 묻는 질문

로그 파일 분석란 무엇인가요?

시퀀스를 활용하여 대용량 로그 파일을 메모리 효율적으로 분석합니다.

로그 파일 분석 학습 시 주의할 점은 무엇인가요?

시퀀스를 두 번 순회하면 두 번째 순회가 실패할 수 있습니다. 여러 집계가 필요하면 리스트로 변환하거나 한 번의 순회로 모든 통계를 수집하세요.