\section{\module{logging} ---
         Logging facility for Python}

\declaremodule{standard}{logging}

% These apply to all modules, and may be given more than once:

\moduleauthor{Vinay Sajip}{vinay_sajip@red-dove.com}
\sectionauthor{Vinay Sajip}{vinay_sajip@red-dove.com}

\modulesynopsis{Logging module for Python based on \pep{282}.}

\indexii{Errors}{logging}

\versionadded{2.3}
This module defines functions and classes which implement a flexible
error logging system for applications.

Logging is performed by calling methods on instances of the
\class{Logger} class (hereafter called \dfn{loggers}). Each instance has a
name, and they are conceptually arranged in a name space hierarchy
using dots (periods) as separators. For example, a logger named
"scan" is the parent of loggers "scan.text", "scan.html" and "scan.pdf".
Logger names can be anything you want, and indicate the area of an
application in which a logged message originates.

Logged messages also have levels of importance associated with them.
The default levels provided are \constant{DEBUG}, \constant{INFO},
\constant{WARNING}, \constant{ERROR} and \constant{CRITICAL}. As a
convenience, you indicate the importance of a logged message by calling
an appropriate method of \class{Logger}. The methods are
\method{debug()}, \method{info()}, \method{warning()}, \method{error()} and
\method{critical()}, which mirror the default levels. You are not
constrained to use these levels: you can specify your own and use a
more general \class{Logger} method, \method{log()}, which takes an
explicit level argument.

The numeric values of logging levels are given in the following table. These
are primarily of interest if you want to define your own levels, and need
them to have specific values relative to the predefined levels. If you
define a level with the same numeric value, it overwrites the predefined
value; the predefined name is lost.

\begin{tableii}{l|l}{code}{Level}{Numeric value}
  \lineii{CRITICAL}{50}
  \lineii{ERROR}{40}
  \lineii{WARNING}{30}
  \lineii{INFO}{20}
  \lineii{DEBUG}{10}
  \lineii{NOTSET}{0}
\end{tableii}

Levels can also be associated with loggers, being set either by the
developer or through loading a saved logging configuration. When a
logging method is called on a logger, the logger compares its own
level with the level associated with the method call. If the logger's
level is higher than the method call's, no logging message is actually
generated. This is the basic mechanism controlling the verbosity of
logging output.

Logging messages are encoded as instances of the \class{LogRecord} class.
When a logger decides to actually log an event, a \class{LogRecord}
instance is created from the logging message.

Logging messages are subjected to a dispatch mechanism through the
use of \dfn{handlers}, which are instances of subclasses of the
\class{Handler} class. Handlers are responsible for ensuring that a logged
message (in the form of a \class{LogRecord}) ends up in a particular
location (or set of locations) which is useful for the target audience for
that message (such as end users, support desk staff, system administrators,
developers). Handlers are passed \class{LogRecord} instances intended for
particular destinations. Each logger can have zero, one or more handlers
associated with it (via the \method{addHandler()} method of \class{Logger}).
In addition to any handlers directly associated with a logger,
\emph{all handlers associated with all ancestors of the logger} are
called to dispatch the message.

Just as for loggers, handlers can have levels associated with them.
A handler's level acts as a filter in the same way as a logger's level does.
If a handler decides to actually dispatch an event, the \method{emit()} method
is used to send the message to its destination. Most user-defined subclasses
of \class{Handler} will need to override this \method{emit()}.

In addition to the base \class{Handler} class, many useful subclasses
are provided:

\begin{enumerate}

\item \class{StreamHandler} instances send error messages to
streams (file-like objects).

\item \class{FileHandler} instances send error messages to disk
files.

\item \class{BaseRotatingHandler} is the base class for handlers that
rotate log files at a certain point. It is not meant to be  instantiated
directly. Instead, use \class{RotatingFileHandler} or
\class{TimedRotatingFileHandler}.

\item \class{RotatingFileHandler} instances send error messages to disk
files, with support for maximum log file sizes and log file rotation.

\item \class{TimedRotatingFileHandler} instances send error messages to
disk files rotating the log file at certain timed intervals.

\item \class{SocketHandler} instances send error messages to
TCP/IP sockets.

\item \class{DatagramHandler} instances send error messages to UDP
sockets.

\item \class{SMTPHandler} instances send error messages to a
designated email address.

\item \class{SysLogHandler} instances send error messages to a
\UNIX{} syslog daemon, possibly on a remote machine.

\item \class{NTEventLogHandler} instances send error messages to a
Windows NT/2000/XP event log.

\item \class{MemoryHandler} instances send error messages to a
buffer in memory, which is flushed whenever specific criteria are
met.

\item \class{HTTPHandler} instances send error messages to an
HTTP server using either \samp{GET} or \samp{POST} semantics.

\end{enumerate}

The \class{StreamHandler} and \class{FileHandler} classes are defined
in the core logging package. The other handlers are defined in a sub-
module, \module{logging.handlers}. (There is also another sub-module,
\module{logging.config}, for configuration functionality.)

Logged messages are formatted for presentation through instances of the
\class{Formatter} class. They are initialized with a format string
suitable for use with the \% operator and a dictionary.

For formatting multiple messages in a batch, instances of
\class{BufferingFormatter} can be used. In addition to the format string
(which is applied to each message in the batch), there is provision for
header and trailer format strings.

When filtering based on logger level and/or handler level is not enough,
instances of \class{Filter} can be added to both \class{Logger} and
\class{Handler} instances (through their \method{addFilter()} method).
Before deciding to process a message further, both loggers and handlers
consult all their filters for permission. If any filter returns a false
value, the message is not processed further.

The basic \class{Filter} functionality allows filtering by specific logger
name. If this feature is used, messages sent to the named logger and its
children are allowed through the filter, and all others dropped.

In addition to the classes described above, there are a number of module-
level functions.

\begin{funcdesc}{getLogger}{\optional{name}}
Return a logger with the specified name or, if no name is specified, return
a logger which is the root logger of the hierarchy. If specified, the name
is typically a dot-separated hierarchical name like \var{"a"}, \var{"a.b"}
or \var{"a.b.c.d"}. Choice of these names is entirely up to the developer
who is using logging.

All calls to this function with a given name return the same logger instance.
This means that logger instances never need to be passed between different
parts of an application.
\end{funcdesc}

\begin{funcdesc}{getLoggerClass}{}
Return either the standard \class{Logger} class, or the last class passed to
\function{setLoggerClass()}. This function may be called from within a new
class definition, to ensure that installing a customised \class{Logger} class
will not undo customisations already applied by other code. For example:

\begin{verbatim}
 class MyLogger(logging.getLoggerClass()):
     # ... override behaviour here
\end{verbatim}

\end{funcdesc}

\begin{funcdesc}{debug}{msg\optional{, *args\optional{, **kwargs}}}
Logs a message with level \constant{DEBUG} on the root logger.
The \var{msg} is the message format string, and the \var{args} are the
arguments which are merged into \var{msg} using the string formatting
operator. (Note that this means that you can use keywords in the
format string, together with a single dictionary argument.)

There are two keyword arguments in \var{kwargs} which are inspected:
\var{exc_info} which, if it does not evaluate as false, causes exception
information to be added to the logging message. If an exception tuple (in the
format returned by \function{sys.exc_info()}) is provided, it is used;
otherwise, \function{sys.exc_info()} is called to get the exception
information.

The other optional keyword argument is \var{extra} which can be used to pass
a dictionary which is used to populate the __dict__ of the LogRecord created
for the logging event with user-defined attributes. These custom attributes
can then be used as you like. For example, they could be incorporated into
logged messages. For example:

\begin{verbatim}
 FORMAT = "%(asctime)-15s %(clientip)s %(user)-8s %(message)s"
 logging.basicConfig(format=FORMAT)
 dict = { 'clientip' : '192.168.0.1', 'user' : 'fbloggs' }
 logging.warning("Protocol problem: %s", "connection reset", extra=d)
\end{verbatim}

would print something like
\begin{verbatim}
2006-02-08 22:20:02,165 192.168.0.1 fbloggs  Protocol problem: connection reset
\end{verbatim}

