복붙노트

[PYTHON] 데이터베이스에 파이썬 로깅

PYTHON

데이터베이스에 파이썬 로깅

나는 파이썬 로거 모듈이 데이터베이스에 로그 할 수있는 방법을 찾고 있으며, db가 다운되었을 때 파일 시스템으로 돌아 간다.

그래서 기본적으로 2 가지 : 로거 로그를 데이터베이스로 보내는 방법과 데이터베이스가 다운되었을 때 로깅을 파일로 만드는 방법.

해결법

  1. ==============================

    1.문제의 데이터베이스로 로그를 전달하는 처리기를 직접 작성하십시오. 실패하면 로거의 핸들러 목록에서 제거 할 수 있습니다. 고장 모드를 다루는 방법은 여러 가지가 있습니다.

    문제의 데이터베이스로 로그를 전달하는 처리기를 직접 작성하십시오. 실패하면 로거의 핸들러 목록에서 제거 할 수 있습니다. 고장 모드를 다루는 방법은 여러 가지가 있습니다.

  2. ==============================

    2.이런 ... 시간이 많이 흘렀지 만, 최근에 필자의 데이터베이스 로거를 파이썬으로 작성했습니다. 내가 어떤 예를 찾을 수 없었기 때문에 나는 여기에 나의 것을 게시 할 것이라고 생각했다. 어쩌면 누군가가 도움이 될 것입니다 :) MS SQL과 작동합니다.

    이런 ... 시간이 많이 흘렀지 만, 최근에 필자의 데이터베이스 로거를 파이썬으로 작성했습니다. 내가 어떤 예를 찾을 수 없었기 때문에 나는 여기에 나의 것을 게시 할 것이라고 생각했다. 어쩌면 누군가가 도움이 될 것입니다 :) MS SQL과 작동합니다.

    데이터베이스 테이블은 다음과 같습니다.

    CREATE TABLE [db_name].[log](
        [id] [bigint] IDENTITY(1,1) NOT NULL,
        [log_level] [int] NULL,
        [log_levelname] [char](32) NULL,
        [log] [char](2048) NOT NULL,
        [created_at] [datetime2](7) NOT NULL,
        [created_by] [char](32) NOT NULL,
    ) ON [PRIMARY]
    

    클래스 자체 :

    class LogDBHandler(logging.Handler):
        '''
        Customized logging handler that puts logs to the database.
        pymssql required
        '''
        def __init__(self, sql_conn, sql_cursor, db_tbl_log):
            logging.Handler.__init__(self)
            self.sql_cursor = sql_cursor
            self.sql_conn = sql_conn
            self.db_tbl_log = db_tbl_log
    
        def emit(self, record):
            # Set current time
            tm = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(record.created))
            # Clear the log message so it can be put to db via sql (escape quotes)
            self.log_msg = record.msg
            self.log_msg = self.log_msg.strip()
            self.log_msg = self.log_msg.replace('\'', '\'\'')
            # Make the SQL insert
            sql = 'INSERT INTO ' + self.db_tbl_log + ' (log_level, ' + \
                'log_levelname, log, created_at, created_by) ' + \
                'VALUES (' + \
                ''   + str(record.levelno) + ', ' + \
                '\'' + str(record.levelname) + '\', ' + \
                '\'' + str(self.log_msg) + '\', ' + \
                '(convert(datetime2(7), \'' + tm + '\')), ' + \
                '\'' + str(record.name) + '\')'
            try:
                self.sql_cursor.execute(sql)
                self.sql_conn.commit()
            # If error - print it out on screen. Since DB is not working - there's
            # no point making a log about it to the database :)
            except pymssql.Error as e:
                print sql
                print 'CRITICAL DB ERROR! Logging to database not possible!'
    

    사용 예 :

    import pymssql
    import time
    import logging
    
    db_server = 'servername'
    db_user = 'db_user'
    db_password = 'db_pass'
    db_dbname = 'db_name'
    db_tbl_log = 'log'
    
    log_file_path = 'C:\\Users\\Yourname\\Desktop\\test_log.txt'
    log_error_level     = 'DEBUG'       # LOG error level (file)
    log_to_db = True                    # LOG to database?
    
    class LogDBHandler(logging.Handler):
        [...]
    
    # Main settings for the database logging use
    if (log_to_db):
        # Make the connection to database for the logger
        log_conn = pymssql.connect(db_server, db_user, db_password, db_dbname, 30)
        log_cursor = log_conn.cursor()
        logdb = LogDBHandler(log_conn, log_cursor, db_tbl_log)
    
    # Set logger
    logging.basicConfig(filename=log_file_path)
    
    # Set db handler for root logger
    if (log_to_db):
        logging.getLogger('').addHandler(logdb)
    # Register MY_LOGGER
    log = logging.getLogger('MY_LOGGER')
    log.setLevel(log_error_level)
    
    # Example variable
    test_var = 'This is test message'
    
    # Log the variable contents as an error
    log.error('This error occurred: %s' % test_var)
    

    위의 코드는 데이터베이스와 파일 모두에 기록됩니다. 파일이 필요하지 않은 경우 'logging.basicConfig (filename = log_file_path)'행을 건너 뛰십시오. 'log'를 사용하여 기록 된 모든 것은 MY_LOGGER로 기록됩니다. 일부 외부 오류 (즉, 가져온 모듈 또는 무언가)가 나타나면 오류가 'root'로 표시됩니다. 'root'로거도 활성화되어 있으며 데이터베이스 처리기를 사용하고 있습니다.

  3. ==============================

    3.log4mongo library를 보셨습니까? https://pypi.python.org/pypi/log4mongo/ Mongo에 대한 핸들을 제공합니다. 대체는 거기에 있지 않지만 추가하기가 상대적으로 쉽다고 생각합니다.

    log4mongo library를 보셨습니까? https://pypi.python.org/pypi/log4mongo/ Mongo에 대한 핸들을 제공합니다. 대체는 거기에 있지 않지만 추가하기가 상대적으로 쉽다고 생각합니다.

  4. ==============================

    4.나는 이것을 다시 파고있다.

    나는 이것을 다시 파고있다.

    SqlAlchemy를 사용하는 솔루션이 있습니다 (피라미드는이 제조법에 필요하지 않습니다) :

    https://docs.pylonsproject.org/projects/pyramid-cookbook/en/latest/logging/sqlalchemy_logger.html

    추가 필드를 추가하여 로깅을 향상시킬 수 있습니다. 다음은 안내서입니다. https://stackoverflow.com/a/17558764/1115187

    이것이 100 % 정확함을 확신하지 못하지만 2 개의 핸들러를 가질 수 있습니다 :

    try-except로 DB 커밋을 마무리하면된다. 그러나 파일에는 모든 로그 항목이 포함되지만 DB 저장에 실패한 항목은 제외됩니다.

  5. ==============================

    5.오래된 질문이지만, 다른 사람들에게 이것을 떨어 뜨린다. 파이썬 로깅을 사용하려면 두 개의 핸들러를 추가 할 수 있습니다. 하나는 파일에 쓰기, 하나는 회전하는 파일 핸들러입니다. 이것은 견고하며 dB가 올라가도 상관없이 수행 할 수 있습니다. 다른 하나는 pymongo 통합과 같은 다른 서비스 / 모듈에 쓸 수 있습니다.

    오래된 질문이지만, 다른 사람들에게 이것을 떨어 뜨린다. 파이썬 로깅을 사용하려면 두 개의 핸들러를 추가 할 수 있습니다. 하나는 파일에 쓰기, 하나는 회전하는 파일 핸들러입니다. 이것은 견고하며 dB가 올라가도 상관없이 수행 할 수 있습니다. 다른 하나는 pymongo 통합과 같은 다른 서비스 / 모듈에 쓸 수 있습니다.

    코드 또는 json에서 핸들러를 설정하는 방법은 logging.config를 참조하십시오.

  6. from https://stackoverflow.com/questions/2314307/python-logging-to-database by cc-by-sa and MIT license