본문 바로가기

프로젝트형 IoT 서비스 개발 4회차/1. 인터페이스 개발

[Day24] 2022-03-02(수) Web Application 5 - django - Logger - 이진만 강사님

728x90

[1] Logger

  1. config/settings.py 파일에 추가

# 로그 파일 저장소 설정
LOG_FILE = os.path.join(BASE_DIR, 'data/mylog.csv')

LOGGING = {
    'version': 1,
    # 기존의 로깅 설정을 비활성화 할 것인가?
    'disable_existing_loggers': False,
    # 포맷터
    # 로그 레코드는 최종적으로 텍스트로 표현됨
    # 이 텍스트의 포맷 형식 정의
    # 여러 포맷 정의 가능
    'formatters': {
        'format1': {
            'format': '[%(asctime)s] %(levelname)s [%(name)s:%(lineno)s] %(message)s',
            'datefmt': '%d/%b/%Y %H:%M:%S'
        },
        'format2': {
            'format': '%(levelname)s %(message)s'
        },
        'format3': {
            'format': '%(asctime)s,%(message)s',
            'datefmt': '%Y-%m-%d-%H-%M-%S'
        }
    },
    # 핸들러
    # 로그 레코드로 무슨 작업을 할 것인지 정의
    # 여러 핸들러 정의 가능
    'handlers': {
        # 로그 파일을 만들어 텍스트로 로그레코드 저장
        'file': {
            'level': 'DEBUG',
            'class': 'logging.FileHandler',
            'filename': LOG_FILE,
            'formatter': 'format3',
        },
        # 콘솔(터미널)에 출력
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
            'formatter': 'format2',
        }
    },
    # 로거
    # 로그 레코드 저장소
    # 로거를 이름별로 정의
    'loggers': {
        'users': {
            'handlers': ['file'],
            'level': 'DEBUG',
        },
        'items': {
            'handlers': ['console'],
            'level': 'DEBUG',
        },
        'iot_file': {
            'handlers': ['file', 'console'],
            'level': 'DEBUG',
        },
    },
}

  2. views_item.py 에 Logger 적용

    - logger = logging.getLogger('iot_file')

      -> iot_file 로 된 logger를 사용

    - logger.debug(obj.name+','+str(obj.price)+','+name)

      -> ( ) 안의 내용으로 message 전송 (string 형식으로 넣어야 함)

    - 아래의 경우, 상품명, 가격, 그리고 로그인 상태에서는 해당 사용자의 이름, 아니면 guest를 저장

@request_mapping("/g/<int:pk>", method="get")
def get(self, request, pk):
    obj = Item.objects.get(id=pk)
    # ----------------logger-------------------
    name = 'guest'
    if request.session['sessionname'] is not None:
        name = request.session['sessionname']
    logger = logging.getLogger('iot_file')
    logger.debug(obj.name+','+str(obj.price)+','+name)
    # -----------------------------------------
    context = {
        'center': 'item/get.html',
        'obj': obj
    };
    return render(request, 'home.html', context)

    - 출력 결과 : data/mylog.csv 에 저장, terminal에 출력

 

[2] IoT 장비 data를 Logger 로 저장

  - Data(온도-temp와 전력량-el)를 IoT 장비에서 받는다고 가정

  1. config/settings.py 파일에 추가

    - IOT_FILE 저장소 추가

    - handlers 에 file2 추가

    - loggers 에 el_file 추가

  IOT_FILE = os.path.join(BASE_DIR, 'data/iotlog.csv')    # IoT 장비에서 받은 데이터 저장소 설정
  
    # 핸들러
    # 로그 레코드로 무슨 작업을 할 것인지 정의
    # 여러 핸들러 정의 가능
    'handlers': {
        # 로그 파일을 만들어 텍스트로 로그레코드 저장
        'file': {
            'level': 'DEBUG',
            'class': 'logging.FileHandler',
            'filename': LOG_FILE,
            'formatter': 'format3',
        },
        'file2': {
            'level': 'DEBUG',
            'class': 'logging.FileHandler',
            'filename': IOT_FILE,
            'formatter': 'format3',
        },
        # 콘솔(터미널)에 출력
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
            'formatter': 'format2',
        }
    },
    # 로거
    # 로그 레코드 저장소
    # 로거를 이름별로 정의
    'loggers': {
        'users': {
            'handlers': ['file'],
            'level': 'DEBUG',
        },
        'items': {
            'handlers': ['console'],
            'level': 'DEBUG',
        },
        'iot_file': {
            'handlers': ['file', 'console'],
            'level': 'DEBUG',
        },
        'el_file': {
            'handlers': ['file2', 'console'],
            'level': 'DEBUG',

  2. views.py 에 Logger 적용

    - 서버로 127.0.0.1/iot 요청이 오는 경우

    - el_file logger 사용

    - id, temp, el (url의 querystring 내부의 key값들, 밑에 설명)를 받아서 저장 및 출력

@request_mapping("/iot", method="get")
def iot(self, request):
    id = request.GET['id']
    temp = request.GET['temp']
    el = request.GET['el']
    # --------------------------------------------
    el_logger = logging.getLogger('el_file')
    el_logger.debug(id+','+temp+','+el)
    # --------------------------------------------
    return render(request, 'ok.html')

  3. IoT 장비로부터 데이터 전송 가정

    - 별도 프로젝트 생성하여 main.py에서 실행(실제로 데이터 받아서 보낼 때의 형식과 다름)

    - url 요청 방법

      ① urllib 를 import

      ② url 변수에 요청 url을 string으로 저장

        - ?(물음표) : querystring 의 시작이라는 의미

        - querystring 안에는 key=value 쌍이 들어가고, 각각의 쌍은 &(엠퍼센트) 로 구분

      ③ url을 서버에 요청 : urllib.request.urlopen(url)

import random
import time
import urllib.request


def send(name):
    for i in range(20):
        id = 'h01'
        temp = random.randint(1, 30)
        el = random.randint(1, 100)
        # http://127.0.0.1/iot?id=h01&temp=10&el=100
        url = 'http://127.0.0.1/iot?id='+id+'&temp='+str(temp)+'&el='+str(el)
        urllib.request.urlopen(url)
        time.sleep(3)


if __name__ == '__main__':
    send('PyCharm')

      - 출력 결과

728x90