나는 여태 디버깅할 때나 결과값을 확인할 때
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에서 에러 횟수나 이벤트 횟수 등을 확인할 수 있다.
또 실시간 데이터를 받을 수도 있으면서 기간을 지정하여 받을 수도 있기 때문에 용이하다.
그리고 제일 좋은건 검색이 쉽고 빠른게 좋다..
아무튼 개발할 때 좋은건 다 써보는 걸 추천!