[python][자료구조] [Python] Logging to MongoDB (로그 남기기)

파이썬프로그램 실행 중 발생한 로그를 MongoDB에 남기는 방법에 대해 알아보겠습니다.

로그 본연의 목적은 "빠른 검색 및 원인파악" 입니다.

따라서 언제, 어디서, 무엇이 발생했는지 파악할 수 있도록

최대한 세세하게 컬럼으로 나눠서 MongoDB에 기록해보겠습니다.

logging.Handler를 상속받은 MongoHandler 클래스를 정의합니다.

MongoDB 접속정보와 데이터베이스 컬렉션정보를 입력받아 로깅할 핸들러입니다.

[ mongolog.py 파일 ]

 
import logging import datetime class MongoHandler(logging.Handler): def __init__(self, level=logging.NOTSET, host='localhost', port=27017, username=None, password=None, authMechanism='DEFAULT', databaseName='mongolog', collectionName='log', capped=True, size=100000, isCollectionDrop=False, instanceName='default'): import pymongo import platform logging.Handler.__init__(self, level) #// 부모 생성자 호출 self.conn = pymongo.MongoClient(host=host, port=port, #// 몽고클라이언트를 만든다 username=username, password=password, authMechanism='DEFAULT') self.db = self.conn.get_database(databaseName) #// 데이터베이스를 가져온다 #// 데이터베이스 컬렉션을 가져온다 if collectionName in self.db.list_collection_names(): #// 존재한다면 if isCollectionDrop: self.db.drop_collection(collectionName) #// Drop하고 self.collection = self.create_collection(collectionName) #// 다시 만든다 else: #// 가져온다 self.collection = self.db.get_collection(collectionName) else: #// 없다면 self.collection = self.create_collection(collectionName) #// 만든다 self.hostName = platform.node() #// 호스트이름을 저장한다 self.instanceName = instanceName #// 인스턴스이름을 저장한다 def create_collection(self, collectionName): #// 컬렉션이름으로 컬렉션을 만들고 리턴한다 return self.db.create_collection(collectionName, capped=True, #// 고정크기 컬렉션 size=10000000) #// 컬렉션 최대크기지정(단위: bytes) def emit(self, record): self.record = record document = \ { 'when' : datetime.datetime.now(), #// 현재일시 'localhostName': self.hostName, #// 로컬 호스트명 'localInstanceName': self.instanceName, #// 로컬 인스턴스명 'fileName': record.filename, #// 파일명 'processName': record.processName, #// 프로세스명 'threadName': record.threadName, #// 쓰레드명 'functionName': record.funcName, #// 함수명 'levelNumber': record.levelno, #// 로그레벨(ex. 10) 'levelName': record.levelname, #// 로그레벨명(ex. DEBUG) 'message': record.msg, #// 오류 메시지 } self.collection.insert_one(document, bypass_document_validation=False)

Log Name & Log Number Pyramid

Log Name(로그 레벨명)은 가독성이 좋고 Equal 매칭으로 검색하기 좋다.

ex) 로그 레벨명 "경고" 검색하기 ( levelName = "Warning" )

Log Number(로그 레벨)은 2자리 숫자로 일정 레벨 이상 또는 이하를 검색하기 좋다.

ex) 로그 레벨 "경고" 이상 모두 검색하기 ( levelNumber >= 30 )

경축! 아무것도 안하여 에스천사게임즈가 새로운 모습으로 재오픈 하였습니다.
어린이용이며, 설치가 필요없는 브라우저 게임입니다.
https://s1004games.com

위에서 만든 로그 핸들러를 이용해서 실제 오류를 만들어 로깅할 어플리케이션을 만들어보겠습니다.

[ app.py 파일 ]

import logging import traceback from mongolog import MongoHandler #// 직접 만든 Mongo 핸들러 log = logging.getLogger('root') level = logging.DEBUG log.setLevel(level) #// Mongo 접속 정보 (자신의 실습 환경에 맞게 바꿔줍니다) host = 'host.docker.internal' port = 9017 username = 'root' password = 'changeme' authMechanism = 'DEFAULT' #// Mongo 데이터베이스 컬렉션 정보 databaseName = 'mongolog' collectionName = 'log' capped = False size = 100000 isCollectionDrop = True #// Mongo 로깅 핸들러를 만든다 mongoHandler = MongoHandler(level=level, host=host, port=port, username=username, password=password, authMechanism=authMechanism, databaseName=databaseName, collectionName=collectionName, capped=capped, size=size, isCollectionDrop=isCollectionDrop) log.addHandler(mongoHandler) def myfunc(): try: 5/0 except Exception as e: log.debug(traceback.format_exc()) def main(): myfunc() if __name__ == '__main__': main()

파이썬 프로그램을 실행합니다.

$ python app.py

mongoDB에 남겨진 로그를 확인해보겠습니다.

mongolog 데이터베이스 아래 log 컬렉션을 확인하면 아래 로그가 보입니다.

{ _id: ObjectId('5f101ac7f2366ab7021c90b3'), when: ISODate('2020-07-17T19:00:00.114Z'), localhostName: 'f2657126db8f', localInstanceName: 'default', fileName: 'app.py', processName: 'MainProcess', threadName: 'MainThread', functionName: 'myfunc', levelNumber: 10, levelName: 'DEBUG', message: ' Traceback (most recent call last): File "app.py", line 32, in myfunc 5/0 ZeroDivisionError: division by zero ' }

고유한 ID, 로그가 언제, 어디서, 어떤 레벨로, 어떤 메시지가 발생했는지 확인할 수 있습니다.

끝.

[출처] https://m.blog.naver.com/wideeyed/222033147585

 

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수
57 [python 인공지능] Deploy ML models with FastAPI, Docker, and Heroku | Tutorial 졸리운_곰 2025.07.08 467
56 [python 인공지능] [VSCode] VSCode에서 ipynb 파일을 HTML(PDF 등..)로 졸리운_곰 2025.05.27 289
55 [Python 인공지능] [파이썬을 이용한 한글 NLP] 03. 간단한 키워드 추출기 졸리운_곰 2025.01.29 459
54 [Python 인공지능] [ 한글 키워드 시각화 ] 파이썬 python 텍스트 마이닝 한글 ( 워드 클라우드 WordCloud, squrify 트리맵으로 빅데이터 마스터) file 졸리운_곰 2025.01.29 398
53 [Python 인공지능] 기계 학습의 A to Z : IPython notebook과 scikit-learn을 활용한 기계 학습 file 졸리운_곰 2024.08.10 523
52 [python] 인공지능 python : 한글 문서 자동 요약 - lexrank 졸리운_곰 2023.07.06 404
51 [python] 인공지능 katiehouse / django-scikit-learn-tutorial file 졸리운_곰 2023.06.03 664
50 [python] [Anaconda]가상환경 설치,삭제 file 졸리운_곰 2022.12.03 405
49 [python][머신러닝] Scikit-learn Tutorial: Machine Learning in Python file 졸리운_곰 2022.11.29 497
48 [python] 파이썬(sklearn) 사이킷런(sklearn) 기초 졸리운_곰 2022.08.20 321
47 [python] scikit-learn이란 file 졸리운_곰 2022.08.20 455
46 [anaconde3][python] Create environment for tensorflow 1.4 in Anaconda 3 졸리운_곰 2022.07.02 563
45 [python][인공지능] [TensorFlow] Anaconda 가상환경 이용하여 TensorFlow GPU 설치 졸리운_곰 2022.01.20 438
44 [Python 인공지능] TextRank 를 이용한 키워드 추출과 핵심 문장 추출 (구현과 실험) file 졸리운_곰 2021.11.22 597
43 [python][인공지능] FLASK를 이용하여 PYTHON에서 PYTORCH를 REST API로 배포하기 졸리운_곰 2021.03.20 364
42 [python 파이썬] Creating REST API for TensorFlow models file 졸리운_곰 2021.02.01 488
41 [python 파이썬 인공지능] Keras 모델을 REST API로 배포해보기 file 졸리운_곰 2021.02.01 411
40 [파이썬 머신러닝] Scikit-learn 기초 졸리운_곰 2020.01.31 579
39 파이썬으로 간단한 뉴럴 네트워크 만들기 How to Create a Simple Neural Network in Python file 졸리운_곰 2020.01.29 22636
38 Keras를 활용한 주식 가격 예측 file 졸리운_곰 2019.02.25 983
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED