python logging日志输出到mysql数据库

logging的日志输出没有现成的输出到数据库的,然后网上也没找到现成的输出到mysql数据库的,就看了下源码,自己封装了个

实现方法

简单来说,就是写一个类继承logging.Handler,并重写emit方法,我这里是结合sqlalchemy的,如果日志表不存在,会直接在指定数据库创建指定名字的表,也可以在init中采用普通的pymysql的方式创建数据库连接,然后在emit中使用cursor执行sql语句提交

# coding: utf-8
import logging
import pymysql
from sqlalchemy import (Column, DateTime, Integer, MetaData,
                        String, Table, create_engine, text)
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import mapper, sessionmaker

class LoggerHandlerToMysql(logging.Handler):
    def __init__(self, configdb_str, table_name):
        self.config_engine = create_engine(configdb_str)
        self.ConfigSession = sessionmaker(bind = self.config_engine)
        self.config_session = self.ConfigSession()
        metadata = MetaData(self.config_engine)
        log_table = Table(table_name, metadata,
            Column('id', Integer, primary_key = True),
            Column('create_time', DateTime, nullable=False, server_default=text("'0000-00-00 00:00:00.000'")),
            Column('level_name', String(10)),
            Column('message', String(255)),
            Column('splilt_type', String(10)),
            Column('split_base', String(10)),
            Column('exc_info', String(255)),
            Column('exc_text', String(255)),
            Column('file_name', String(100)),
            Column('line_no', Integer),
            Column('func_name', String(255)),
            Column('stack_info', String(255)))
        metadata.create_all(self.config_engine)
        self.LogModel = getModel(table_name, self.config_engine)
        logging.Handler.__init__(self)

    def emit(self,record):
        log_model = self.LogModel()
        log_model.create_time = str(record.asctime).replace(",", ".")
        log_model.level_name = record.levelname
        message = record.message
        message = message.split("---")
        log_model.message = message[0].strip()
        if len(message) > 1:
            log_model.splilt_type = message[1].strip()
        if len(message) > 2:
            log_model.split_base = message[2].strip()
        log_model.exc_info = record.exc_info
        log_model.exc_text = record.exc_text
        log_model.file_name = record.filename
        log_model.line_no = record.lineno
        log_model.func_name = record.funcName
        log_model.stack_info = record.stack_info
        self.config_session.add(log_model)
        self.config_session.commit()
        pass

    def close(self):
        self.config_session.commit()
        self.config_session.close()
        pass

调用方式

    # 数据库连接字符串
    configdb_str = 'mysql+pymysql://%s:%s@%s:%d/%s?charset=%s'%(user, password, host, int(port), db, charset)
    # 表名
    log_to_sql = 'service_log'
    logger = logging.getLogger()
    handler = LoggerHandlerToMysql(configdb_str, log_to_sql)
    logger.addHandler(handler)
  • 0
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
日志记录到数据库通常需要以下步骤: 1. 创建一个日志表,包含需要记录的日志信息字段,如时间、级别、消息等。 2. 在代码中使用数据库连接库连接到数据库,并通过 SQL 语句将日志信息插入到日志表中。 3. 在代码中编写日志记录函数,该函数接收需要记录的日志信息并将其插入到数据库中。 例如,使用 PythonMySQL 数据库实现日志记录到数据库的代码示例如下: ```python import logging import mysql.connector # 创建数据库连接 db = mysql.connector.connect( host="localhost", user="yourusername", password="yourpassword", database="yourdatabase" ) # 创建日志表 cursor = db.cursor() cursor.execute("CREATE TABLE IF NOT EXISTS logs (id INT AUTO_INCREMENT PRIMARY KEY, time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, level VARCHAR(20), message TEXT)") # 日志记录函数 def log_to_database(level, message): cursor = db.cursor() sql = "INSERT INTO logs (level, message) VALUES (%s, %s)" val = (level, message) cursor.execute(sql, val) db.commit() # 使用日志记录函数记录日志 logging.basicConfig(level=logging.INFO) logging.info("This is a message") log_to_database("INFO", "This is a message") ``` 在上面的示例中,我们首先创建了一个名为 `logs` 的日志表。然后,我们定义了一个 `log_to_database` 函数,该函数接收日志级别和消息,并将它们插入到 `logs` 表中。最后,我们使用 Python 的内置 `logging` 模块记录了一个日志,并调用了 `log_to_database` 函数将该日志记录到数据库中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值