Log Rotation: 작동 방식, 로테이션 전략 및 모바일 프로젝트 구성

저자: IT Sectr 게시일: 2026-05-28 읽는 시간: 8 분

Log Rotation은 보관, 압축 및 오래된 레코드 삭제를 통해 디스크 오버플로를 방지하는 자동 로그 파일 관리 메커니즘입니다. 모바일 애플리케이션에서 로그는 사용자 기기에 축적되며, 로테이션이 없으면 사용 후 몇 주 만에 수 기가바이트의 메모리를 차지할 수 있습니다. Redis 문서에 따르면, 올바른 log rotation 구성은 통제되지 않은 로그 증가와 비교하여 디스크 가득 참으로 인한 시스템 장애 위험을 99%까지 줄입니다. 주요 로테이션 전략은 파일 크기 기준, 시간 기준, 파일 수 기준의 세 가지이며 각각 사용 시나리오에 따라 선택됩니다. Linux의 logrotate, iOS의 CocoaLumberjack, Android의 Timber는 모두 세 가지 접근 방식을 지원합니다.

핵심 포인트

  • Log Rotation — 설정된 임계값 도달 시 활성 로그 파일의 자동 전환 및 오래된 파일 보관 또는 삭제
  • 크기 기반 로테이션 — 현재 파일이 제한에 도달하면(일반적으로 10–100 MB) 새 파일 생성, 이전 파일은 .gz로 압축
  • 시간 기반 로테이션 — 크기와 관계없이 N시간마다 또는 하루에 한 번 파일 전환, 일일 덤프에 편리
  • logrotate — 시스템 및 애플리케이션 로그의 자동 로테이션을 위한 표준 Linux 유틸리티
  • 디스크 할당량 — 기기의 모든 로그 총 용량 제한, 초과 시 가장 오래된 파일 삭제

Log Rotation이란

Log Rotation은 활성 로그 파일을 주기적으로 새 파일로 전환하고 동시에 이전 파일을 보관, 압축 또는 삭제하는 프로세스입니다. 로테이션이 없으면 단일 로그 파일이 무한히 증가하여 전체 디스크 파티션을 가득 채워 애플리케이션 장애와 데이터 손실로 이어집니다.

일반적인 시나리오: 애플리케이션이 app.log 파일에 로그를 씁니다. app.log가 100 MB에 도달하면 시스템이 이를 app.log.1로 이름을 바꾸고 app.log.1.gz로 압축한 후 새 빈 app.log를 만듭니다. 다음 가득 참 시 app.log.1은 app.log.2가 되고 app.log.1.gz는 app.log.2.gz가 되며 이전 app.log.2.gz는 삭제됩니다. 이 메커니즘을 보관 개수 유지 로테이션이라고 하며 보관 복사본 수가 고정됩니다.

Splunk(2023)에 따르면, 잘못된 로테이션 구성은 애플리케이션 서버의 디스크 공간 소진 관련 사고의 40% 원인입니다. 모바일 기기의 경우 사용자가 로그를 수동으로 관리할 수 없고 관리해서도 안 되므로 로테이션이 더욱 중요합니다.

로그 로테이션 전략

Log Rotation은 조합 가능한 세 가지 기본 전략을 지원합니다. 전략 선택은 애플리케이션 유형에 따라 다릅니다. 서버 시스템은 시간 기반 로테이션을, 모바일은 크기 기반을, 임베디드 시스템은 파일 수 기반을 주로 사용합니다.

전략트리거사용 시기
크기 기준파일이 N 바이트 도달예측 불가능한 로그 볼륨의 고부하 시스템
시간 기준N시간/일 경과일일 덤프, 규정 준수 요구사항
파일 수 기준N개 파일 생성디스크 공간이 제한된 모바일 기기

크기 기반 로테이션 — 가장 일반적

