· 6 years ago · Sep 08, 2019, 05:44 AM
1from __future__ import absolute_import, division, print_function, unicode_literals
2
3import sqlite3
4import logging
5import time
6
7__version__ = "0.1.0"
8
9
10initial_sql = """CREATE TABLE IF NOT EXISTS log(
11 TimeStamp TEXT,
12 Source TEXT,
13 LogLevel INT,
14 LogLevelName TEXT,
15 Message TEXT,
16 Args TEXT,
17 Module TEXT,
18 FuncName TEXT,
19 LineNo INT,
20 Exception TEXT,
21 Process INT,
22 Thread TEXT,
23 ThreadName TEXT
24 )"""
25
26insertion_sql = """INSERT INTO log(
27 TimeStamp,
28 Source,
29 LogLevel,
30 LogLevelName,
31 Message,
32 Args,
33 Module,
34 FuncName,
35 LineNo,
36 Exception,
37 Process,
38 Thread,
39 ThreadName
40 )
41 VALUES (
42 '%(dbtime)s',
43 '%(name)s',
44 %(levelno)d,
45 '%(levelname)s',
46 '%(msg)s',
47 '%(args)s',
48 '%(module)s',
49 '%(funcName)s',
50 %(lineno)d,
51 '%(exc_text)s',
52 %(process)d,
53 '%(thread)s',
54 '%(threadName)s'
55 );
56 """
57
58
59class SQLiteHandler(logging.Handler):
60 """
61 Thread-safe logging handler for SQLite.
62 """
63
64 def __init__(self, db='app.db'):
65 logging.Handler.__init__(self)
66 self.db = db
67 conn = sqlite3.connect(self.db)
68 conn.execute(initial_sql)
69 conn.commit()
70
71 def format_time(self, record):
72 """
73 Create a time stamp
74 """
75 record.dbtime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(record.created))
76
77 def emit(self, record):
78 self.format(record)
79 self.format_time(record)
80 if record.exc_info: # for exceptions
81 record.exc_text = logging._defaultFormatter.formatException(record.exc_info)
82 else:
83 record.exc_text = ""
84
85 # Insert the log record
86 sql = insertion_sql % record.__dict__
87 conn = sqlite3.connect(self.db)
88 conn.execute(sql)
89 conn.commit() # not efficient, but hopefully thread-safe