''' To use the per application log file with rotating file handler in web2py you need to put this file (log.py) into your models folder. The log file itself is created in your_web2py_path/applications/ your_application/app.log Writing into the log file from your controller works as follows: def my_function(): logging.debug('my function abc is starting') logging.error('huston we got a %s problem.' % 'major') return Viewing the log file through your application works as follows: def show_log(): return get_log() If required the GAE solution needs work. A BIG thank you to Iceberg! Feedback and usage is welcome ;-) Important note: do *not* 'import logging' in your controller if you use log.py. its done for all your controllers already in the log.py model and it would break the log.py magic. ''' import logging def _init_log(level=logging.DEBUG,formatter="%(asctime)s %(levelname)s %(funcName)s():%(lineno)d %(message)s",filename='app.log',maxBytes=1024*1024,backupCount=2): import os,logging.handlers logger=logging.getLogger(request.application) logger.setLevel(level) if request.env.web2py_runtime_gae: # if running on Google App Engine handler=logging.handlers.HTTPHandler(request.env.http_host,URL(r=request,f='log')) # assuming there is an optional log action else: handler=logging.handlers.RotatingFileHandler(os.path.join(request.folder,filename),maxBytes=maxBytes,backupCount=backupCount) handler.setLevel(level) handler.setFormatter(logging.Formatter(formatter)) logger.addHandler(handler) logger.debug("web2py application %s starting" % request.application) return logger def get_log(): try: f = open(logging.handlers[0].baseFilename, 'r') c = f.readlines() f.close() return {'log':TABLE(*[TR(str(item)) for item in c])} except: return () logging=cache.ram('mylog',lambda:_init_log(),time_expire=99999999)