크기 기반 로테이션은 어떤 로그 파일도 설정된 제한을 초과하지 않도록 보장합니다. 제한은 사용 가능한 디스크 공간과 로깅 빈도에 따라 선택됩니다. 서버의 경우 일반적인 제한은 파일당 100–500 MB, 모바일 기기의 경우 1–10 MB입니다. 애플리케이션이 과도하게 로깅하는 경우 제한을 낮춰야 하며, 그렇지 않으면 로테이션이 몇 분마다 발생합니다.

시간 기반 로테이션 — 규정 준수용

시간 기반 로테이션은 로그 볼륨과 무관하며 파일이 일정에 따라 엄격히 전환됩니다. 로그를 고정 일수 동안 보관해야 하는 시스템에 편리합니다. 보관 개수 유지 = 30인 일일 로테이션은 30일 보관을 의미합니다. 단점은 부하가 심한 경우 단일 파일이 하루에 기가바이트까지 커질 수 있다는 점입니다.

Linux의 logrotate: 구성 및 예제

logrotate는 자동 로그 로테이션을 위한 표준 Linux 유틸리티입니다. cron을 통해 실행되며 /etc/logrotate.d/의 구성 파일을 처리합니다. 각 서비스(nginx, postgresql, 애플리케이션)는 로그 경로, 로테이션 전략 및 로테이션 후 작업을 지정하여 자체 구성을 만듭니다.

cpp
# /etc/logrotate.d/myapp — 애플리케이션 로그 로테이션
/var/log/myapp/*.log {
    daily
    rotate 7
    compress
    delaycompress
    missingok
    notifempty
    create 0640 www-data www-data
    postrotate
        kill -HUP $(cat /var/run/myapp.pid)
    endscript
}

이 구성은 로그를 매일 로테이션하고, 7개의 보관 복사본을 유지하며, gzip으로 이전 파일을 압축하고(마지막 파일 제외 — delaycompress), 로그가 없어도 오류를 발생시키지 않으며(missingok), 빈 파일을 로테이션하지 않고(notifempty), 0640 권한으로 파일을 다시 만듭니다. 로테이션 후 postrotate 스크립트를 통해 애플리케이션 프로세스에 HUP 신호를 보냅니다.

logrotate 매개변수

size — 크기 도달 시 로테이션(size 100M). rotate — 보관 복사본 수(rotate 7). compress — gzip 압축. dateext — 순서 번호 대신 파일 이름에 날짜 추가. sharedscripts — 각 파일 개별이 아닌 모든 파일에 대해 postrotate를 한 번 실행. maxage — N일보다 오래된 보관 파일 삭제.

모바일 애플리케이션의 Log Rotation

모바일 기기에서 Log Rotation은 중요합니다. 사용자가 파일 시스템을 관리하지 않고 애플리케이션이 로그로 기가바이트를 차지할 것이라 기대하지 않기 때문입니다. iOS와 Android에는 내장 메커니즘이 있습니다. iOS의 os_log는 고정 크기 링 버퍼(덮어쓰기 방식 로테이션)를 사용하고, Android Logcat은 커널에 제한된 버퍼가 있습니다.

iOS의 사용자 정의 파일 로그에는 크기 및 시간 기반 로테이션을 지원하는 DDFileLogger 클래스를 사용하는 CocoaLumberjack이 사용됩니다. Android에서는 Logback 또는 RollingFileAppender를 통한 사용자 정의 구현이 사용됩니다. 두 도구 모두 최대 파일 크기와 보관 파일 수를 설정할 수 있습니다.

swift
// CocoaLumberjack — iOS 파일 로테이션
import CocoaLumberjack

let fileLogger = DDFileLogger()
fileLogger.maximumFileSize = 1024 * 1024 // 1 MB
fileLogger.logFileManager.maximumNumberOfLogFiles = 5
DDLog.add(fileLogger)

iOS: os_log는 로테이션이 필요하지 않습니다 — 메시지가 링 버퍼에서 덮어써집니다. 하지만 애플리케이션이 사용자 정의 파일 로그(디버깅 또는 서버 전송용)를 작성하는 경우 로테이션을 수동으로 구성해야 합니다. CocoaLumberjack은 iOS 팀의 표준 선택이며 보관 파일을 자동으로 .gz로 압축하고 제한 초과 시 이전 파일을 삭제합니다.

Android에서 로테이션이 중요한 이유

Android는 애플리케이션이 자체 디렉토리에 로그를 쓰는 것을 제한하지 않습니다. 개발자가 로테이션 없이 파일에 디버그 로그를 쓰면 활성 사용 한 달 만에 500 MB에서 1 GB를 차지할 수 있습니다. 사용자는 시스템이 저장 공간 부족 경고를 표시할 때 문제를 발견하고 애플리케이션을 삭제합니다. RollingFileAppender를 사용한 Logback은 이 문제를 해결합니다. 3개의 보관 파일로 5 MB 제한을 설정하면 로그가 20 MB를 초과하지 않습니다.

iOS 및 Android의 로테이션 구현 예제

다음은 두 플랫폼에서 로그 로테이션 구성의 예입니다. iOS에서는 CocoaLumberjack이, Android에서는 XML 구성을 사용한 Logback이 사용됩니다.

kotlin
// Android의 Logback — logback.xml의 로테이션 구성
// 파일 크기 5MB, 보관 복사본 3개
@file:Suppress("unused")

// logback.xml에서:
// <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
//   <file>${DATA_DIR}/logs/app.log</file>
//   <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
//     <fileNamePattern>app.%i.log.gz</fileNamePattern>
//     <minIndex>1</minIndex>
//     <maxIndex>3</maxIndex>
//   </rollingPolicy>
//   <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
//     <maxFileSize>5MB</maxFileSize>
//   </triggeringPolicy>
// </appender>

iOS의 CocoaLumberjack은 크기 기반 로테이션뿐만 아니라 logFileManager.maximumLogFiles를 사용한 날짜별 오래된 로그 삭제도 지원합니다. maximumLogFiles = 0으로 설정하면 제한이 제거되어 로그가 무제한으로 축적되므로 프로덕션 환경에서 위험합니다.

swift
// 총 볼륨 확인이 포함된 사용자 정의 로테이션
class SizeAwareLogger {
    let maxTotalSize: Int64 = 20 * 1024 * 1024

    func enforceQuota(at logDirectory: URL) {
        let files = (try? FileManager.default
            .contentsOfDirectory(
                at: logDirectory,
                includingPropertiesForKeys: [.fileSize]
            )) ?? []
        let total = files.reduce(0) {
            $0 + (try? $1.resourceValues(forKeys: [.fileSize])
                .fileSize).map(Int64.init) ?? 0
        }
        if total > maxTotalSize {
            // 가장 오래된 파일 삭제
            files.sorted { $0.path < $1.path }.first.map {
                try? FileManager.default.removeItem(at: $0)
            }
        }
    }
}

로테이션 모니터링 및 알림

Log Rotation은 자동 보관뿐만 아니라 시스템 상태의 지표이기도 합니다. 로그가 너무 자주 로테이션되면(몇 분마다) 과도한 로깅 또는 오류 로그 루프를 나타냅니다. 로테이션 빈도에 알림을 설정하세요. 시간당 10회 이상 로테이션되면 검사가 필요합니다.

모니터링 시스템(Prometheus, Grafana, Datadog)은 파일 시스템 내보내기를 통해 로테이션 메트릭을 추적할 수 있습니다. Prometheus node_exporter는 파일 크기 및 수정 시간 메트릭을 제공합니다. 모바일 기기에서 로테이션 모니터링은 일반적으로 SDK에 내장되어 있습니다. CocoaLumberjack은 DDLog를 통해 로테이션 이벤트를 기록하고 Logback은 appender를 통해 상태를 전송합니다.

알림: 예상보다 보관 파일이 많거나(로테이션 횟수가 제한 초과) 총 로그 볼륨이 할당량을 초과하면 시스템이 관리자에게 알려야 합니다. 서버의 표준 임계값은 파티션 크기의 80%이며, 모바일 기기의 경우 애플리케이션당 50 MB 초과 시 알림이 발생합니다.

자주 묻는 질문

로테이션에 최적의 로그 파일 크기는?

서버의 경우 100–500 MB, 모바일 애플리케이션의 경우 1–10 MB입니다. 너무 작은 제한(1 MB 미만)은 빈번한 로테이션과 불필요한 I/O 작업을 유발합니다. 너무 큰 제한(500 MB 초과)은 파일 열기 및 검색 시간을 증가시킵니다.

로그의 보관 복사본은 몇 개를 유지해야 하나요?

프로덕션의 경우 최소 7일(일일 로테이션) 또는 3–5개 보관(크기 기반 로테이션)입니다. 규정 준수 요구사항의 경우 30–90일이지만, 동일한 파티션에서 로테이션하는 대신 압축 및 보존 정책이 있는 별도 스토리지를 사용하세요.

모바일 기기에서 logrotate는 어떻게 작동하나요?

logrotate는 Linux 유틸리티로 iOS나 Android에서는 사용할 수 없습니다. 모바일 기기에서는 라이브러리를 통해 로테이션이 구현됩니다. iOS용 CocoaLumberjack과 Android용 Logback입니다. 루트 액세스가 필요하지 않으며 애플리케이션의 샌드박스 환경에서 작동합니다.

로그가 매분 로테이션되면 어떻게 해야 하나요?

순환 로깅이 있는지 확인하세요 — 오류 처리 자체가 새 오류를 생성하는 경우입니다. 보호 조치를 추가합니다. 임계값이 있는 동일한 유형의 반복 로깅 카운터(분당 100개 이상의 동일한 메시지 금지)와 초과 후 임시 잠금을 설정합니다.

로그 보관 파일을 압축해야 하나요?

필수는 아니지만 권장됩니다. gzip은 텍스트 로그를 데이터 손실 없이 10–20배 압축합니다. 모바일 기기에서 압축은 저장 공간을 50 MB에서 3–5 MB로 줄입니다. 유일한 단점은 압축 해제 없이 보관 파일을 읽을 수 없다는 점이지만, 분석에는 일반적으로 현재 파일만 필요합니다.

요약

  • Log Rotation — 제한 도달 시 새 파일 생성 및 디스크 오버플로 방지를 위한 이전 파일 보관의 자동 로그 파일 관리
  • 세 가지 전략 — 파일 크기 기준(가장 일반적), 시간 기준(덤프용), 파일 수 기준(공간이 제한된 모바일 기기용)
  • logrotate — 유연한 매개변수(daily, size, compress, rotate, postrotate 스크립트)를 갖춘 서버 측 로테이션용 표준 Linux 유틸리티
  • 모바일 라이브러리 — iOS의 CocoaLumberjack과 Android의 Logback은 압축 및 보관 수 제한과 함께 크기 기반 로테이션 지원
  • 디스크 할당량 — 모든 로그의 총 제한: 모바일 애플리케이션 20 MB, 초과 시 알림과 함께 서버 파티션의 80%
  • 모니터링 — 너무 빈번한 로테이션(시간당 10회 초과)은 순환 오류 로깅 또는 과도한 로그 볼륨을 나타냄
  • gzip 압축 — 보관 파일 크기를 10–20배 감소, 모든 플랫폼에 권장, delaycompress는 빠른 읽기를 위해 마지막 보관 파일을 압축하지 않은 상태로 유지

턴키 방식의 모바일 애플리케이션을 개발해 드립니다

IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.

프로젝트 논의

더 읽어보기