Skip to content

Instantly share code, notes, and snippets.

@gormih
Forked from giumas/Logging - SQLite handler
Last active January 20, 2022 08:45
Show Gist options
  • Save gormih/09d18e7da67271b79b6cb3537ebfa4f3 to your computer and use it in GitHub Desktop.
Save gormih/09d18e7da67271b79b6cb3537ebfa4f3 to your computer and use it in GitHub Desktop.
A minimal SQLite handler for the python logging module
import sqlite3
import logging
import time
__version__ = "0.2.0"
initial_sql = """CREATE TABLE IF NOT EXISTS log(
TimeStamp TEXT,
Source TEXT,
LogLevel INT,
LogLevelName TEXT,
Message TEXT,
Args TEXT,
Module TEXT,
FuncName TEXT,
LineNo INT,
Exception TEXT,
Process INT,
Thread TEXT,
ThreadName TEXT
)"""
insertion_sql = """INSERT INTO log(
TimeStamp,
Source,
LogLevel,
LogLevelName,
Message,
Args,
Module,
FuncName,
LineNo,
Exception,
Process,
Thread,
ThreadName
)
VALUES (
'%(dbtime)s',
'%(name)s',
%(levelno)d,
'%(levelname)s',
'%(msg)s',
'%(args)s',
'%(module)s',
'%(funcName)s',
%(lineno)d,
'%(exc_text)s',
%(process)d,
'%(thread)s',
'%(threadName)s'
);
"""
class SQLiteHandler(logging.Handler):
"""
Thread-safe logging handler for SQLite.
"""
def __init__(self, db='app.db'):
logging.Handler.__init__(self)
self.db = db
conn = sqlite3.connect(self.db)
conn.execute(initial_sql)
conn.commit()
def format_time(self, record):
"""
Create a time stamp
"""
record.dbtime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(record.created))
def emit(self, record):
self.format(record)
self.format_time(record)
if record.exc_info: # for exceptions
record.exc_text = logging._defaultFormatter.formatException(record.exc_info)
else:
record.exc_text = ""
# Insert the log record
sql = insertion_sql % record.__dict__
with sqlite3.connect(self.db) as conn:
conn.execute(sql)
conn.commit() # not efficient, but hopefully thread-safe
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment