Massimo- see revised - this is one model file and now I'm defining the db 
in the constructor, but I get the "Cannot operate on a closed database" 
error immediately. 


import logging
import logging.handlers

class AppHandler(logging.Handler): # Inherit from logging.Handler
    def __init__(self):
         logging.Handler.__init__(self)
 
         self.log_db = DAL('sqlite://log.sqlite')
         self.log_db.define_table('log',
             Field('loggername', 'string'),
             Field('srclineno', 'string'), 
             Field('func', 'string'), 
             Field('level', 'string'), 
             Field('msg', 'string'), 
             Field('type', 'string')
             )

    def emit(self, record):
 
         args = {}
         args['loggername'] = record.name  
         args['srclineno'] = record.lineno
         args['func'] = record.funcName
         args['level'] = record.levelname
         args['msg'] = record.msg
         try:
             args['type'] = record.args[0]
         except:
             args['type'] = None
 
         self.log_db.log.insert(**args)

logger = logging.getLogger("web2py.app.myapp")
logger.setLevel(logging.DEBUG)
logger.addHandler(AppHandler())
logger.debug('test log')




Are you saying I need to make a connection and commit manually? How come 
this isn't required in the normal db.py file's db definition- there we just 
define it and go?

On Friday, May 11, 2012 4:19:22 PM UTC-4, Massimo Di Pierro wrote:
>
> Is this one or two files?
>
> If the model is passing db to the logger then the db is closed when the 
> first request responds.
> The logger must make its own connection to the db and commit
>
> On Friday, 11 May 2012 14:28:22 UTC-5, Yarin wrote:
>>
>> Here is my complete model code for a sqlite logging handler. This works 
>> the first time the program is run, and after that I get an error:
>>
>> <class 'sqlite3.ProgrammingError'> Cannot operate on a closed database.
>>
>>
>> *model mylogging.py:*
>>
>> import logging
>> import logging.handlers
>>
>>
>> class AppHandler(logging.Handler): # Inherit from logging.Handler
>>     def __init__(self):
>>  logging.Handler.__init__(self)
>>  
>>  self._db = db
>>
>>
>>     def emit(self, record):
>>  
>>  args = {}
>>  args['loggername'] = record.name
>>  args['srclineno'] = record.lineno
>>  args['func'] = record.funcName
>>  args['level'] = record.levelname
>>  args['msg'] = record.msg
>>  try:
>>  args['type'] = record.args[0]
>>  except:
>>  args['type'] = None
>>  
>>  self._db.log.insert(**args)
>>
>>
>>
>>
>> log_db = DAL('sqlite://log.sqlite')
>> log_db.define_table('log',
>>  
>>  Field('loggername', 'string'), #unique=True
>>  Field('srclineno', 'string'), 
>>  Field('func', 'string'), 
>>  Field('level', 'string'), 
>>  Field('msg', 'string'), 
>>  Field('type', 'string'),
>>  )
>>
>>
>> import logging
>> logger = logging.getLogger("web2py.app.myapp")
>> logger.setLevel(logging.DEBUG)
>>
>>
>> logger.addHandler(AppHandler(log_db))
>> logger.debug('test log')
>>
>>
>>
>> I don't understand how I'm causing this, as all as im doing is creating a 
>> second db instance and inserting using web2py DAL methods?
>>
>>

Reply via email to