[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

 

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수
64 [python][자료구조] "pdf 취소선 검출" How to identify strike-out text from PDF files using Python 졸리운_곰 2024.07.18 544
63 [python][자료구조] 오픈 소스 Python PDF 파서 라이브러리 file 졸리운_곰 2024.07.16 444
62 [python][자료구조] 벡터화 | Vectorization file 졸리운_곰 2023.12.21 330
61 [python][자료구조] Python의 Loop? NO! , Python의 Vectorization? OK!!! file 졸리운_곰 2023.12.21 473
60 [python][자료구조] Python - MySQL 데이터 추가, 삭제, 업데이트 졸리운_곰 2023.05.13 488
59 [python][자료구조] Python의 JSON - 문자열을 JSON으로 변환하는 방법 졸리운_곰 2023.05.06 456
» [python][자료구조] [Python] Logging to MongoDB (로그 남기기) file 졸리운_곰 2023.03.24 428
57 [python][자료구조] [스파르타 웹 개발 종합] 파이썬으로 크롤링하고 DB에 저장하기(request, bs4, mongoDB 패키지 사용) 졸리운_곰 2023.03.12 461
56 [python][자료구조] [MongoDB] Document Query(조회) – find() 메소드 졸리운_곰 2023.03.08 315
55 [python][자료구조] Python(flask)으로 mongoDB 제어하기 – pymongo file 졸리운_곰 2023.03.08 604
54 [python][자료구조] django sqlite3 MySQL로 전환하기 file 졸리운_곰 2023.03.02 409
53 [python][자료구조] django에서 db.sqlite3 데이터를 mysql로 옮기기 졸리운_곰 2023.03.02 427
52 [python][자료구조] Python - JSON 파일 읽고 쓰는 방법 졸리운_곰 2023.02.04 480
51 [python][자료구조] [인코딩] 유니코드 인코딩 처리 (특히 json 입출력 시) 졸리운_곰 2023.02.04 363
50 [python][자료구조] Dropbox API 사용하기 (with python) 졸리운_곰 2022.12.03 306
49 [Python][자료구조] SQLAlchemy Tutorial(한글) - 2 졸리운_곰 2022.12.03 393
48 [Python]][자료구조] SQLAlchemy Tutorial(한글) - 1 졸리운_곰 2022.12.03 275
47 [python][자료구조] python anaconda 에서 mysql 접속 졸리운_곰 2022.01.25 657
46 [python 자료구조] 림코딩의 파이썬으로 csv 다루기 강좌 (읽기,쓰기,수정,추가) 졸리운_곰 2022.01.16 521
45 python - 읽은 후 kafka 메시지를 삭제하는 방법 졸리운_곰 2021.07.13 900
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED