5.0 KiB
Logging
Pecan hooks into the Python standard library's logging
module by passing logging configuration options into the logging.config.dictConfig
function. The full documentation for the dictConfig
format is the best source of information for logging configuration, but
to get you started, this chapter will provide you with a few simple
examples.
Configuring Logging
Sample logging configuration is provided with the quickstart project
introduced in quick_start:
$ pecan create myapp
# myapp/config.py
app = { ... }
server = { ... }
logging = {
'loggers': {
'root' : {'level': 'INFO', 'handlers': ['console']},
'myapp': {'level': 'DEBUG', 'handlers': ['console']}
},
'handlers': {
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
'formatter': 'simple'
}
},
'formatters': {
'simple': {
'format': ('%(asctime)s %(levelname)-5.5s [%(name)s]'
'[%(threadName)s] %(message)s')
}
}
}
This configuration defines one handler:
consolelogs messages tostderrusing thesimpleformatter.
...and two loggers.
myapplogs messages sent at a level above or equal toDEBUGto theconsolehandlerrootlogs messages at a level above or equal to theINFOlevel to theconsolehandler
Writing Logs in Your Application
The logger named myapp is reserved for your usage in
your Pecan application.
Once you have configured your logging, you can place logging calls in your code. Using the logging framework is very simple. Here’s an example:
# myapp/myapp/controllers/root.py
from pecan import expose
logger = logging.getLogger(__name__)
class RootController(object):
@expose()
def index(self):
if bad_stuff():
logger.error('Uh-oh!')
return dict()
Writing Logs to Files and Other Locations
Python's logging library defines a variety of handlers
that assist in writing logs to file. A few interesting ones are:
FileHandler_ - used to log messages to a file on the filesystemRotatingFileHandler_ - similar toFileHandler_, but also rotates logs periodicallySysLogHandler_ - used to log messages to a UNIX syslogSMTPHandler_ - used to log messages to an email address via SMTP
Using any of them is as simple as defining a new handler in your
application's logging block and assigning it to one of more
loggers.
Logging Requests with Paste Translogger
Paste (which is not included
with Pecan) includes the TransLogger
middleware for logging requests in Apache
Combined Log Format. Combined with file-based logging, TransLogger
can be used to create an access.log file similar to
Apache.
To add this middleware, modify your the setup_app method
in your project's app.py as follows:
# myapp/myapp/app.py
from pecan import make_app
from paste.translogger import TransLogger
def setup_app(config):
# ...
app = make_app(
config.app.root
# ...
)
app = TransLogger(app, setup_console_handler=False)
return app
By default, TransLogger creates a logger named
wsgi, so you'll need to specify a new (file-based) handler
for this logger in our Pecan configuration file:
# myapp/config.py
app = { ... }
server = { ... }
logging = {
'loggers': {
# ...
'wsgi': {'level': 'INFO', 'handlers': ['logfile'], 'qualname': 'wsgi'}
},
'handlers': {
# ...
'logfile': {
'class': 'logging.FileHandler',
'filename': '/etc/access.log',
'level': 'INFO',
'formatter': 'messageonly'
}
},
'formatters': {
# ...
'messageonly': {'format': '%(message)s'}
}
}