ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Django] 로그 설정하는 법
    Django 2024. 1. 10. 09:13
    728x90

    대략적인 방법은 이렇다.

    1. 로그 관련 파일을 만든다.
    2. 로그를 만들고 싶은 파일로 들어가 해당 파일을 임포트한다
    3. Logging.{출력하고 싶은 로그 레벨}(들어가고자하는 내용) 집어넣는다
    # log_setter.py
    
    Import os
    Import time
    Import logging
    Import logging.handlers
    From logging.handlers import TimedRotatingFileHandler
    
    Class RetimedRotatingFileHandler(TimedRotatingFileHandler)
    	
    	def __init__(self, filename, when=‘h’, interval = 1, backUpCount=0 , encoding=None, delay=False, utc=False): // 로그파일 초기 설정
    		TimedRotatingFileHandler.__init__(self, filename, when, interval, backUpCount, encoding, delay, utc)
    
    	def doRollover(self): // 로그 파일 변경에 대한 함수
    		if self.stream:
    			self.stream.close()
    			self.stream = None
    
    		current_time = int(time.time())
    		dst_now = time.lacaltime(current_time)[-1]
    		t = self.rolloverAt - self.interval
    		if self.utc:
    ‘			time_tuple = time.gmtime(t)
		else:
    			time_tuple = time.loccaltime(t)
    			dst_then = time_tuple[-1]
    			if dst_now != dst_then:
    				if dst_now:
    					addend = 3600
    				else:
    					addend = - 3600
    		
    		Dfn = self.baseFilename + “.” + time.strftime(self.suffix, time_tuple)
    		
    		if not os.path.exists(dfn) and os.path.exists(self.baseFilename)
    			os.rename(self.baseFilename, dfn)
    		if self.backupCount > 0:
    			For s in self.getFilesToDelete():
    				os.remove(s)
    		if not self.delay:
    			self.mode = “a”
    			self.stream = self._open()
    		new_rollover_at = self.computeRollover(current_time)
    		while new_rollover_at <= current_time:
    			new_rollover_at = new_rollover_at + self.interval
    
    		if (self.when == “MIDNIGHT” or self.when.startswith(“W”)) and not self.utc:
    			dst_at_rollover = time.localtime(new_rollover_at)[-1]
    			if dst_now != dst_at_rollover:
    				if not dst_now:
    					addend = -3600
    
    				else:
    					addend = 3600
    				
    				new_rollover_at += addend
    		self.rolloverAt = new_rollover_at		
    
    	
    def getLogger(name=None):
    	logger = logging.getLogger(name)
    	logger.setLevel(logging.INFO)
    		
    	// log format 지정
    	formatter = logging.Formatter(“%(asctime)s - [%(levelname)s] - “[%(name)s:%(filename)s:%(lineno)d] - %(message)s”)
    	
    	// log 파일에 기록
    	console = logging.StreamHandler()
    	timedfilehandler_info = ReTimedRotatingFileHandler(
    		filename = “./logs/{name}_info.log”.format(name=name),
    		when=“midnight”, interval=1, encoding=“uff-8”, backupCount=1095)
    
    	timedfilehandler_error = ReTimedRotatingFileHandler(
    		filename=“./logs/{name}_error.log”.format(name=name),
    		when=“midnight”, interval=1, encoding=“utf-8”, backupCount=1095)
    	
    	timedfilehandler_info.setFormatter(formatter)
    	timedfilehandler_error.setFormatter(formatter)
    
    	//level 설정
    	console.setLevel(logging.INFO)
    	timedfilehandler_info.setLevel(logging.INFO)
    	timedfilehandler_error.setLevel(logging.ERROR)
    
    	//format
    	console.setFormatter(formatter)
    	timedfilehandler_info.setFormatter(formatter)
    	timedfilehandler_error.setFormatter(formatter)
    
    	// handler 추가
    	if not logger.hasHandlers():
    		logger.addHandler(console)
    		logger.addHandler(timedfilehandler_info)
    		logger.addHandler(timedfilehandler_error)
    	
    	return logger

    logging 모듈의 handler.TimedRotatingFileHandler를 불러와 자신의 상황에 맞게 출력하고자 하는 로그 메시지를 작성하면 된다.

    위 코드를 천천히 읽어봐도 알겠지만, TimedRotatingFileHandler는 일정 시간 주기에 맞춰서 로그 파일을 저장하고 새로 만드는 핸들러라고 보면된다.

     

    만들어 놓은 다음에 로그 메시지를 남기고자 하는 파일에

    # xxx.py
    
    import log_setter
    
    logger = log_setter.getLogger("프로젝트명(혹은 짓고 싶은 이름)")
    
    
    # 남기고 싶은 곳에 logger.{로그 레벨}(출력하고자 하는 메시지)
    logger.INFO("데이터가 DB에 적재되었습니다")
    logger.CRITICAL("시스템에 치명적인 에러가 발생하였습니다")

    을 설정하여 사용하면 된다.

    728x90

    'Django' 카테고리의 다른 글

    [Django] Middleware  (0) 2024.02.02
    [Django] Django Throttling  (1) 2024.02.02
    [Django] CHAR 적용하기  (1) 2024.01.02
    [Django] Mysql-client 설치 오류  (0) 2023.11.12
    Django Signals  (1) 2023.11.12
Designed by Tistory.