[SEQ] 언제까지 sysout, print로 log 확인하나!

Junkyu_Kang·2024년 12월 27일

나는 여태 디버깅할 때나 결과값을 확인할 때
Java에선 sysout, Python에서는 print나 pprint를 사용했다..

이렇게 사용해도 Terminal에서 처리된 데이터를 확인할 수 있으니까!!

근데 이렇게 할 경우 원하는 데이터나 디버깅한 내용을 찾을 수 있지만 원하는 데이터를 더 쉽게 정리하고 찾을 수 있는 방법이 있다!!

seq를 알고 계신가요?

https://hub.docker.com/r/datalust/seq

위 링크를 누르면 seq를 사용할 수 있도록 하는 도커 이미지를 받을 수 있다.

위 내용을 cmd로 받거나, powershell로 받거나.. 뭐 마음대로 하고..
나는 가상환경에 추가했다. 잘쓰이는 건 아니니까..

docker run --name seq -d --restart unless-stopped -e ACCEPT_EULA=Y -p 5341:80 datalust/seq:latest

설치 내용을 확인해보자. 보면 5341:80을 dafault로 port 지정된 걸 확인할 수 있다. 또 컴퓨터가 꺼질 때도 실행되고 멈추지않는다..

다음은 설정으로 가보자

seq의 장점은 편의성이다.

설치를 완료했다면 기본적인 설정 파일을 logger_config.yml로 만들어두자

version: 1

disable_existing_loggers: True

root:
  level: DEBUG
  handlers:
  - seq
  - console

loggers:
  another_logger:
      propagate: False
      level: DEBUG
      handlers:
      - seq
      - console

handlers:
  console:
    class: seqlog.structured_logging.ConsoleStructuredLogHandler

  seq:
    class: seqlog.structured_logging.SeqLogHandler
    formatter: seq

    server_url: 'http://localhost:5341'
    api_key: 'apikey'

    json_encoder_class: json.encoder.JSONEncoder

formatters:
  seq:
    format: |
      {
        "time": "%(asctime)s",
        "level": "%(levelname)s",
        "logger": "%(name)s",
        "message": "%(message)s",
        "function": "%(funcName)s",
        "lineno": %(lineno)d
      }
    datefmt: "%Y-%m-%dT%H:%M:%S"

서버 url과 api key가 필요한 것이 확인된다.

그럼 어떻게 발급받으면 될까?

도커 이미지를 실행시키고 localhost:5341로 접속하면 아래 화면처럼 나온다.

이제 우측 상단 Setting을 클릭한다.


이런 식으로 발급받은 API가 보이고 아래 ADD API KEY를 누르면 새로 받을 수 있다.


위 내용처럼 설정을 선택하여 API 키를 발급 받으면 된다. 재확인이 안되니 반드시 기록해두자.

그리고 그 key를 아까 보여줬던 config.yml 파일에 추가하면 된다.

그리고! 반드시 프로젝트 별로 API key를 바꾸자! 아니면 난리난다!
로그가 막 뒤죽박죽 나와서 지저분해짐!

import seqlog
import logging
import pandas as pd
import time
import datetime, requests
from datetime import datetime

seqlog.configure_from_file('settings/logger_config.yml')

위 내용처럼 seqlog를 import 하고 seqlog에 .configure_from_file로 logger_config.yml의 파일 경로를 넣어준다.

class AdapterEnabler():
    def __init__(self) -> None:
        self.subjects = []
        self.devices = []
        self.subscriptions = {}

        #logging 용
        self.logger = logging.getLogger()

후에는 또 위 내용처럼 Class 초기화 구문에서 self.logger = logging.getLogger()로 선언해주어야 정상 사용이 가능하다.

def print_message(profile):
   global resource_lookup

   # data_to_save = [] 
   with lock:
       found = False
       profile_for = None
       for rsc_type, bus_dict in resource_lookup.items():
           for key, value in bus_dict.items():
               if value == profile[0]:
                   print(f"'{value}' is found under '{key}' in '{rsc_type}'")
                   found = True
                   profile_for = rsc_type
                   break

   logging.info(f"Server received profile at {datetime.now()}: {type(profile[2])}")

이제 사용 방법을 보자.
위 내용은 프로젝트 내부에서 message 내용을 확인하려고 만든 로직이다.
아래를 보면 logging.info로 print 하는 것을 확인할 수 있는데
info 뿐만 아니라 debug, error 등 다양한 로그로 찍을 수 있으니 분리하여 사용하자.

위 내용은 실제 내가 사용하는 logger로 내용은 민감하여 제거하였지만 error와 info, debug 모두 사용되는 걸 확인할 수 있고 dashboard에서 에러 횟수나 이벤트 횟수 등을 확인할 수 있다.

또 실시간 데이터를 받을 수도 있으면서 기간을 지정하여 받을 수도 있기 때문에 용이하다.

그리고 제일 좋은건 검색이 쉽고 빠른게 좋다..

아무튼 개발할 때 좋은건 다 써보는 걸 추천!

profile
강준규

0개의 댓글