简体   繁体   English

如何使用 pymysql 将日志上传到 mysql

[英]How to upload logging to mysql using pymysql

I want to collect and check what errors are occurring, so I am trying to upload log in the database.我想收集并检查发生了什么错误,所以我试图在数据库中上传日志。 I wrote the code to upload the log to mysql by referring to this page.我参考this page编写了将日志上传到mysql的代码。 python logging to database . python 记录到数据库 However, I get the following error.但是,我收到以下错误。 Which part is wrong?哪一部分是错的? Also, if there is another way to easily upload logs in mysql, please let me know.另外,如果mysql有其他方法可以轻松上传日志,请告诉我。

import logging
import time
import pymysql

user = 'test'
passw = '******'
host = 'db'
port = ****
database = '****'
db_tbl_log = 'log'

log_file_path = 'C:\\Users\\Desktop\\test_log.txt'
log_error_level = 'DEBUG'       # LOG error level (file)
log_to_db = True                    # LOG to database?

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 pymysql.Error as e:
            print("error: ", e)
            # print(sql)
            # print('CRITICAL DB ERROR! Logging to database not possible!')
# Main settings for the database logging use

if (log_to_db):
    # Make the connection to database for the logger
    log_conn = pymysql.connect(host=host,
                           port=port,
                           user=user,
                           password=passw,
                           database=database,
                           charset='utf8')
    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)

error: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''2021-02-22 16:52:06')), 'MY_LOGGER')' at line 1")

Don't format SQL statements by yourself, you will miss a lot of cases.不要自己格式化 SQL 语句,你会错过很多情况。 Just pass them as the second parameter:只需将它们作为第二个参数传递:

sql = f'INSERT INTO {self.db_tbl_log} (log_level, log_levelname, log, created_at, created_by) VALUES (%s, %s, %s, %s, %s)'
self.sql_cursor.execute(sql, (record.levelno, record.levelname, self.log_msg, tm, record.name))

%s is placeholder, pymysql will convert given params to valid formats one by one. %s是占位符,pymysql 会将给定的参数一一转换为有效格式。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM