메뉴 닫기

파이썬 logging 모듈로 로그 남기기, print보다 강력한 이유는?

파이썬 logging 모듈로 로그 남기기, print보다 강력한 이유는?

🛠️ print로는 부족한 로그 관리, logging으로 체계적인 디버깅 시작해보세요

개발을 하다 보면 디버깅을 위해 print()를 남발하게 되는 경우가 많습니다.
처음엔 편리하지만, 프로젝트가 커지면 어떤 로그가 중요한지, 어디서 에러가 났는지 파악하기 어려워지죠.
그럴 때 필요한 게 바로 파이썬의 logging 모듈입니다.
단순히 메시지를 출력하는 걸 넘어서, 로그의 심각도에 따라 레벨을 나눠 관리할 수 있고, 파일로 저장하거나 형식을 지정할 수도 있어 오류 추적과 유지보수에 탁월한 도구입니다.
이 글에서는 logging 모듈을 활용해 개발 효율을 높이는 방법을 아주 쉽게 알려드릴게요.

logging을 쓰면 어떤 점이 좋을까요?
print보다 복잡하고 어렵다는 인식이 있지만, 딱 한 번만 구조를 익히면 오히려 더 간단하게 느껴질 수 있어요.
INFO, WARNING, ERROR와 같은 로그 레벨로 메시지를 구분하면, 디버깅 시 중요한 정보를 놓치지 않고 빠르게 파악할 수 있죠.
또한 설정만 조금 바꾸면 콘솔이 아닌 파일로 로그를 저장할 수 있어 운영 환경에서도 큰 도움이 됩니다.
지금부터 logging을 왜 써야 하는지, 어떻게 써야 하는지, 핵심만 콕콕 짚어드릴게요.



🔗 print와 logging의 차이점

개발 초기에는 print()로 간단한 출력만으로도 충분해 보일 수 있습니다.
하지만 프로젝트가 커지고, 여러 환경에서 코드를 실행하게 되면 단순 출력만으로는 로그를 효율적으로 관리하기 어렵습니다.
print는 모든 메시지를 똑같은 방식으로 출력하기 때문에 중요한 정보와 참고용 메시지가 섞여 디버깅이 더 복잡해질 수 있습니다.

logging 모듈은 메시지를 레벨로 구분하여 출력할 수 있고, 메시지의 형식(format)이나 출력 대상(console, file 등)을 자유롭게 설정할 수 있는 장점이 있습니다.
예를 들어, 에러 상황에서는 ERROR, 단순한 상태 출력은 INFO, 경고는 WARNING으로 구분하면 이후 로그를 볼 때도 한눈에 상태를 파악할 수 있죠.

  • 🖨️print()는 단순 출력용으로만 사용됩니다
  • 📂logging은 로그 레벨, 출력 형식, 파일 저장 등을 지원합니다
  • 🔍운영 환경에서는 logging이 필수입니다

한 마디로 요약하자면, print는 초보자용, logging은 실무용이라고 볼 수 있어요.
특히 여러 환경에서 서비스가 돌아가는 웹 백엔드나 서버 프로세스를 개발할 때는 logging 없이는 제대로 된 유지보수가 어렵습니다.
로그 수준별 구분, 파일 저장, 시간 정보 삽입 등은 print()로는 불가능한 기능이죠.

🛠️ 기본 logging 사용법

파이썬에서 logging을 사용하려면 우선 import logging을 통해 모듈을 불러와야 합니다.
그 후 logging.basicConfig()를 이용해 로그 형식, 레벨, 출력 위치 등을 설정할 수 있습니다.
기본적인 사용법은 매우 간단하며, 아래 예시만 봐도 금방 감을 잡을 수 있어요.

CODE BLOCK
import logging

# 기본 설정
logging.basicConfig(level=logging.INFO)

logging.debug("디버그 메시지")
logging.info("정보 메시지")
logging.warning("경고 메시지")
logging.error("에러 메시지")
logging.critical("치명적인 문제")

위 코드를 실행하면 level=logging.INFO 설정 덕분에 INFO 이상 수준의 로그만 출력됩니다.
즉, debug() 메시지는 무시되고 info(), warning(), error(), critical()만 출력되죠.
이처럼 logging은 출력 수준을 유연하게 조정할 수 있어서, 원하는 로그만 선택적으로 확인할 수 있습니다.

💡 TIP: 기본 설정을 한 번만 호출해야 적용됩니다. basicConfig()는 중복 호출 시 무시될 수 있으니 초기 실행 지점에서 설정하는 것이 좋아요.

또한 로그에 시간, 파일명, 라인번호 등을 함께 출력하고 싶다면 format 옵션을 사용하면 됩니다.
예시를 보며 살펴보면 더 이해가 쉬울 거예요.

CODE BLOCK
logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s - %(levelname)s - %(message)s"
)

이렇게 설정하면 로그 메시지 앞에 시간과 로그 레벨이 함께 표시되어 시점과 로그 의미를 명확히 확인할 수 있습니다.
이는 특히 오류 발생 시 원인을 파악하거나 특정 시간대에 어떤 문제가 발생했는지를 추적할 때 유용합니다.



⚙️ 로그 레벨 설정 방법

logging 모듈은 로그 메시지를 중요도에 따라 다섯 가지 레벨로 분류합니다.
각 레벨은 숫자로도 매핑되며, basicConfig()level 파라미터에 해당 값을 지정하면 그 이상 수준의 로그만 출력됩니다.

레벨명 숫자 값 의미
DEBUG 10 디버깅용 상세 정보
INFO 20 일반적인 정보 메시지
WARNING 30 주의가 필요한 경고
ERROR 40 에러 발생, 프로그램은 계속 실행됨
CRITICAL 50 심각한 에러, 시스템 중단 가능성 있음

만약 level=logging.WARNING으로 설정하면, WARNING, ERROR, CRITICAL 로그만 출력됩니다.
디버깅 단계에서는 DEBUG, 운영 환경에서는 WARNING 이상으로 설정하는 것이 일반적입니다.

💎 핵심 포인트:
로그 레벨은 단순한 필터링을 넘어서, 유지보수와 성능에 직접적인 영향을 줍니다. 로그 수준 설정만 잘해도 디버깅이 훨씬 쉬워집니다.

🔌 로그를 파일로 저장하기

콘솔에만 출력되는 로그는 프로그램이 종료되면 사라지기 때문에 오류 추적이나 운영 기록을 남기기 어렵습니다.
그래서 실무에서는 로그를 파일로 저장하는 방식을 많이 사용합니다.
파이썬 logging 모듈은 아주 간단하게 파일 핸들러(FileHandler)를 추가할 수 있도록 설계되어 있습니다.

아래는 로그를 app.log라는 파일에 저장하도록 설정한 예시입니다.

CODE BLOCK
import logging

# 로그 파일 저장 설정
logging.basicConfig(
    filename="app.log",
    filemode="w",
    level=logging.INFO,
    format="%(asctime)s - %(levelname)s - %(message)s"
)

logging.info("로그 파일에 저장되는 메시지입니다.")

위 코드를 실행하면 현재 디렉터리에 app.log 파일이 생성되고, 로그 메시지가 해당 파일에 순차적으로 저장됩니다.
filemode="w"는 매 실행 시 로그 파일을 새로 쓰겠다는 의미이며, 누적 저장을 원한다면 "a"로 설정하면 됩니다.

💡 TIP: 운영 환경에서는 RotatingFileHandler를 사용해 파일 용량에 따라 자동 분할되도록 설정할 수도 있습니다.

파일에 로그를 남기면, 오류 발생 시간, 유형, 횟수 등 모든 정보를 이력으로 분석할 수 있어 유지보수에 큰 도움이 됩니다.
특히 서비스가 실시간으로 운영되는 시스템에서는 파일 저장은 선택이 아닌 필수입니다.



💡 유지보수를 쉽게 만드는 팁

logging을 잘 활용하면 코드의 유지보수 효율이 비약적으로 높아집니다.
중요한 건 단순히 로그를 남기는 것이 아니라, 어떤 정보를 어떤 구조로 남기느냐입니다.
아래 팁들을 참고해 체계적인 로그 관리 습관을 만들어 보세요.

  • 🧩로그 메시지는 구체적일수록 좋습니다 (예: 사용자 ID, 함수명 포함)
  • 🧭에러 발생 위치와 스택 트레이스를 포함하는 것이 좋습니다
  • 📂로그 레벨별로 파일을 분리하면 나중에 필터링이 쉬워집니다
  • 📌프로덕션 환경에서는 DEBUG 로그는 제외하는 것이 일반적입니다

또한 복잡한 시스템에서는 logger = logging.getLogger("모듈명") 형태로 모듈별 로거를 분리해 사용하는 것을 권장합니다.
이렇게 하면 각 모듈에서 어떤 일이 벌어졌는지 보다 정밀한 분석이 가능해집니다.

CODE BLOCK
import logging

logger = logging.getLogger("payment")
logger.setLevel(logging.INFO)

handler = logging.FileHandler("payment.log")
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
handler.setFormatter(formatter)

logger.addHandler(handler)

logger.info("결제 요청 수신")

이런 식으로 로거를 세분화하면 시스템 장애 시 원인을 더 빠르게 파악할 수 있고, 불필요한 로그 중복도 방지할 수 있습니다.
체계적인 로깅은 단순한 습관을 넘어, 안정적인 소프트웨어 유지보수의 핵심이라고 할 수 있어요.

❓ 자주 묻는 질문 (FAQ)

print보다 logging을 쓰는 이유가 뭔가요?
logging은 로그 수준 구분, 파일 저장, 형식 지정 등 다양한 기능을 제공해 유지보수와 디버깅이 훨씬 수월합니다.
기본 설정 없이도 로그를 출력할 수 있나요?
네, 기본 설정 없이도 로그는 출력되지만 형식이나 레벨 설정이 제한되므로 basicConfig() 설정을 권장합니다.
DEBUG 로그도 운영 서버에서 사용해도 되나요?
운영 서버에서는 DEBUG 로그는 제외하는 것이 일반적입니다. 보안 및 성능 이슈가 생길 수 있기 때문입니다.
로그를 날짜별로 저장할 수 있나요?
가능합니다. TimedRotatingFileHandler를 사용하면 로그 파일을 날짜 단위로 자동 분리할 수 있습니다.
여러 파일에 로그를 분산 저장하려면 어떻게 하나요?
여러 개의 Handler를 logger에 추가하면 로그를 콘솔, 파일 등 다양한 위치에 동시에 저장할 수 있습니다.
로그 형식을 커스터마이징할 수 있나요?
네, Formatter를 설정하면 시간, 레벨, 메시지 등 원하는 형식으로 자유롭게 커스터마이징 가능합니다.
특정 모듈만 따로 로그를 관리하고 싶어요.
getLogger("모듈명")을 활용해 모듈별로 개별 로거를 생성하면 분리 관리가 가능합니다.
로그가 너무 많아 관리가 어렵습니다. 해결 방법이 있나요?
로그 레벨을 조정하거나, 필터 기능을 활용해 불필요한 로그는 제외하고 필요한 정보만 추출할 수 있습니다.

🧾 print 대신 logging을 쓰면 달라지는 개발 효율

파이썬 logging 모듈은 단순한 출력 도구가 아니라, 디버깅과 유지보수를 위한 강력한 로깅 시스템입니다.
print로는 구현할 수 없는 로그 레벨 구분, 형식 지정, 파일 저장 등의 기능을 통해 개발자는 더욱 체계적인 코드 관리를 할 수 있게 됩니다.
DEBUG, INFO, WARNING, ERROR, CRITICAL 등 로그 레벨을 적절히 활용하면 오류 발생 원인을 빠르게 추적하고, 시스템 상태를 효과적으로 모니터링할 수 있습니다.
또한 로그를 파일로 저장하거나 모듈별로 분리해서 기록하면, 복잡한 프로젝트에서도 문제를 쉽게 진단할 수 있는 환경을 만들 수 있습니다.
logging은 개발 초기부터 습관처럼 적용해두면, 장기적으로 프로젝트 안정성과 생산성을 모두 향상시켜주는 최고의 도구입니다.
이제 print 대신 logging을 선택할 때입니다.


🏷️ 관련 태그 : 파이썬, logging모듈, 로그관리, 에러추적, 파이썬개발, 개발팁, 디버깅도구, print대신logging, 로그레벨, 백엔드로그