TurboGears relies on the standard Python logging module,
so to add logging to your application simply add the following
lines at the begin of your files:
import logging
log = logging.getLogger(__name__)
Then you can report logging messages with the standard logger
methods: log.warning(), log.info(), log.error(),
log.exception() and so on:
class SimpleController(TGController):
@expose()
def simple(self):
log.debug("My first logged controller!")
return "OK"
Refer to the Python Logger documentation for additional details.
By default TurboGears configures the logging module so that all the
log messages from your application are displayed from DEBUG level
on. So even debug messages will be displayed.
This is specified at the end of the development.ini file.
When starting your application with gearbox it will automatically
load the logging configuration from your development.ini or provided
configuration file.
When you are deploying your application on mod_wsgi or any other environment
that doesn’t rely on gearbox to run the application, remember to load
the logging configuration before creating the actual WSGI application:
APP_CONFIG = "/var/www/myapp/myapp/production.ini"
#Setup logging
import logging.config
logging.config.fileConfig(APP_CONFIG)
#Load the application
from paste.deploy import loadapp
application = loadapp('config:%s' % APP_CONFIG)
Otherwise the logging configuration will be different from the one
available when starting the application with gearbox and you might
end up not seeing logging messages.
In the default configuration all your logging output goes to sys.stderr.
What exactly that is depends on your deployment environment.
In case of mod_wsgi it will be redirected to the Apache ErrorLog,
but in case your environment doesn’t provide a convenient way to
configure output location your can set it up through the development.ini
in the [handler_console] section:
[handler_console]
class = StreamHandler
args = (sys.stderr,)
level = NOTSET
formatter = generic
For example to change it to log to a specific file you can replace the
StreamHandler with a FileHandler:
[handler_console]
class = FileHandler
args = ('application.log', 'a')
level = NOTSET
formatter = generic
Note
Please not that the best practice is not to change the console handler
but creating a new handler and switch the various loggers to it.
The WSGI standard defines a wsgi.errors key in the environment
which can be used to report application errors. As this feature is
only available during a request (when the WSGI environment is provided),
applications won’t usually rely on it, preferring instead the logging
module which is always available.
Please note that many WSGI middlewares will log to it, instead of using the logging module,
such an example is the backlash error reporting middleware used
by TurboGears for its errorware stack.
Setting up wsgi.errors is usually a task that your application server
does for you, and will usually point to the same location sys.stderr points
to. So your wsgi.errors and logging outputs should be available at
the same destination.
In case your deploy environment isn’t setting up wsgi.errors correctly or you
changed the logging output you might have to change where wsgi.errors points too.
This has to be done by code, replacing the environ['wsgi.errors'] key,
on every request, with a stream object.
Being it sys.stderr or something else.
It is usually best practice to leave both the logging output on sys.stderr and
wsgi.errors as is, as they will usually end up at the same location on most
application servers. Then you can tune the output from the application server
configuration itself.
In case of gearbox serve, wsgi.errors will point to sys.stderr which is then
redirected to a logfile, if provided with the --log-file option.
In case of mod_wsgi they will both point to the Apache ErrorLog file so you
can tune your whole logging output configuration from Apache itself.