Pickle, OS Module, Logging

DONGJIN IM·2022년 2월 15일
0
post-thumbnail

Pickle

파이썬의 객체(Instance)를 영속화 하는 built-in 객체로써, 파이썬 객체를 Binary File로 저장한 이후, 나중에 다시 활용할 수 있게 해주는 모듈이다.

Binary 파일 형태로 객체를 처리하므로, 파일 열기 모드에 'b'를 붙여줘야 한다.
예를 들어 Pickle 객체 저장할 때는 'wb', Pickle 객체 불러올 때는 'rb'를 입력해준다.

# Template
pickle.dump({Instance}, {파일 객체}) # Instance를 (pickle 객체로) 저장
pickle.load({파일 객체}) # 파일에 저장된 Instance를 불러옴

# 예시
import pickle

with open("a.pickle", "wb") as f:
    save = [1,2,3,4,5]
    pickle.dump(save, f) # 개발자가 만든 Class의 Instance 또한 저장 가능

with open("a.pickle", "rb") as f:
    s = pickle.load(f) 

OS Module

OS에서 직접적으로 다뤄야 하는 File, Directory 등에 대해 Python에서 처리할 수 있도록 만든 Module로써, 다양한 메서드가 존재한다.

이 중 os.path.join(str1, str2)는 유용한 것 같아 따로 정리했다.

os.path.join(str1, str2)

만약 str1/str2 파일 경로로 접근하고 싶을 때, 원래라면 "str1\str2" 혹은
str1+"\"+str2로 경로를 저장해야 한다.
하지만, Python에서는 이 방법을 추천하지 않는다.
os.path.join(str1, str2)를 수행하면 위 작업을 모두 수행해준다

파일 복사 코드

A 파일을 B 폴더로 복사하고 싶을 때 활용하는 방식이다.

import shutil
import os

source = "ex.txt"
dest = os.path.join("abc", "def.txt")
shutil.copy(source, dest) 
# source 파일을 dest 파일에 Copy하여 저장

Logging

Logging이란?

프로그램이 실행되는 동안 일어나는 정보를 기록으로 남기는 것으로, Console 화면에 출력, 파일에 남기기, DB에 남기기 등을 통해 Logging 정보를 저장할 수 있다.

print()와 달리 저장한 Log를 분석하여 의미 있는 결과를 도출할 수 있지다.(하지만 print()를 활용하지 않는 것은 아니다. 사실 편하게만 코딩하려면 Logging보다는 print()가 더 좋은 면도 있다.)

Log Level 별로 기록을 남길 필요가 있을 때도 유용하다.

Log Level

Log를 발생시킨 사건이 프로그램에 얼마나 중대한 영향을 끼치는지에 따라 발생시키는 Log의 Level을 지정해 줄 수 있다.

Log Level의 우선순위는 아래와 같다(참고로, 클 수록 Code에 심각한 영향을 끼치는 사건에 대한 로그라는 의미이다)

DEBUG < INFO < WARNING < ERROR < CRITICAL

  • DEBUG : 개발 시점에서만 활용하는 Log
  • INFO : 운영 시점에서 운영자만 활용하는 정보에 대한 Log
  • WARNING, ERROR, CRITICAL : 프로그램에 영향을 크게 끼치는 사건에 대한 Log로써, 프로그램 사용자도 볼 수 있도록 설정함

Default Log Level은 WARNING이며, 아무런 설정도 하지 않는다면WARNING 이상의 Log만 볼 수 있게 된다.

  • Log 발생시키기
import logging

logger.debug("DEBUG") # DEBUG Log level
logger.info("INFO") # INFO Log level
logger.warning("WARNING") # WARNING log level
logger.error("ERROR") # ERROR log level
logger.critical("CRITICAL") # CRITICAL log level

Log 관련 알아야 할 것들

  • Formatter : Log가 언제, 어떤 모듈에서 쓰였는지 등의 기타 정보를 같이 출력하기 위해 Log의 출력 형식을 정해주는 Handler Objects
  • Handler : 내가 로깅한 정보가 출력되는 위치를 설정하는 것
    • logging.StreamHandler() : Console창에 출력시킴
    • logging.FileHandler({파일 이름}) : 파일에 Log 내역 기록
      • 파일이 존재할 경우 append, 파일이 존재하지 않을 경우 해당 파일 이름으로 새로 파일 만듦
  • 로깅 모듈 생성 : logging.getLogger({Logger 이름})
    • Logger 이름에 내가 만들 Logger의 이름을 지정해 줄 수 있음
    • 중요한 점 : 같은 이름을 가진 Logger는 꼭 1번만 선언해주자!
      • 그렇지 않을 경우, Handler를 설정하였을 때 logger가 2개, 혹은 그 이상으로 형성되어 1번의 Log에 대하여 여러 번의 Log 기록을 입력할 수도 있다.

코드를 통한 실제 Log 활용법(기초)

  • User를 위한 Logger와, 나(운영자)를 위한 Logger를 만드는 과정
import logging

# Logging 시간, Logging 이름, Logger Level, Log Message가 Log로 출력되게 함
formatter = logging.Formatter('%(asctime)s - %(name)s - 
                                       %(levelname)s - %(message)s')

userlogger = logging.getLogger("user")
userlogger.setLevel(logging.WARNING)
# User는 WARNING부터 보면 되기 때문에 WARNING으로 Level 설정

mylogger = logging.getLogger("my")
mylogger.setLevel(logging.INFO)
# 운영자는 INFO부터 봐야 하기 때문에 INFO로 Level 설정

stream_hander = logging.StreamHandler()
userlogger.addHandler(stream_hander)
# User는 Log Message만 Console에 출력되게 함

file_handler = logging.FileHandler('myLog')
file_handler.setFormatter(formatter)
mylogger.addHandler(file_handler)
# 운영자는 Log 기록을 myLog라는 파일에 저장함
"""
Formatter는 Handler Obejcts이다.
따라서, handler에 setFormatter()를 통해 Formatter를 적용해줘야지만 format에
맞게 저장이 된다
"""
  • Formatter 부가 설명

    • asctime : 현재 시간
    • name : Logger 이름
    • levelname : 로깅 레벨
    • message : 로그 메시지
    • https://docs.python.org/3/library/logging.html
      • logging에 대한 모든 Obejct 및 Method 등의 설명이 있는 곳
      • LogRecord attributes 파트를 찾으면 위 4개 이외에도 여러 가지 attribute를 통해 Format을 설정할 수 있음을 알 수 있음
  • 코드 수행 결과

    • Case 1 : Log level이 info인 Log 발생
    userlogger.info("Login")
     mylogger.info("LogIn")
    
    """
    결과 : Console창 - 아무것도 뜨지 않음
          myLog파일 - 2022-02-16 03:20:14,142 - my - INFO - LogIn
    """
    • Case 2 : Log level이 warning인 Log 발생
    userlogger.warning("Hacking")
     mylogger.warning("Hacking")
    
    """
    결과 : Console창 - Hacking
          myLog파일 -  2022-02-16 03:20:14,142 - my - INFO - LogIn
                      2022-02-16 03:24:41,679 - my - WARNING - Hacking
          (Logger는 파일을 append 형식으로 열기 때문에, 이전 Log 기록도 저장되어 있음)
    
    """
profile
개념부터 확실히!

0개의 댓글

관련 채용 정보