-
[python] DB에 log 저장하기LOG 2022. 7. 30. 16:24
DatabaseHandler라는 클래스를 만들어
DB에 log를 저장할 수 있도록 만들어 봅시다.
class DatabaseHandler(logging.Handler): def __init__(self): logging.Handler.__init__(self) self.database = 'log.db' self.conn = sqlite3.connect(self.database) self.cur = self.conn.cursor() mk_table_query = ''' CREATE TABLE IF NOT EXISTS log ( id INTEGER PRIMARY KEY AUTOINCREMENT, insertTime TEXT, logLv TEXT, name TEXT, message TEXT ) ''' self.conn.execute(mk_table_query) self.conn.commit()
logging.Handler의 속성을 그대로 상속받는
DatabaseHandler 클래스를 생성합니다.
로그를 저장할 db파일을 지정해주고 연결합니다.
log라는 이름의 테이블과 칼럼들을 생성합니다.
(IF NOT EXISTS : 테이블이 없으면 실행)
def time_format(self, record): self.now = datetime.datetime.now() record.nowstr = self.now.strftime('%d/%b/%Y %H:%M:%S')
logging 모듈에서는 formatter를 이용하여
출력되는 시간값을 설정해 주었습니다.
하지만 DB 입력시에는 formatter를 사용하지 않으므로
위과 같이 함수를 만들어 줍니다.def emit(self, record): self.format(record) self.time_format(record) aaa = record.name+str(record.lineno) insert_db_query = ''' INSERT INTO log ( insertTime, logLv, name, message) VALUES ('{}', '{}', '{}', '{}') '''.format(record.nowstr, record.levelname, aaa, record.message) self.conn.execute(insert_db_query) self.conn.commit()
이벤트 함수(emit)을 정의합니다.
format을 이용하여
칼럼별로 들어갈 내용을 insert해 줍니다.
def __del__(self): try: self.conn.close() except: pass
DB 연결을 종료합니다.
완성된 다음 코드를 실행해 줍니다.
import logging, sqlite3, datetime class DatabaseHandler(logging.Handler): def __init__(self): logging.Handler.__init__(self) self.database = 'log.db' self.conn = sqlite3.connect(self.database) self.cur = self.conn.cursor() mk_table_query = ''' CREATE TABLE IF NOT EXISTS log ( id INTEGER PRIMARY KEY AUTOINCREMENT, insertTime TEXT, logLv TEXT, name TEXT, message TEXT ) ''' self.conn.execute(mk_table_query) self.conn.commit() def time_format(self, record): self.now = datetime.datetime.now() record.nowstr = self.now.strftime('%d/%b/%Y %H:%M:%S') def emit(self, record): self.format(record) self.time_format(record) aaa = record.name+str(record.lineno) insert_db_query = ''' INSERT INTO log ( insertTime, logLv, name, message) VALUES ('{}', '{}', '{}', '{}') '''.format(record.nowstr, record.levelname, aaa, record.message) # 시간, 로그level, 로그이름+번호, 메시지 self.conn.execute(insert_db_query) self.conn.commit() def __del__(self): try: self.conn.close() except: pass if __name__ == '__main__': logger = logging.getLogger('로그이름') # logger name 선언 logger.setLevel(logging.DEBUG) # logger level 설정 sqliteHandler = DatabaseHandler() # database handler 선언 logger.addHandler(sqliteHandler) # database hanlder 추가 logger.info("----------") # info 메세지 작성 logger.info("$$$ start!!!")
DB에 연동하기 성공!
출처 : 데이터베이스 핸들러 사용하기
'LOG' 카테고리의 다른 글
[python] log.text파일 DB에 자동 적재하기 (0) 2022.07.31 [python] logging 모듈 사용하기 (0) 2022.07.30