좋아, 정말 중요한 질문이야.
print()와 logging은 겉보기에는 똑같이 "출력"해주지만,
의도, 상황, 기능 면에서 완전히 다른 목적을 가지고 있어.
✅ print() vs logging 차이: 언제 어떤 걸 써야 하나?
1️⃣ print()의 역할: 단순한 콘솔 출력 (학습, 디버깅용)
| 항목 | 설명 |
|---|
| 💡 목적 | 단순하게 값이나 메시지를 확인할 때 사용 |
| 🎓 사용 예 | 변수 값이 제대로 들어갔는지 확인할 때 |
| 📍 출력 대상 | 무조건 콘솔(터미널)에만 출력 |
| 📁 로그 파일 저장 | ❌ 불가능 |
| 🧪 대표 예시 | |
print("지금 id 값은:", id)
✅ 학생, 초보자, 빠른 테스트 환경에서 유용
❌ 실전 코드/운영 시스템에서는 사용하지 않음 (너무 단순해서)
2️⃣ logging의 역할: 로그를 기록하고 관리하는 시스템 (운영용)
| 항목 | 설명 |
|---|
| 💡 목적 | 프로그램 상태를 추적하고 기록하여 문제 분석에 활용 |
| 🔐 로그 수준(Level) | debug, info, warning, error, critical |
| 🖨 출력 대상 | 콘솔 + 파일, 서버, DB 등 다양 |
| 📁 파일 저장 | ✅ 가능 (filename='log.txt' 등 설정 가능) |
| 🧪 대표 예시 | |
import logging
logging.info("로그인 성공")
logging.error("비밀번호 오류")
✅ 실전 서비스, 서버, 프로젝트에서는 무조건 logging 사용
❌ 단순 출력 이상을 원한다면 print()로는 부족
🔎 logging 로그 레벨 비교
| 로그 레벨 | 의미 | 사용 예시 |
|---|
DEBUG | 아주 상세한 내부 동작 | 디버깅용 변수 추적 |
INFO | 일반 정보성 메시지 | 로그인 성공, 등록 완료 |
WARNING | 경고 (문제는 없지만 조심해야 할 상태) | 곧 만료될 계정 |
ERROR | 에러 발생 (프로그램은 계속 동작) | 로그인 실패, 예외 처리 |
CRITICAL | 심각한 오류 (서비스 중단 가능성 있음) | 서버 종료, DB 연결 실패 |
📌 logging.basicConfig(level=logging.INFO)로 설정하면
INFO, WARNING, ERROR, CRITICAL만 출력됨
✅ 어떤 상황에서 무엇을 써야 할까?
| 상황 | 적합한 도구 | 설명 |
|---|
| 값이 잘 들어갔는지 확인 | print() | 간단히 찍어보기 용도 |
| 함수의 흐름을 따라가고 싶을 때 | print() or logging.debug() | 디버깅 용도 |
| 회원가입, 로그인 성공 로그 기록 | logging.info() | 상태 기록 |
| 잘못된 입력, 실패 상황 | logging.error() | 문제 추적용 |
| 사용자에게 보여줄 메시지 | print() or UI로 전달 | (웹/앱 화면에 표시하는 용도는 별도 처리 필요) |
| 실시간 운영 중인 시스템 | 무조건 logging | 로그 저장, 분석 등 필수 요소 |
📌 실전 예: 둘의 용도 비교
print("회원 목록:", self.members)
logging.info("3명의 회원이 등록되었습니다.")
logging.error("로그인 실패: 잘못된 비밀번호")
✅ 결론 요약
| 항목 | print() | logging |
|---|
| 목적 | 디버깅, 실습용 | 운영, 유지보수, 분석용 |
| 로그 수준 | ❌ 없음 | ✅ 있음 (info, error 등) |
| 파일 저장 | ❌ 불가 | ✅ 가능 |
| 포맷 지정 | ❌ 불가 | ✅ 가능 |
| 실무 적합성 | ❌ 낮음 | ✅ 필수 |