The keys in the dictionary passed in \var{extra} should not clash with the keys
used by the logging system. (See the \class{Formatter} documentation for more
information on which keys are used by the logging system.)

If you choose to use these attributes in logged messages, you need to exercise
some care. In the above example, for instance, the \class{Formatter} has been
set up with a format string which expects 'clientip' and 'user' in the
attribute dictionary of the LogRecord. If these are missing, the message will
not be logged because a string formatting exception will occur. So in this
case, you always need to pass the \var{extra} dictionary with these keys.

While this might be annoying, this feature is intended for use in specialized
circumstances, such as multi-threaded servers where the same code executes
in many contexts, and interesting conditions which arise are dependent on this
context (such as remote client IP address and authenticated user name, in the
above example). In such circumstances, it is likely that specialized
\class{Formatter}s would be used with particular \class{Handler}s.
\end{funcdesc}

\begin{funcdesc}{info}{msg\optional{, *args\optional{, **kwargs}}}
Logs a message with level \constant{INFO} on the root logger.
The arguments are interpreted as for \function{debug()}.
\end{funcdesc}

\begin{funcdesc}{warning}{msg\optional{, *args\optional{, **kwargs}}}
Logs a message with level \constant{WARNING} on the root logger.
The arguments are interpreted as for \function{debug()}.
\end{funcdesc}

\begin{funcdesc}{error}{msg\optional{, *args\optional{, **kwargs}}}
Logs a message with level \constant{ERROR} on the root logger.
The arguments are interpreted as for \function{debug()}.
\end{funcdesc}

\begin{funcdesc}{critical}{msg\optional{, *args\optional{, **kwargs}}}
Logs a message with level \constant{CRITICAL} on the root logger.
The arguments are interpreted as for \function{debug()}.
\end{funcdesc}

\begin{funcdesc}{exception}{msg\optional{, *args}}
Logs a message with level \constant{ERROR} on the root logger.
The arguments are interpreted as for \function{debug()}. Exception info
is added to the logging message. This function should only be called
from an exception handler.
\end{funcdesc}

\begin{funcdesc}{log}{level, msg\optional{, *args\optional{, **kwargs}}}
Logs a message with level \var{level} on the root logger.
The other arguments are interpreted as for \function{debug()}.
\end{funcdesc}

\begin{funcdesc}{disable}{lvl}
Provides an overriding level \var{lvl} for all loggers which takes
precedence over the logger's own level. When the need arises to
temporarily throttle logging output down across the whole application,
this function can be useful.
\end{funcdesc}

\begin{funcdesc}{addLevelName}{lvl, levelName}
Associates level \var{lvl} with text \var{levelName} in an internal
dictionary, which is used to map numeric levels to a textual
representation, for example when a \class{Formatter} formats a message.
This function can also be used to define your own levels. The only
constraints are that all levels used must be registered using this
function, levels should be positive integers and they should increase
in increasing order of severity.
\end{funcdesc}

\begin{funcdesc}{getLevelName}{lvl}
Returns the textual representation of logging level \var{lvl}. If the
level is one of the predefined levels \constant{CRITICAL},
\constant{ERROR}, \constant{WARNING}, \constant{INFO} or \constant{DEBUG}
then you get the corresponding string. If you have associated levels
with names using \function{addLevelName()} then the name you have associated
with \var{lvl} is returned. If a numeric value corresponding to one of the
defined levels is passed in, the corresponding string representation is
returned. Otherwise, the string "Level \%s" \% lvl is returned.
\end{funcdesc}

\begin{funcdesc}{makeLogRecord}{attrdict}
Creates and returns a new \class{LogRecord} instance whose attributes are
defined by \var{attrdict}. This function is useful for taking a pickled
\class{LogRecord} attribute dictionary, sent over a socket, and reconstituting
it as a \class{LogRecord} instance at the receiving end.
\end{funcdesc}

\begin{funcdesc}{basicConfig}{\optional{**kwargs}}
Does basic configuration for the logging system by creating a
\class{StreamHandler} with a default \class{Formatter} and adding it to
the root logger. The functions \function{debug()}, \function{info()},
\function{warning()}, \function{error()} and \function{critical()} will call
\function{basicConfig()} automatically if no handlers are defined for the
root logger.

\versionchanged[Formerly, \function{basicConfig} did not take any keyword
arguments]{2.4}

The following keyword arguments are supported.

\begin{tableii}{l|l}{code}{Format}{Description}
\lineii{filename}{Specifies that a FileHandler be created, using the
specified filename, rather than a StreamHandler.}
\lineii{filemode}{Specifies the mode to open the file, if filename is
specified (if filemode is unspecified, it defaults to 'a').}
\lineii{format}{Use the specified format string for the handler.}
\lineii{datefmt}{Use the specified date/time format.}
\lineii{level}{Set the root logger level to the specified level.}
\lineii{stream}{Use the specified stream to initialize the StreamHandler.
Note that this argument is incompatible with 'filename' - if both
are present, 'stream' is ignored.}
\end{tableii}

\end{funcdesc}

\begin{funcdesc}{shutdown}{}
Informs the logging system to perform an orderly shutdown by flushing and
closing all handlers.
\end{funcdesc}

\begin{funcdesc}{setLoggerClass}{klass}
Tells the logging system to use the class \var{klass} when instantiating a
logger. The class should define \method{__init__()} such that only a name
argument is required, and the \method{__init__()} should call
\method{Logger.__init__()}. This function is typically called before any
loggers are instantiated by applications which need to use custom logger
behavior.
\end{funcdesc}


\begin{seealso}
  \seepep{282}{A Logging System}
         {The proposal which described this feature for inclusion in
          the Python standard library.}
  \seelink{http://www.red-dove.com/python_logging.html}
          {Original Python \module{logging} package}
          {This is the original source for the \module{logging}
           package.  The version of the package available from this
           site is suitable for use with Python 1.5.2, 2.1.x and 2.2.x,
           which do not include the \module{logging} package in the standard
           library.}
\end{seealso}


\subsection{Logger Objects}

Loggers have the following attributes and methods. Note that Loggers are
never instantiated directly, but always through the module-level function
\function{logging.getLogger(name)}.

\begin{datadesc}{propagate}
If this evaluates to false, logging messages are not passed by this
logger or by child loggers to higher level (ancestor) loggers. The
constructor sets this attribute to 1.
\end{datadesc}

\begin{methoddesc}{setLevel}{lvl}
Sets the threshold for this logger to \var{lvl}. Logging messages
which are less severe than \var{lvl} will be ignored. When a logger is
created, the level is set to \constant{NOTSET} (which causes all messages
to be processed when the logger is the root logger, or delegation to the
parent when the logger is a non-root logger). Note that the root logger
is created with level \constant{WARNING}.

The term "delegation to the parent" means that if a logger has a level
of NOTSET, its chain of ancestor loggers is traversed until either an
ancestor with a level other than NOTSET is found, or the root is
reached.

If an ancestor is found with a level other than NOTSET, then that
ancestor's level is treated as the effective level of the logger where
the ancestor search began, and is used to determine how a logging
event is handled.

If the root is reached, and it has a level of NOTSET, then all
messages will be processed. Otherwise, the root's level will be used
as the effective level.
\end{methoddesc}

\begin{methoddesc}{isEnabledFor}{lvl}
Indicates if a message of severity \var{lvl} would be processed by
this logger.  This method checks first the module-level level set by
\function{logging.disable(lvl)} and then the logger's effective level as
determined by \method{getEffectiveLevel()}.
\end{methoddesc}

\begin{methoddesc}{getEffectiveLevel}{}
Indicates the effective level for this logger. If a value other than
\constant{NOTSET} has been set using \method{setLevel()}, it is returned.
Otherwise, the hierarchy is traversed towards the root until a value
other than \constant{NOTSET} is found, and that value is returned.
\end{methoddesc}

\begin{methoddesc}{debug}{msg\optional{, *args\optional{, **kwargs}}}
Logs a message with level \constant{DEBUG} on this logger.
The \var{msg} is the message format string, and the \var{args} are the
arguments which are merged into \var{msg} using the string formatting
operator. (Note that this means that you can use keywords in the
format string, together with a single dictionary argument.)

There are two keyword arguments in \var{kwargs} which are inspected:
\var{exc_info} which, if it does not evaluate as false, causes exception
information to be added to the logging message. If an exception tuple (in the
format returned by \function{sys.exc_info()}) is provided, it is used;
otherwise, \function{sys.exc_info()} is called to get the exception
information.

The other optional keyword argument is \var{extra} which can be used to pass
a dictionary which is used to populate the __dict__ of the LogRecord created
for the logging event with user-defined attributes. These custom attributes
can then be used as you like. For example, they could be incorporated into
logged messages. For example:

\begin{verbatim}
 FORMAT = "%(asctime)-15s %(clientip)s %(user)-8s %(message)s"
 logging.basicConfig(format=FORMAT)
 dict = { 'clientip' : '192.168.0.1', 'user' : 'fbloggs' }
 logger = logging.getLogger("tcpserver")
 logger.warning("Protocol problem: %s", "connection reset", extra=d)
\end{verbatim}

would print something like
\begin{verbatim}
2006-02-08 22:20:02,165 192.168.0.1 fbloggs  Protocol problem: connection reset
\end{verbatim}

The keys in the dictionary passed in \var{extra} should not clash with the keys
used by the logging system. (See the \class{Formatter} documentation for more
information on which keys are used by the logging system.)

If you choose to use these attributes in logged messages, you need to exercise
some care. In the above example, for instance, the \class{Formatter} has been
set up with a format string which expects 'clientip' and 'user' in the
attribute dictionary of the LogRecord. If these are missing, the message will
not be logged because a string formatting exception will occur. So in this
case, you always need to pass the \var{extra} dictionary with these keys.

While this might be annoying, this feature is intended for use in specialized
circumstances, such as multi-threaded servers where the same code executes
in many contexts, and interesting conditions which arise are dependent on this
context (such as remote client IP address and authenticated user name, in the
above example). In such circumstances, it is likely that specialized
\class{Formatter}s would be used with particular \class{Handler}s.
\end{methoddesc}

\begin{methoddesc}{info}{msg\optional{, *args\optional{, **kwargs}}}
Logs a message with level \constant{INFO} on this logger.
The arguments are interpreted as for \method{debug()}.
\end{methoddesc}

\begin{methoddesc}{warning}{msg\optional{, *args\optional{, **kwargs}}}
Logs a message with level \constant{WARNING} on this logger.
The arguments are interpreted as for \method{debug()}.
\end{methoddesc}

\begin{methoddesc}{error}{msg\optional{, *args\optional{, **kwargs}}}
Logs a message with level \constant{ERROR} on this logger.
The arguments are interpreted as for \method{debug()}.
\end{methoddesc}

\begin{methoddesc}{critical}{msg\optional{, *args\optional{, **kwargs}}}
Logs a message with level \constant{CRITICAL} on this logger.
The arguments are interpreted as for \method{debug()}.
\end{methoddesc}

\begin{methoddesc}{log}{lvl, msg\optional{, *args\optional{, **kwargs}}}
Logs a message with integer level \var{lvl} on this logger.
The other arguments are interpreted as for \method{debug()}.
\end{methoddesc}

\begin{methoddesc}{exception}{msg\optional{, *args}}
Logs a message with level \constant{ERROR} on this logger.
The arguments are interpreted as for \method{debug()}. Exception info
is added to the logging message. This method should only be called
from an exception handler.
\end{methoddesc}

\begin{methoddesc}{addFilter}{filt}
Adds the specified filter \var{filt} to this logger.
\end{methoddesc}

\begin{methoddesc}{removeFilter}{filt}
Removes the specified filter \var{filt} from this logger.
\end{methoddesc}

\begin{methoddesc}{filter}{record}
Applies this logger's filters to the record and returns a true value if
the record is to be processed.
\end{methoddesc}

\begin{methoddesc}{addHandler}{hdlr}
Adds the specified handler \var{hdlr} to this logger.
\end{methoddesc}

\begin{methoddesc}{removeHandler}{hdlr}
Removes the specified handler \var{hdlr} from this logger.
\end{methoddesc}

\begin{methoddesc}{findCaller}{}
Finds the caller's source filename and line number. Returns the filename
and line number as a 2-element tuple.
\end{methoddesc}

\begin{methoddesc}{handle}{record}
Handles a record by passing it to all handlers associated with this logger
and its ancestors (until a false value of \var{propagate} is found).
This method is used for unpickled records received from a socket, as well
as those created locally. Logger-level filtering is applied using
\method{filter()}.
\end{methoddesc}

\begin{methoddesc}{makeRecord}{name, lvl, fn, lno, msg, args, exc_info,
                               func, extra}
This is a factory method which can be overridden in subclasses to create
specialized \class{LogRecord} instances.
\versionchanged[\var{func} and \var{extra} were added]{2.5}
\end{methoddesc}

\subsection{Basic example \label{minimal-example}}

\versionchanged[formerly \function{basicConfig} did not take any keyword
arguments]{2.4}

The \module{logging} package provides a lot of flexibility, and its
configuration can appear daunting.  This section demonstrates that simple
use of the logging package is possible.

The simplest example shows logging to the console:

\begin{verbatim}
import logging

logging.debug('A debug message')
logging.info('Some information')
logging.warning('A shot across the bows')
\end{verbatim}

If you run the above script, you'll see this:
\begin{verbatim}
WARNING:root:A shot across the bows
\end{verbatim}

Because no particular logger was specified, the system used the root logger.
The debug and info messages didn't appear because by default, the root
logger is configured to only handle messages with a severity of WARNING
or above. The message format is also a configuration default, as is the output
destination of the messages - \code{sys.stderr}. The severity level,
the message format and destination can be easily changed, as shown in
the example below:

\begin{verbatim}
import logging

logging.basicConfig(level=logging.DEBUG,
                    format='%(asctime)s %(levelname)s %(message)s',
                    filename='/tmp/myapp.log',
                    filemode='w')
logging.debug('A debug message')
logging.info('Some information')
logging.warning('A shot across the bows')
\end{verbatim}

The \method{basicConfig()} method is used to change the configuration
defaults, which results in output (written to \code{/tmp/myapp.log})
which should look something like the following:

\begin{verbatim}
2004-07-02 13:00:08,743 DEBUG A debug message
2004-07-02 13:00:08,743 INFO Some information
2004-07-02 13:00:08,743 WARNING A shot across the bows
\end{verbatim}

This time, all messages with a severity of DEBUG or above were handled,
and the format of the messages was also changed, and output went to the
specified file rather than the console.

Formatting uses standard Python string formatting - see section
\ref{typesseq-strings}. The format string takes the following
common specifiers. For a complete list of specifiers, consult the
\class{Formatter} documentation.

\begin{tableii}{l|l}{code}{Format}{Description}
\lineii{\%(name)s}     {Name of the logger (logging channel).}
\lineii{\%(levelname)s}{Text logging level for the message
                        (\code{'DEBUG'}, \code{'INFO'},
                        \code{'WARNING'}, \code{'ERROR'},
                        \code{'CRITICAL'}).}
\lineii{\%(asctime)s}  {Human-readable time when the \class{LogRecord}
                        was created.  By default this is of the form
                        ``2003-07-08 16:49:45,896'' (the numbers after the
                        comma are millisecond portion of the time).}
\lineii{\%(message)s}  {The logged message.}
\end{tableii}

To change the date/time format, you can pass an additional keyword parameter,
\var{datefmt}, as in the following:

\begin{verbatim}
import logging

logging.basicConfig(level=logging.DEBUG,
                    format='%(asctime)s %(levelname)-8s %(message)s',
                    datefmt='%a, %d %b %Y %H:%M:%S',
                    filename='/temp/myapp.log',
                    filemode='w')
logging.debug('A debug message')
logging.info('Some information')
logging.warning('A shot across the bows')
\end{verbatim}

which would result in output like

\begin{verbatim}
Fri, 02 Jul 2004 13:06:18 DEBUG    A debug message
Fri, 02 Jul 2004 13:06:18 INFO     Some information
Fri, 02 Jul 2004 13:06:18 WARNING  A shot across the bows
\end{verbatim}

The date format string follows the requirements of \function{strftime()} -
see the documentation for the \refmodule{time} module.

If, instead of sending logging output to the console or a file, you'd rather
use a file-like object which you have created separately, you can pass it
to \function{basicConfig()} using the \var{stream} keyword argument. Note
that if both \var{stream} and \var{filename} keyword arguments are passed,
the \var{stream} argument is ignored.

Of course, you can put variable information in your output. To do this,
simply have the message be a format string and pass in additional arguments
containing the variable information, as in the following example:

\begin{verbatim}
import logging

logging.basicConfig(level=logging.DEBUG,
                    format='%(asctime)s %(levelname)-8s %(message)s',
                    datefmt='%a, %d %b %Y %H:%M:%S',
                    filename='/temp/myapp.log',
                    filemode='w')
logging.error('Pack my box with %d dozen %s', 5, 'liquor jugs')
\end{verbatim}

which would result in

\begin{verbatim}
Wed, 21 Jul 2004 15:35:16 ERROR    Pack my box with 5 dozen liquor jugs
\end{verbatim}

\subsection{Logging to multiple destinations \label{multiple-destinations}}

Let's say you want to log to console and file with different message formats
and in differing circumstances. Say you want to log messages with levels
of DEBUG and higher to file, and those messages at level INFO and higher to
the console. Let's also assume that the file should contain timestamps, but
the console messages should not. Here's how you can achieve this:

\begin{verbatim}
import logging

# set up logging to file - see previous section for more details
logging.basicConfig(level=logging.DEBUG,
                    format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s',
                    datefmt='%m-%d %H:%M',
                    filename='/temp/myapp.log',
                    filemode='w')
# define a Handler which writes INFO messages or higher to the sys.stderr
console = logging.StreamHandler()
console.setLevel(logging.INFO)
# set a format which is simpler for console use
formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s')
# tell the handler to use this format
console.setFormatter(formatter)
# add the handler to the root logger
logging.getLogger('').addHandler(console)

# Now, we can log to the root logger, or any other logger. First the root...
logging.info('Jackdaws love my big sphinx of quartz.')

# Now, define a couple of other loggers which might represent areas in your
# application:

logger1 = logging.getLogger('myapp.area1')
logger2 = logging.getLogger('myapp.area2')

logger1.debug('Quick zephyrs blow, vexing daft Jim.')
logger1.info('How quickly daft jumping zebras vex.')
logger2.warning('Jail zesty vixen who grabbed pay from quack.')
logger2.error('The five boxing wizards jump quickly.')
\end{verbatim}

When you run this, on the console you will see

\begin{verbatim}
root        : INFO     Jackdaws love my big sphinx of quartz.
myapp.area1 : INFO     How quickly daft jumping zebras vex.
myapp.area2 : WARNING  Jail zesty vixen who grabbed pay from quack.
myapp.area2 : ERROR    The five boxing wizards jump quickly.
\end{verbatim}

and in the file you will see something like

\begin{verbatim}
10-22 22:19 root         INFO     Jackdaws love my big sphinx of quartz.
10-22 22:19 myapp.area1  DEBUG    Quick zephyrs blow, vexing daft Jim.
10-22 22:19 myapp.area1  INFO     How quickly daft jumping zebras vex.
10-22 22:19 myapp.area2  WARNING  Jail zesty vixen who grabbed pay from quack.
10-22 22:19 myapp.area2  ERROR    The five boxing wizards jump quickly.
\end{verbatim}

As you can see, the DEBUG message only shows up in the file. The other
messages are sent to both destinations.

This example uses console and file handlers, but you can use any number and
combination of handlers you choose.

\subsection{Sending and receiving logging events across a network
\label{network-logging}}

Let's say you want to send logging events across a network, and handle them
at the receiving end. A simple way of doing this is attaching a
\class{SocketHandler} instance to the root logger at the sending end:

\begin{verbatim}
import logging, logging.handlers

rootLogger = logging.getLogger('')
rootLogger.setLevel(logging.DEBUG)
socketHandler = logging.handlers.SocketHandler('localhost',
                    logging.handlers.DEFAULT_TCP_LOGGING_PORT)
# don't bother with a formatter, since a socket handler sends the event as
# an unformatted pickle
rootLogger.addHandler(socketHandler)

# Now, we can log to the root logger, or any other logger. First the root...
logging.info('Jackdaws love my big sphinx of quartz.')

# Now, define a couple of other loggers which might represent areas in your
# application:

logger1 = logging.getLogger('myapp.area1')
logger2 = logging.getLogger('myapp.area2')

logger1.debug('Quick zephyrs blow, vexing daft Jim.')
logger1.info('How quickly daft jumping zebras vex.')
logger2.warning('Jail zesty vixen who grabbed pay from quack.')
logger2.error('The five boxing wizards jump quickly.')
\end{verbatim}

At the receiving end, you can set up a receiver using the
\module{SocketServer} module. Here is a basic working example:

\begin{verbatim}
import cPickle
import logging
import logging.handlers
import SocketServer
import struct


class LogRecordStreamHandler(SocketServer.StreamRequestHandler):
    """Handler for a streaming logging request.

    This basically logs the record using whatever logging policy is
    configured locally.
    """

    def handle(self):
        """
        Handle multiple requests - each expected to be a 4-byte length,
        followed by the LogRecord in pickle format. Logs the record
        according to whatever policy is configured locally.
        """
        while 1:
            chunk = self.connection.recv(4)
            if len(chunk) < 4:
                break
            slen = struct.unpack(">L", chunk)[0]
            chunk = self.connection.recv(slen)
            while len(chunk) < slen:
                chunk = chunk + self.connection.recv(slen - len(chunk))
            obj = self.unPickle(chunk)
            record = logging.makeLogRecord(obj)
            self.handleLogRecord(record)

    def unPickle(self, data):
        return cPickle.loads(data)

    def handleLogRecord(self, record):
        # if a name is specified, we use the named logger rather than the one
        # implied by the record.
        if self.server.logname is not None:
            name = self.server.logname
        else:
            name = record.name
        logger = logging.getLogger(name)
        # N.B. EVERY record gets logged. This is because Logger.handle
        # is normally called AFTER logger-level filtering. If you want
        # to do filtering, do it at the client end to save wasting
        # cycles and network bandwidth!
        logger.handle(record)

class LogRecordSocketReceiver(SocketServer.ThreadingTCPServer):
    """simple TCP socket-based logging receiver suitable for testing.
    """

    allow_reuse_address = 1

    def __init__(self, host='localhost',
                 port=logging.handlers.DEFAULT_TCP_LOGGING_PORT,
                 handler=LogRecordStreamHandler):
        SocketServer.ThreadingTCPServer.__init__(self, (host, port), handler)
        self.abort = 0
        self.timeout = 1
        self.logname = None

    def serve_until_stopped(self):
        import select
        abort = 0
        while not abort:
            rd, wr, ex = select.select([self.socket.fileno()],
                                       [], [],
                                       self.timeout)
            if rd:
                self.handle_request()
            abort = self.abort

def main():
    logging.basicConfig(
        format="%(relativeCreated)5d %(name)-15s %(levelname)-8s %(message)s")
    tcpserver = LogRecordSocketReceiver()
    print "About to start TCP server..."
    tcpserver.serve_until_stopped()

if __name__ == "__main__":
    main()
\end{verbatim}

First run the server, and then the client. On the client side, nothing is
printed on the console; on the server side, you should see something like:

\begin{verbatim}
About to start TCP server...
   59 root            INFO     Jackdaws love my big sphinx of quartz.
   59 myapp.area1     DEBUG    Quick zephyrs blow, vexing daft Jim.
   69 myapp.area1     INFO     How quickly daft jumping zebras vex.
   69 myapp.area2     WARNING  Jail zesty vixen who grabbed pay from quack.
   69 myapp.area2     ERROR    The five boxing wizards jump quickly.
\end{verbatim}

\subsection{Handler Objects}

Handlers have the following attributes and methods. Note that
\class{Handler} is never instantiated directly; this class acts as a
base for more useful subclasses. However, the \method{__init__()}
method in subclasses needs to call \method{Handler.__init__()}.

\begin{methoddesc}{__init__}{level=\constant{NOTSET}}
Initializes the \class{Handler} instance by setting its level, setting
the list of filters to the empty list and creating a lock (using
\method{createLock()}) for serializing access to an I/O mechanism.
\end{methoddesc}

\begin{methoddesc}{createLock}{}
Initializes a thread lock which can be used to serialize access to
underlying I/O functionality which may not be threadsafe.
\end{methoddesc}

\begin{methoddesc}{acquire}{}
Acquires the thread lock created with \method{createLock()}.
\end{methoddesc}

\begin{methoddesc}{release}{}
Releases the thread lock acquired with \method{acquire()}.
\end{methoddesc}

\begin{methoddesc}{setLevel}{lvl}
Sets the threshold for this handler to \var{lvl}. Logging messages which are
less severe than \var{lvl} will be ignored. When a handler is created, the
level is set to \constant{NOTSET} (which causes all messages to be processed).
\end{methoddesc}

\begin{methoddesc}{setFormatter}{form}
Sets the \class{Formatter} for this handler to \var{form}.
\end{methoddesc}

\begin{methoddesc}{addFilter}{filt}
Adds the specified filter \var{filt} to this handler.
\end{methoddesc}

\begin{methoddesc}{removeFilter}{filt}
Removes the specified filter \var{filt} from this handler.
\end{methoddesc}

\begin{methoddesc}{filter}{record}
Applies this handler's filters to the record and returns a true value if
the record is to be processed.
\end{methoddesc}

\begin{methoddesc}{flush}{}
Ensure all logging output has been flushed. This version does
nothing and is intended to be implemented by subclasses.
\end{methoddesc}

\begin{methoddesc}{close}{}
Tidy up any resources used by the handler. This version does
nothing and is intended to be implemented by subclasses.
\end{methoddesc}

\begin{methoddesc}{handle}{record}
Conditionally emits the specified logging record, depending on
filters which may have been added to the handler. Wraps the actual
emission of the record with acquisition/release of the I/O thread
lock.
\end{methoddesc}

\begin{methoddesc}{handleError}{record}
This method should be called from handlers when an exception is
encountered during an \method{emit()} call. By default it does nothing,
which means that exceptions get silently ignored. This is what is
mostly wanted for a logging system - most users will not care
about errors in the logging system, they are more interested in
application errors. You could, however, replace this with a custom
handler if you wish. The specified record is the one which was being
processed when the exception occurred.
\end{methoddesc}

\begin{methoddesc}{format}{record}
Do formatting for a record - if a formatter is set, use it.
Otherwise, use the default formatter for the module.
\end{methoddesc}

\begin{methoddesc}{emit}{record}
Do whatever it takes to actually log the specified logging record.
This version is intended to be implemented by subclasses and so
raises a \exception{NotImplementedError}.
\end{methoddesc}

\subsubsection{StreamHandler}

The \class{StreamHandler} class, located in the core \module{logging}
package, sends logging output to streams such as \var{sys.stdout},
\var{sys.stderr} or any file-like object (or, more precisely, any
object which supports \method{write()} and \method{flush()} methods).

\begin{classdesc}{StreamHandler}{\optional{strm}}
Returns a new instance of the \class{StreamHandler} class. If \var{strm} is
specified, the instance will use it for logging output; otherwise,
\var{sys.stderr} will be used.
\end{classdesc}

\begin{methoddesc}{emit}{record}
If a formatter is specified, it is used to format the record.
The record is then written to the stream with a trailing newline.
If exception information is present, it is formatted using
\function{traceback.print_exception()} and appended to the stream.
\end{methoddesc}

\begin{methoddesc}{flush}{}
Flushes the stream by calling its \method{flush()} method. Note that
the \method{close()} method is inherited from \class{Handler} and
so does nothing, so an explicit \method{flush()} call may be needed
at times.
\end{methoddesc}

\subsubsection{FileHandler}

The \class{FileHandler} class, located in the core \module{logging}
package, sends logging output to a disk file.  It inherits the output
functionality from \class{StreamHandler}.

\begin{classdesc}{FileHandler}{filename\optional{, mode}}
Returns a new instance of the \class{FileHandler} class. The specified
file is opened and used as the stream for logging. If \var{mode} is
not specified, \constant{'a'} is used. By default, the file grows
indefinitely.
\end{classdesc}

\begin{methoddesc}{close}{}
Closes the file.
\end{methoddesc}

\begin{methoddesc}{emit}{record}
Outputs the record to the file.
\end{methoddesc}

\subsubsection{RotatingFileHandler}

The \class{RotatingFileHandler} class, located in the \module{logging.handlers}
module, supports rotation of disk log files.

\begin{classdesc}{RotatingFileHandler}{filename\optional{, mode\optional{,
                                       maxBytes\optional{, backupCount}}}}
Returns a new instance of the \class{RotatingFileHandler} class. The
specified file is opened and used as the stream for logging. If
\var{mode} is not specified, \code{'a'} is used. By default, the
file grows indefinitely.

You can use the \var{maxBytes} and
\var{backupCount} values to allow the file to \dfn{rollover} at a
predetermined size. When the size is about to be exceeded, the file is
closed and a new file is silently opened for output. Rollover occurs
whenever the current log file is nearly \var{maxBytes} in length; if
\var{maxBytes} is zero, rollover never occurs.  If \var{backupCount}
is non-zero, the system will save old log files by appending the
extensions ".1", ".2" etc., to the filename. For example, with
a \var{backupCount} of 5 and a base file name of
\file{app.log}, you would get \file{app.log},
\file{app.log.1}, \file{app.log.2}, up to \file{app.log.5}. The file being
written to is always \file{app.log}.  When this file is filled, it is
closed and renamed to \file{app.log.1}, and if files \file{app.log.1},
\file{app.log.2}, etc.  exist, then they are renamed to \file{app.log.2},
\file{app.log.3} etc.  respectively.
\end{classdesc}

\begin{methoddesc}{doRollover}{}
Does a rollover, as described above.
\end{methoddesc}

\begin{methoddesc}{emit}{record}
Outputs the record to the file, catering for rollover as described previously.
\end{methoddesc}

\subsubsection{TimedRotatingFileHandler}

The \class{TimedRotatingFileHandler} class, located in the
\module{logging.handlers} module, supports rotation of disk log files
at certain timed intervals.

\begin{classdesc}{TimedRotatingFileHandler}{filename
                                            \optional{,when
                                            \optional{,interval
                                            \optional{,backupCount}}}}

Returns a new instance of the \class{TimedRotatingFileHandler} class. The
specified file is opened and used as the stream for logging. On rotating
it also sets the filename suffix. Rotating happens based on the product
of \var{when} and \var{interval}.

You can use the \var{when} to specify the type of \var{interval}. The
list of possible values is, note that they are not case sensitive:

\begin{tableii}{l|l}{}{Value}{Type of interval}
  \lineii{S}{Seconds}
  \lineii{M}{Minutes}
  \lineii{H}{Hours}
  \lineii{D}{Days}
  \lineii{W}{Week day (0=Monday)}
  \lineii{midnight}{Roll over at midnight}
\end{tableii}

If \var{backupCount} is non-zero, the system will save old log files by
appending the extensions ".1", ".2" etc., to the filename. For example,
with a \var{backupCount} of 5 and a base file name of \file{app.log},
you would get \file{app.log}, \file{app.log.1}, \file{app.log.2}, up to
\file{app.log.5}. The file being written to is always \file{app.log}.
When this file is filled, it is closed and renamed to \file{app.log.1},
and if files \file{app.log.1}, \file{app.log.2}, etc. exist, then they
are renamed to \file{app.log.2}, \file{app.log.3} etc. respectively.
\end{classdesc}

\begin{methoddesc}{doRollover}{}
Does a rollover, as described above.
\end{methoddesc}

\begin{methoddesc}{emit}{record}
Outputs the record to the file, catering for rollover as described
above.
\end{methoddesc}

\subsubsection{SocketHandler}

The \class{SocketHandler} class, located in the
\module{logging.handlers} module, sends logging output to a network
socket. The base class uses a TCP socket.

\begin{classdesc}{SocketHandler}{host, port}
Returns a new instance of the \class{SocketHandler} class intended to
communicate with a remote machine whose address is given by \var{host}
and \var{port}.
\end{classdesc}

\begin{methoddesc}{close}{}
Closes the socket.
\end{methoddesc}

\begin{methoddesc}{handleError}{}
\end{methoddesc}

\begin{methoddesc}{emit}{}
Pickles the record's attribute dictionary and writes it to the socket in
binary format. If there is an error with the socket, silently drops the
packet. If the connection was previously lost, re-establishes the connection.
To unpickle the record at the receiving end into a \class{LogRecord}, use the
\function{makeLogRecord()} function.
\end{methoddesc}

\begin{methoddesc}{handleError}{}
Handles an error which has occurred during \method{emit()}. The
most likely cause is a lost connection. Closes the socket so that
we can retry on the next event.
\end{methoddesc}

\begin{methoddesc}{makeSocket}{}
This is a factory method which allows subclasses to define the precise
type of socket they want. The default implementation creates a TCP
socket (\constant{socket.SOCK_STREAM}).
\end{methoddesc}

\begin{methoddesc}{makePickle}{record}
Pickles the record's attribute dictionary in binary format with a length
prefix, and returns it ready for transmission across the socket.
\end{methoddesc}

\begin{methoddesc}{send}{packet}
Send a pickled string \var{packet} to the socket. This function allows
for partial sends which can happen when the network is busy.
\end{methoddesc}

\subsubsection{DatagramHandler}

The \class{DatagramHandler} class, located in the
\module{logging.handlers} module, inherits from \class{SocketHandler}
to support sending logging messages over UDP sockets.

\begin{classdesc}{DatagramHandler}{host, port}
Returns a new instance of the \class{DatagramHandler} class intended to
communicate with a remote machine whose address is given by \var{host}
and \var{port}.
\end{classdesc}

\begin{methoddesc}{emit}{}
Pickles the record's attribute dictionary and writes it to the socket in
binary format. If there is an error with the socket, silently drops the
packet.
To unpickle the record at the receiving end into a \class{LogRecord}, use the
\function{makeLogRecord()} function.
\end{methoddesc}

\begin{methoddesc}{makeSocket}{}
The factory method of \class{SocketHandler} is here overridden to create
a UDP socket (\constant{socket.SOCK_DGRAM}).
\end{methoddesc}

\begin{methoddesc}{send}{s}
Send a pickled string to a socket.
\end{methoddesc}

\subsubsection{SysLogHandler}

The \class{SysLogHandler} class, located in the
\module{logging.handlers} module, supports sending logging messages to
a remote or local \UNIX{} syslog.

\begin{classdesc}{SysLogHandler}{\optional{address\optional{, facility}}}
Returns a new instance of the \class{SysLogHandler} class intended to
communicate with a remote \UNIX{} machine whose address is given by
\var{address} in the form of a \code{(\var{host}, \var{port})}
tuple.  If \var{address} is not specified, \code{('localhost', 514)} is
used.  The address is used to open a UDP socket.  If \var{facility} is
not specified, \constant{LOG_USER} is used.
\end{classdesc}

\begin{methoddesc}{close}{}
Closes the socket to the remote host.
\end{methoddesc}

\begin{methoddesc}{emit}{record}
The record is formatted, and then sent to the syslog server. If
exception information is present, it is \emph{not} sent to the server.
\end{methoddesc}

\begin{methoddesc}{encodePriority}{facility, priority}
Encodes the facility and priority into an integer. You can pass in strings
or integers - if strings are passed, internal mapping dictionaries are used
to convert them to integers.
\end{methoddesc}

\subsubsection{NTEventLogHandler}

The \class{NTEventLogHandler} class, located in the
\module{logging.handlers} module, supports sending logging messages to
a local Windows NT, Windows 2000 or Windows XP event log. Before you
can use it, you need Mark Hammond's Win32 extensions for Python
installed.

\begin{classdesc}{NTEventLogHandler}{appname\optional{,
                                     dllname\optional{, logtype}}}
Returns a new instance of the \class{NTEventLogHandler} class. The
\var{appname} is used to define the application name as it appears in the
event log. An appropriate registry entry is created using this name.
The \var{dllname} should give the fully qualified pathname of a .dll or .exe
which contains message definitions to hold in the log (if not specified,
\code{'win32service.pyd'} is used - this is installed with the Win32
extensions and contains some basic placeholder message definitions.
Note that use of these placeholders will make your event logs big, as the
entire message source is held in the log. If you want slimmer logs, you have
to pass in the name of your own .dll or .exe which contains the message
definitions you want to use in the event log). The \var{logtype} is one of
\code{'Application'}, \code{'System'} or \code{'Security'}, and
defaults to \code{'Application'}.
\end{classdesc}

\begin{methoddesc}{close}{}
At this point, you can remove the application name from the registry as a
source of event log entries. However, if you do this, you will not be able
to see the events as you intended in the Event Log Viewer - it needs to be
able to access the registry to get the .dll name. The current version does
not do this (in fact it doesn't do anything).
\end{methoddesc}

\begin{methoddesc}{emit}{record}
Determines the message ID, event category and event type, and then logs the
message in the NT event log.
\end{methoddesc}

\begin{methoddesc}{getEventCategory}{record}
Returns the event category for the record. Override this if you
want to specify your own categories. This version returns 0.
\end{methoddesc}

\begin{methoddesc}{getEventType}{record}
Returns the event type for the record. Override this if you want
to specify your own types. This version does a mapping using the
handler's typemap attribute, which is set up in \method{__init__()}
to a dictionary which contains mappings for \constant{DEBUG},
\constant{INFO}, \constant{WARNING}, \constant{ERROR} and
\constant{CRITICAL}. If you are using your own levels, you will either need
to override this method or place a suitable dictionary in the
handler's \var{typemap} attribute.
\end{methoddesc}

\begin{methoddesc}{getMessageID}{record}
Returns the message ID for the record. If you are using your
own messages, you could do this by having the \var{msg} passed to the
logger being an ID rather than a format string. Then, in here,
you could use a dictionary lookup to get the message ID. This
version returns 1, which is the base message ID in
\file{win32service.pyd}.
\end{methoddesc}

\subsubsection{SMTPHandler}

The \class{SMTPHandler} class, located in the
\module{logging.handlers} module, supports sending logging messages to
an email address via SMTP.

\begin{classdesc}{SMTPHandler}{mailhost, fromaddr, toaddrs, subject}
Returns a new instance of the \class{SMTPHandler} class. The
instance is initialized with the from and to addresses and subject
line of the email. The \var{toaddrs} should be a list of strings. To specify a
non-standard SMTP port, use the (host, port) tuple format for the
\var{mailhost} argument. If you use a string, the standard SMTP port
is used.
\end{classdesc}

\begin{methoddesc}{emit}{record}
Formats the record and sends it to the specified addressees.
\end{methoddesc}

\begin{methoddesc}{getSubject}{record}
If you want to specify a subject line which is record-dependent,
override this method.
\end{methoddesc}

\subsubsection{MemoryHandler}

The \class{MemoryHandler} class, located in the
\module{logging.handlers} module, supports buffering of logging
records in memory, periodically flushing them to a \dfn{target}
handler. Flushing occurs whenever the buffer is full, or when an event
of a certain severity or greater is seen.

\class{MemoryHandler} is a subclass of the more general
\class{BufferingHandler}, which is an abstract class. This buffers logging
records in memory. Whenever each record is added to the buffer, a
check is made by calling \method{shouldFlush()} to see if the buffer
should be flushed.  If it should, then \method{flush()} is expected to
do the needful.

\begin{classdesc}{BufferingHandler}{capacity}
Initializes the handler with a buffer of the specified capacity.
\end{classdesc}

\begin{methoddesc}{emit}{record}
Appends the record to the buffer. If \method{shouldFlush()} returns true,
calls \method{flush()} to process the buffer.
\end{methoddesc}

\begin{methoddesc}{flush}{}
You can override this to implement custom flushing behavior. This version
just zaps the buffer to empty.
\end{methoddesc}

\begin{methoddesc}{shouldFlush}{record}
Returns true if the buffer is up to capacity. This method can be
overridden to implement custom flushing strategies.
\end{methoddesc}

\begin{classdesc}{MemoryHandler}{capacity\optional{, flushLevel
\optional{, target}}}
Returns a new instance of the \class{MemoryHandler} class. The
instance is initialized with a buffer size of \var{capacity}. If
\var{flushLevel} is not specified, \constant{ERROR} is used. If no
\var{target} is specified, the target will need to be set using
\method{setTarget()} before this handler does anything useful.
\end{classdesc}

\begin{methoddesc}{close}{}
Calls \method{flush()}, sets the target to \constant{None} and
clears the buffer.
\end{methoddesc}

\begin{methoddesc}{flush}{}
For a \class{MemoryHandler}, flushing means just sending the buffered
records to the target, if there is one. Override if you want
different behavior.
\end{methoddesc}

\begin{methoddesc}{setTarget}{target}
Sets the target handler for this handler.
\end{methoddesc}

\begin{methoddesc}{shouldFlush}{record}
Checks for buffer full or a record at the \var{flushLevel} or higher.
\end{methoddesc}

\subsubsection{HTTPHandler}

The \class{HTTPHandler} class, located in the
\module{logging.handlers} module, supports sending logging messages to
a Web server, using either \samp{GET} or \samp{POST} semantics.

\begin{classdesc}{HTTPHandler}{host, url\optional{, method}}
Returns a new instance of the \class{HTTPHandler} class. The
instance is initialized with a host address, url and HTTP method.
The \var{host} can be of the form \code{host:port}, should you need to
use a specific port number. If no \var{method} is specified, \samp{GET}
is used.
\end{classdesc}

\begin{methoddesc}{emit}{record}
Sends the record to the Web server as an URL-encoded dictionary.
\end{methoddesc}

\subsection{Formatter Objects}

\class{Formatter}s have the following attributes and methods. They are
responsible for converting a \class{LogRecord} to (usually) a string
which can be interpreted by either a human or an external system. The
base
\class{Formatter} allows a formatting string to be specified. If none is
supplied, the default value of \code{'\%(message)s'} is used.

A Formatter can be initialized with a format string which makes use of
knowledge of the \class{LogRecord} attributes - such as the default value
mentioned above making use of the fact that the user's message and
arguments are pre-formatted into a \class{LogRecord}'s \var{message}
attribute.  This format string contains standard python \%-style
mapping keys. See section \ref{typesseq-strings}, ``String Formatting
Operations,'' for more information on string formatting.

Currently, the useful mapping keys in a \class{LogRecord} are:

\begin{tableii}{l|l}{code}{Format}{Description}
\lineii{\%(name)s}     {Name of the logger (logging channel).}
\lineii{\%(levelno)s}  {Numeric logging level for the message
                        (\constant{DEBUG}, \constant{INFO},
                        \constant{WARNING}, \constant{ERROR},
                        \constant{CRITICAL}).}
\lineii{\%(levelname)s}{Text logging level for the message
                        (\code{'DEBUG'}, \code{'INFO'},
                        \code{'WARNING'}, \code{'ERROR'},
                        \code{'CRITICAL'}).}
\lineii{\%(pathname)s} {Full pathname of the source file where the logging
                        call was issued (if available).}
\lineii{\%(filename)s} {Filename portion of pathname.}
\lineii{\%(module)s}   {Module (name portion of filename).}
\lineii{\%(funcName)s} {Name of function containing the logging call.}
\lineii{\%(lineno)d}   {Source line number where the logging call was issued
                        (if available).}
\lineii{\%(created)f}  {Time when the \class{LogRecord} was created (as
                        returned by \function{time.time()}).}
\lineii{\%(asctime)s}  {Human-readable time when the \class{LogRecord}
                        was created.  By default this is of the form
                        ``2003-07-08 16:49:45,896'' (the numbers after the
                        comma are millisecond portion of the time).}
\lineii{\%(msecs)d}    {Millisecond portion of the time when the
                        \class{LogRecord} was created.}
\lineii{\%(thread)d}   {Thread ID (if available).}
\lineii{\%(threadName)s}   {Thread name (if available).}
\lineii{\%(process)d}  {Process ID (if available).}
\lineii{\%(message)s}  {The logged message, computed as \code{msg \% args}.}
\end{tableii}

\versionchanged[\var{funcName} was added]{2.5}

\begin{classdesc}{Formatter}{\optional{fmt\optional{, datefmt}}}
Returns a new instance of the \class{Formatter} class. The
instance is initialized with a format string for the message as a whole,
as well as a format string for the date/time portion of a message. If
no \var{fmt} is specified, \code{'\%(message)s'} is used. If no \var{datefmt}
is specified, the ISO8601 date format is used.
\end{classdesc}

\begin{methoddesc}{format}{record}
The record's attribute dictionary is used as the operand to a
string formatting operation. Returns the resulting string.
Before formatting the dictionary, a couple of preparatory steps
are carried out. The \var{message} attribute of the record is computed
using \var{msg} \% \var{args}. If the formatting string contains
\code{'(asctime)'}, \method{formatTime()} is called to format the
event time. If there is exception information, it is formatted using
\method{formatException()} and appended to the message.
\end{methoddesc}

\begin{methoddesc}{formatTime}{record\optional{, datefmt}}
This method should be called from \method{format()} by a formatter which
wants to make use of a formatted time. This method can be overridden
in formatters to provide for any specific requirement, but the
basic behavior is as follows: if \var{datefmt} (a string) is specified,
it is used with \function{time.strftime()} to format the creation time of the
record. Otherwise, the ISO8601 format is used. The resulting
string is returned.
\end{methoddesc}

\begin{methoddesc}{formatException}{exc_info}
Formats the specified exception information (a standard exception tuple
as returned by \function{sys.exc_info()}) as a string. This default
implementation just uses \function{traceback.print_exception()}.
The resulting string is returned.
\end{methoddesc}

\subsection{Filter Objects}

\class{Filter}s can be used by \class{Handler}s and \class{Logger}s for
more sophisticated filtering than is provided by levels. The base filter
class only allows events which are below a certain point in the logger
hierarchy. For example, a filter initialized with "A.B" will allow events
logged by loggers "A.B", "A.B.C", "A.B.C.D", "A.B.D" etc. but not "A.BB",
"B.A.B" etc. If initialized with the empty string, all events are passed.

\begin{classdesc}{Filter}{\optional{name}}
Returns an instance of the \class{Filter} class. If \var{name} is specified,
it names a logger which, together with its children, will have its events
allowed through the filter. If no name is specified, allows every event.
\end{classdesc}

\begin{methoddesc}{filter}{record}
Is the specified record to be logged? Returns zero for no, nonzero for
yes. If deemed appropriate, the record may be modified in-place by this
method.
\end{methoddesc}

\subsection{LogRecord Objects}

\class{LogRecord} instances are created every time something is logged. They
contain all the information pertinent to the event being logged. The
main information passed in is in msg and args, which are combined
using msg \% args to create the message field of the record. The record
also includes information such as when the record was created, the
source line where the logging call was made, and any exception
information to be logged.

\begin{classdesc}{LogRecord}{name, lvl, pathname, lineno, msg, args,
                             exc_info}
Returns an instance of \class{LogRecord} initialized with interesting
information. The \var{name} is the logger name; \var{lvl} is the
numeric level; \var{pathname} is the absolute pathname of the source
file in which the logging call was made; \var{lineno} is the line
number in that file where the logging call is found; \var{msg} is the
user-supplied message (a format string); \var{args} is the tuple
which, together with \var{msg}, makes up the user message; and
\var{exc_info} is the exception tuple obtained by calling
\function{sys.exc_info() }(or \constant{None}, if no exception information
is available).
\end{classdesc}

\begin{methoddesc}{getMessage}{}
Returns the message for this \class{LogRecord} instance after merging any
user-supplied arguments with the message.
\end{methoddesc}

\subsection{Thread Safety}

The logging module is intended to be thread-safe without any special work
needing to be done by its clients. It achieves this though using threading
locks; there is one lock to serialize access to the module's shared data,
and each handler also creates a lock to serialize access to its underlying
I/O.

\subsection{Configuration}


\subsubsection{Configuration functions%
               \label{logging-config-api}}

The following functions configure the logging module. They are located in the
\module{logging.config} module.  Their use is optional --- you can configure
the logging module using these functions or by making calls to the
main API (defined in \module{logging} itself) and defining handlers
which are declared either in \module{logging} or
\module{logging.handlers}.

\begin{funcdesc}{fileConfig}{fname\optional{, defaults}}
Reads the logging configuration from a ConfigParser-format file named
\var{fname}. This function can be called several times from an application,
allowing an end user the ability to select from various pre-canned
configurations (if the developer provides a mechanism to present the
choices and load the chosen configuration). Defaults to be passed to
ConfigParser can be specified in the \var{defaults} argument.
\end{funcdesc}

\begin{funcdesc}{listen}{\optional{port}}
Starts up a socket server on the specified port, and listens for new
configurations. If no port is specified, the module's default
\constant{DEFAULT_LOGGING_CONFIG_PORT} is used. Logging configurations
will be sent as a file suitable for processing by \function{fileConfig()}.
Returns a \class{Thread} instance on which you can call \method{start()}
to start the server, and which you can \method{join()} when appropriate.
To stop the server, call \function{stopListening()}. To send a configuration
to the socket, read in the configuration file and send it to the socket
as a string of bytes preceded by a four-byte length packed in binary using
struct.\code{pack(">L", n)}.
\end{funcdesc}

\begin{funcdesc}{stopListening}{}
Stops the listening server which was created with a call to
\function{listen()}. This is typically called before calling \method{join()}
on the return value from \function{listen()}.
\end{funcdesc}

\subsubsection{Configuration file format%
               \label{logging-config-fileformat}}

The configuration file format understood by \function{fileConfig()} is
based on ConfigParser functionality. The file must contain sections
called \code{[loggers]}, \code{[handlers]} and \code{[formatters]}
which identify by name the entities of each type which are defined in
the file. For each such entity, there is a separate section which
identified how that entity is configured. Thus, for a logger named
\code{log01} in the \code{[loggers]} section, the relevant
configuration details are held in a section
\code{[logger_log01]}. Similarly, a handler called \code{hand01} in
the \code{[handlers]} section will have its configuration held in a
section called \code{[handler_hand01]}, while a formatter called
\code{form01} in the \code{[formatters]} section will have its
configuration specified in a section called
\code{[formatter_form01]}. The root logger configuration must be
specified in a section called \code{[logger_root]}.

Examples of these sections in the file are given below.

\begin{verbatim}
[loggers]
keys=root,log02,log03,log04,log05,log06,log07

[handlers]
keys=hand01,hand02,hand03,hand04,hand05,hand06,hand07,hand08,hand09

[formatters]
keys=form01,form02,form03,form04,form05,form06,form07,form08,form09
\end{verbatim}

The root logger must specify a level and a list of handlers. An
example of a root logger section is given below.

\begin{verbatim}
[logger_root]
level=NOTSET
handlers=hand01
\end{verbatim}

The \code{level} entry can be one of \code{DEBUG, INFO, WARNING,
ERROR, CRITICAL} or \code{NOTSET}. For the root logger only,
\code{NOTSET} means that all messages will be logged. Level values are
\function{eval()}uated in the context of the \code{logging} package's
namespace.

The \code{handlers} entry is a comma-separated list of handler names,
which must appear in the \code{[handlers]} section. These names must
appear in the \code{[handlers]} section and have corresponding
sections in the configuration file.

For loggers other than the root logger, some additional information is
required. This is illustrated by the following example.

\begin{verbatim}
[logger_parser]
level=DEBUG
handlers=hand01
propagate=1
qualname=compiler.parser
\end{verbatim}

The \code{level} and \code{handlers} entries are interpreted as for
the root logger, except that if a non-root logger's level is specified
as \code{NOTSET}, the system consults loggers higher up the hierarchy
to determine the effective level of the logger. The \code{propagate}
entry is set to 1 to indicate that messages must propagate to handlers
higher up the logger hierarchy from this logger, or 0 to indicate that
messages are \strong{not} propagated to handlers up the hierarchy. The
\code{qualname} entry is the hierarchical channel name of the logger,
that is to say the name used by the application to get the logger.

Sections which specify handler configuration are exemplified by the
following.

\begin{verbatim}
[handler_hand01]
class=StreamHandler
level=NOTSET
formatter=form01
args=(sys.stdout,)
\end{verbatim}

The \code{class} entry indicates the handler's class (as determined by
\function{eval()} in the \code{logging} package's namespace). The
\code{level} is interpreted as for loggers, and \code{NOTSET} is taken
to mean "log everything".

The \code{formatter} entry indicates the key name of the formatter for
this handler. If blank, a default formatter
(\code{logging._defaultFormatter}) is used. If a name is specified, it
must appear in the \code{[formatters]} section and have a
corresponding section in the configuration file.

The \code{args} entry, when \function{eval()}uated in the context of
the \code{logging} package's namespace, is the list of arguments to
the constructor for the handler class. Refer to the constructors for
the relevant handlers, or to the examples below, to see how typical
entries are constructed.

\begin{verbatim}
[handler_hand02]
class=FileHandler
level=DEBUG
formatter=form02
args=('python.log', 'w')

[handler_hand03]
class=handlers.SocketHandler
level=INFO
formatter=form03
args=('localhost', handlers.DEFAULT_TCP_LOGGING_PORT)

[handler_hand04]
class=handlers.DatagramHandler
level=WARN
formatter=form04
args=('localhost', handlers.DEFAULT_UDP_LOGGING_PORT)

[handler_hand05]
class=handlers.SysLogHandler
level=ERROR
formatter=form05
args=(('localhost', handlers.SYSLOG_UDP_PORT), handlers.SysLogHandler.LOG_USER)

[handler_hand06]
class=handlers.NTEventLogHandler
level=CRITICAL
formatter=form06
args=('Python Application', '', 'Application')

[handler_hand07]
class=handlers.SMTPHandler
level=WARN
formatter=form07
args=('localhost', 'from@abc', ['user1@abc', 'user2@xyz'], 'Logger Subject')

[handler_hand08]
class=handlers.MemoryHandler
level=NOTSET
formatter=form08
target=
args=(10, ERROR)

[handler_hand09]
class=handlers.HTTPHandler
level=NOTSET
formatter=form09
args=('localhost:9022', '/log', 'GET')
\end{verbatim}

Sections which specify formatter configuration are typified by the following.

\begin{verbatim}
[formatter_form01]
format=F1 %(asctime)s %(levelname)s %(message)s
datefmt=
class=logging.Formatter
\end{verbatim}

The \code{format} entry is the overall format string, and the
\code{datefmt} entry is the \function{strftime()}-compatible date/time format
string. If empty, the package substitutes ISO8601 format date/times, which
is almost equivalent to specifying the date format string "%Y-%m-%d %H:%M:%S".
The ISO8601 format also specifies milliseconds, which are appended to the
result of using the above format string, with a comma separator. An example
time in ISO8601 format is \code{2003-01-23 00:29:50,411}.

The \code{class} entry is optional.  It indicates the name of the
formatter's class (as a dotted module and class name.)  This option is
useful for instantiating a \class{Formatter} subclass.  Subclasses of
\class{Formatter} can present exception tracebacks in an expanded or
condensed format.
