프리온보딩 과제 5

Tasic·2021년 11월 16일
1


과제 정보 요약
구현 기간 : 21.11.15(17시) ~ 21.11.17 (10시)
자세한 내용은 Github 참고

들어가며

  • 이번 과제의 핵심 키워드는 외부 API의 값을 자동으로 DB와 동기화를 시키는 기능입니다.
    저는 API의 값을 자동으로 DB와 동기화 시킬 수 있는 로직을 일정 시간 간격으로 구동할 수 있는 기능을 구축하였습니다.
  • Django-crontab을 사용해서 일정 시간 간격으로 해당 작업을 수행 할 수 있도록 설정하였습니다.
  • crontab은 백그라운드에서 실행되는 작업이기 때문에, 로그를 이용해서 현재 상태를 파악할 수 있습니다.
  • 또한 자동화 로직이 실패한다면 로그를 통해서 원인을 분석할 수 있다고 생각됩니다.
  • 따라서 저는 배치를 자동으로 구동할 수 있는 기능을 개발할 때, Logging도 같이 생각하며 이번 프로젝트를 진행하였습니다.

Logging

  • 이번 과제에서 기억 남는 것은 log입니다. Django에서는 Log를 남길 수 있도록 logging이라는 훌륭한 기능을 제공합니다.
  • logging은 setting 파일에 아래와 같거나 비슷한 형식으로 정의하시면 됩니다.
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'formatbatch': {
            'format': '[%(asctime)s] %(levelname)s [%(filename)s:%(lineno)s] %(message)s',
            'datefmt': '%d/%b/%Y %H:%M:%S'
        },
    },

    'handlers': {
        'batchfile': {
            'level': 'INFO',
            'class': 'logging.handlers.TimedRotatingFileHandler',
            'when': 'W0',
            'filename': LOGGING_BATCH_PATH,
            'formatter': 'formatbatch',
        },
    },

    'loggers': {
        'batch': {
            'handlers': ['batchfile'],
            'level': 'INFO',
        },
    },

}
  • formatters : Log가 출력되는 형태(포멧)을 정의
    • 포멧양식은 링크 참고
  • handlers : Log가 출력되는 방식을 정함 (파일, 콘솔, 이메일 등)
    • handlers 종류는 링크 참고
  • loggers logging시에 사용할 이름

예시)

import logging
logger = logging.getLogger('batch') # batch라는 Logger 사용
logger.info('hello')

위 코드와 같이 작성 및 설정이 되어 있다고 가정하면, batch라는 loggers로 작동하고, batchhandlersbatchfile이 설정되어 있으므로, TimedRotatingFileHandler 방식으로 formatbatch의 설정된 포멧대로 출력 (파일, 콘솔 등...) 이 됩니다.

Result

[17/Nov/2021 01:24:01] INFO [utils.py:12] [start_batch] trying [1/5]
[17/Nov/2021 01:24:01] INFO [batch.py:98] [batch_task] Start get_data_from_open_api
[17/Nov/2021 01:24:01] INFO [batch.py:101] [batch_task] Start get_data_from_db
[17/Nov/2021 01:24:01] INFO [batch.py:104] [batch_task] Check items for Create, Udate, Delete]
[17/Nov/2021 01:24:01] INFO [batch.py:108] [batch_task] Create new itmes to db [totoal: 0]
[17/Nov/2021 01:24:01] INFO [batch.py:111] [batch_task] Update new itmes to db [totoal: 0]
[17/Nov/2021 01:24:01] INFO [batch.py:116] [batch_task] Delete new itmes to db [totoal: 0]
[17/Nov/2021 01:24:01] INFO [crontab.py:21] [start_batch] Success batch job [took:0.23s]

이전에도 DB 튜닝을 위해서 콘솔에 이러한 방식으로 Logging을 한 적은 있으나, 사실 의미를 잘 모른체 사용하였는데, 이번에 명확하게 알게되어 뿌듯하였습니다.

crontab

  • crontab에서는 로컬의 환경변수가 적용되지 않습니다. 이 사항이 문제가 되는 이유는 환경변수를 이용해서 DJANGO_SECRET_KEY와 이번에 사용한 외부 API_KEY를 설정해놨었기 때문입니다.
  • 그래서 이번에는 환경 변수로 setting값을 불러오는 방식이 아닌 json 파일을 이용해서 setting 값을 불러오는 방식으로 변경하여 위와 같은 문제를 해결하였습니다.

(설정파일 예시)

{
  "DJANGO_SECRET_KEY" : "SECRET_KEY",
  "OPEN_API_KEY" : "API_KEY"
}

마치며

이번에는 평소에 구현방법을 알고 있으면 좋겠다 라고 생각하던 기능(배치, 로깅)을 구현해봐서 좋았으며, 이 것을 바탕으로 어떻게 하면 더 고도화 시킬 수 있는지 고민하면 좋을 것 같습니다.

profile
블로그 옮겼습니다 (https://jotasic.github.io)

0개의 댓글