Logging
-------
InaSAFE includes a logging subsystem that can be used to:
* record event messages in the QGIS Log Console
* record event messages to a file e.g.
:file:`/tmp/inasafe/10-10-2012/timlinux/logs/inasafe.log`
* record exception details to a Sentry installation available at
http://sentry.linfiniti.com/inasafe/
* email a developer a message when a logging event occurs (currently disabled)
In this section we describe best practices and procedures for logging in
InaSAFE.
Getting and using the named Logger instance
-------------------------------------------
We use the 'InaSAFE' logger instance as standard. It is the responsibility
of each client package (e.g. :samp:`safe_qgis`) to setup the logger - typically
in the :samp:`__init__.py` for the package::
from utilities import setupLogger
setupLogger()
The utility method that sets up the logger will determine which logging
backends are made available. In the :samp:`safe_qgis` package, a number of
different backends are setup in the :funct:`setupLogger` function. The
logger will typically be assigned to a module variable :samp:`LOGGER`.
To actually use the logger in your module you need to do something like this::
import logging
LOGGER = logging.getLogger('InaSAFE')
# And then in your class / method:
LOGGER.debug('Hello world')
Logging exceptions
------------------
It is recommended to log exceptions as per the following example::
try:
1/0
except Exception:
LOGGER.exception('Something went terribly wrong')
The exception log type will cause the full traceback, the exception message
and the message provided to the LOGGER.exception call to all be logged e.g.::
2012-10-10 10:53:54,733 - InaSAFE - ERROR - Something went terribly wrong
Traceback (most recent call last):
File "", line 2, in
ZeroDivisionError: integer division or modulo by zero
The above example was contrived in the QGIS python console. When the exception
originates inside a module, the traceback will include the complete call tree.
Logging in loops
------------------
.. warning::
Please be considerate when logging into loops as this can slow execution a
lot (we had a spatial analysis loop with two logged messages and it took
15sec for 1000 itterations, removing logging brought it to 5sec)
See also :ref:`profiling`
Remote logging
--------------
There is support for logging to a remote server. This currently intended for
developer use only and will provide ongoing statistics about the number and
nature of exceptions taking place in InaSAFE.
.. note:: For privacy / security reasons this is disabled by default and you
need to jump through two hoops to make it work.
The remote server is available here: http://sentry.linfiniti.com/inasafe/
Remote logging is implemented using `raven `_
and `sentry `_. Raven needs to be installed
on the local client. On ubuntu you can install it by doing::
sudo pip install raven
To prevent user's unwittingly sending exception reports, it is required to
first set an environment variable before starting QGIS / running tests::
export INASAFE_SENTRY=1
.. note:: The sentry logger is set to only log exceptions.
Here is an example session which will install raven, enable sentry and then
launch QGIS::
sudo pip install raven
export INASAFE_SENTRY=1
/usr/local/bin/qgis
QGIS Log Messages
-----------------
For the :samp:`safe_qgis` package, log messages will also be written to the
QGIS log console under a tab labelled 'InaSAFE'. You can view these messages by
clicking on the small triangular icon in the bottom right corner of the QGIS
main window.
.. figure:: ../static/log-notifications.png
:align: center
Clicking on the triangle indicated in red above will open the log dock window
in QGIS from where you can browse log messages conveniently.
.. figure:: ../static/log-view.png
:align: center
.. note:: QGIS 1.8 or greater is required for this functionality.
Logging with third party applications
-------------------------------------
If you have written your one SAFE library client, you should set up your own
logger instance - just be sure that it is a named logger (called
:samp:`InaSAFE`) and any log messages from the safe library will be written
to your logger. For inspiration on how to do this, take a look at the
:func:`setupLogger` function in :file:`safe_qgis/utilities.py`.