ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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
Designed by Tistory.