본문 바로가기
파일·백업 자동화

[C# 파일 마스터 01]서버 용량 부족 끝! 1분마다 로그 청소하는 자동 비서 만들기

by 일상 과학자 2026. 1. 26.

1. 반복되는 서버 용량 부족 문제, 원인은 '로그 파일'

IT 시스템을 운영하거나 사내 서버를 관리하다 보면 예기치 않게 '디스크 용량 부족' 메시지를 마주하게 됩니다. 서비스가 중단되는 긴급 상황을 파악해 보면, 범인은 의외로 시스템 자체의 결함이 아닌 쌓여있는 로그(Log) 파일인 경우가 많습니다.

▲그림1. 로그파일로 용량이 부족한 이미지

애플리케이션은 동작하는 동안 매 순간 기록을 남깁니다. 처음에는 몇 KB에 불과했던 파일들이 시간이 흐르면서 수십, 수백 GB로 불어나 서버 공간을 잠식하게 됩니다. 담당자가 매번 수동으로 날짜를 확인하며 파일을 지우는 것은 비효율적일 뿐만 아니라, 실수로 최신 로그를 지울 위험도 존재합니다. "왜 이 단순한 작업이 자동화되지 않을까?"라는 고민은 여기서 시작됩니다.

2. 왜 '콘솔(Console) 프로그램'인가?

자동화 도구를 만들 때 화려한 UI(사용자 인터페이스)는 오히려 사치일 때가 있습니다. 특히 백그라운드에서 조용히 실행되어야 하는 시스템 관리 도구라면 더욱 그렇습니다. C# 콘솔 프로그램이 이 작업에 가장 적합한 이유는 다음과 같습니다.

  • 가벼운 리소스 점유: UI를 렌더링하는 데 필요한 메모리와 CPU를 소모하지 않습니다.
  • 작업 스케줄러와의 호환성: 윈도우 작업 스케줄러(Task Scheduler)에 등록하여 매일 새벽 특정 시간에 실행하기에 최적화되어 있습니다.
  • 높은 안정성: 복잡한 이벤트 처리가 없어 프로그램 자체가 중단될 확률이 현저히 낮습니다.

단순하지만 강력한 콘솔 기반 자동화는 개발 리소스를 최소화하면서도 업무 효율을 극대화하는 가장 똑똑한 방법입니다.

▲ 그림2.콘솔과 GUI 프로그램 차이

3. 효율적인 자동 삭제 로직의 설계

무턱대고 파일을 지우는 프로그램을 만드는 것은 위험합니다. 안전한 자동화를 위해 다음과 같은 단계적 접근 방식을 사용합니다.

  1. 대상 경로 설정: 로그 파일이 저장되는 정확한 폴더 경로를 지정합니다.
  2. 보관 기간 정의: 유지해야 할 기간(예: 30일)을 설정하여 기준 날짜를 계산합니다.
  3. 파일 탐색 및 비교: 해당 폴더 내의 모든 파일을 조회하고, 파일의 '마지막 수정 날짜'가 기준 날짜보다 이전인지 확인합니다.
  4. 안전한 삭제: 삭제 권한이나 파일 사용 중인 예외 상황을 처리하며 파일을 제거합니다.

▲ 그림3. 파일 삭제 조건

4. C# 예제 코드: 단일 파일로 완성하는 자동화

아래는 C#으로 작성된 핵심 로직입니다. 이 코드는 지정된 경로에서 30일이 지난 .log 확장자 파일을 찾아 자동으로 삭제합니다.

using System;
using System.IO;
using System.Linq;

namespace LogCleaner
{
    class Program
    {
        static void Main(string[] args)
        {
            // 1. 설정: 로그 경로 및 보관 기간(일)
            string logDirectory = @"C:\AppLogs\Server";
            int daysToKeep = 30;

            Console.WriteLine($"[{DateTime.Now}] 로그 정리 작업을 시작합니다.");

            try
            {
                // 2. 해당 경로가 존재하는지 확인
                if (!Directory.Exists(logDirectory))
                {
                    Console.WriteLine("지정된 경로를 찾을 수 없습니다: " + logDirectory);
                    return;
                }

                DirectoryInfo directoryInfo = new DirectoryInfo(logDirectory);
                DateTime thresholdDate = DateTime.Now.AddDays(-daysToKeep);

                // 3. 기준 날짜보다 오래된 .log 파일 필터링
                var filesToDelete = directoryInfo.GetFiles("*.log")
                    .Where(f => f.LastWriteTime < thresholdDate)
                    .ToList();

                Console.WriteLine($"총 {filesToDelete.Count}개의 삭제 대상 파일을 발견했습니다.");

                // 4. 파일 삭제 수행
                foreach (var file in filesToDelete)
                {
                    try
                    {
                        file.Delete();
                        Console.WriteLine($"삭제 완료: {file.Name} (최종 수정일: {file.LastWriteTime})");
                    }
                    catch (IOException ioEx)
                    {
                        Console.WriteLine($"삭제 실패(사용 중): {file.Name} - {ioEx.Message}");
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine($"치명적 오류 발생: {ex.Message}");
            }

            Console.WriteLine("로그 정리 작업이 종료되었습니다.");
        }
    }
}

5. 실행 결과 및 실무 활용 시나리오

위 코드를 빌드하여 실행하면 콘솔 화면에 삭제된 파일 목록과 날짜가 실시간으로 출력됩니다. 이를 통해 관리자는 어떤 데이터가 정리되었는지 명확히 확인할 수 있습니다.

실무 활용 시나리오:

  • 웹 서버 관리: IIS나 Apache 로그가 쌓이는 폴더에 적용하여 디스크 풀(Full) 장애를 예방합니다.
  • 백업 데이터 순환: 7일이 지난 임시 백업 파일을 자동으로 삭제하여 스토리지 공간을 최적화합니다.
  • 보안 로그 관리: 개인정보보호법에 따라 일정 기간이 지난 접속 기록을 영구 파기할 때 활용합니다.

6. 실무 적용 시 주의사항 및 팁

자동화 프로그램을 실제 운영 환경에 배포하기 전, 반드시 다음 사항을 체크해야 합니다.

  • 권한 확인: 프로그램이 실행되는 계정이 해당 폴더의 '삭제 권한'을 가지고 있어야 합니다. 관리자 권한으로 실행하는 것이 가장 안정적입니다.
  • 예외 처리: 다른 프로세스가 해당 로그 파일을 읽고(Writing/Reading) 있을 경우 삭제 시 에러가 발생할 수 있습니다. try-catch 문을 통해 프로그램 전체가 중단되지 않도록 방어 로직을 구성해야 합니다.
  • 테스트 필수: 처음 실행할 때는 file.Delete() 코드를 주석 처리하고 삭제 대상 파일의 이름만 출력해 보는 '드라이 런(Dry Run)' 과정을 거치시기 바랍니다.

7. 마무리하며

오늘은 C# 콘솔을 활용해 반복적인 서버 관리 업무를 자동화하는 방법을 알아보았습니다. 화려한 프로그램은 아니지만, 이러한 작은 도구들이 모여 시스템의 안정성을 높이고 개발자의 퇴근 시간을 앞당겨 줍니다.

콘솔 자동화는 여기서 그치지 않습니다. 삭제 결과를 이메일로 전송하거나, 삭제 전 압축 보관하는 기능을 추가하여 확장할 수 있습니다. 다음 포스팅에서는 '삭제된 로그 내역을 요약하여 이메일로 발송하는 알림 기능'을 추가하는 방법을 다루어 보겠습니다.

업무 자동화의 시작은 거창한 플랫폼 구축이 아니라, 오늘 당장 나를 괴롭히는 작은 불편함을 코드로 해결하는 것부터 시작됩니다.


이 글이 도움이 되셨다면, 여러분의 업무 환경에는 어떤 자동화가 필요한지 고민해 보세요.