Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Select an option

  • Save WorldException/11c1f4527ba94e2fc48dfc56a52e2fe6 to your computer and use it in GitHub Desktop.

Select an option

Save WorldException/11c1f4527ba94e2fc48dfc56a52e2fe6 to your computer and use it in GitHub Desktop.

Revisions

  1. gmas revised this gist Sep 27, 2015. 1 changed file with 2 additions and 0 deletions.
    2 changes: 2 additions & 0 deletions Logging - SQLite handler
    Original file line number Diff line number Diff line change
    @@ -4,6 +4,8 @@ import sqlite3
    import logging
    import time

    __version__ = "0.1.0"


    initial_sql = """CREATE TABLE IF NOT EXISTS log(
    TimeStamp TEXT,
  2. gmas created this gist Sep 27, 2015.
    87 changes: 87 additions & 0 deletions Logging - SQLite handler
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,87 @@
    from __future__ import absolute_import, division, print_function, unicode_literals

    import sqlite3
    import logging
    import time


    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__
    conn = sqlite3.connect(self.db)
    conn.execute(sql)
    conn.commit() # not efficient, but hopefully thread-safe