| \section{\module{logging} --- |
| Logging facility for Python} |
| |
| \declaremodule{standard}{logging} % standard library, in Python |
| |
| % These apply to all modules, and may be given more than once: |
| |
| \moduleauthor{Vinay Sajip}{vinay_sajip@red-dove.com} |
| \sectionauthor{Skip Montanaro}{skip@pobox.com} |
| |
| \modulesynopsis{Logging module for Python based on PEP 282.} |
| |
| |
| There is a need for a standard logging system in Python, as documented in |
| {}\pep{282} and enthusiastically endorsed by the Guido van Rossum in the |
| {}\citetitle[http://www.python.org/doc/essays/pepparade.html]{Parade of the |
| PEPs}. By a happy coincidence, the package described here was already in |
| development and fairly close in intent and design to the description in the |
| aforementioned PEP, borrowing as it did heavily from JSR-47 (now JDK 1.4's |
| java.util.logging package) and |
| {}\ulink{log4j}{http://jakarta.apache.org/log4j/}. This section page |
| describes it in more detail. |
| |
| This package owes its greatest debt to Apache |
| {}\ulink{log4j}{http://jakarta.apache.org/log4j/}. Due notice was also taken |
| of log4j's comprehensive |
| {}\ulink{critique}{http://jakarta.apache.org/log4j/docs/critique.html} of |
| JSR-47. This package bears a close resemblance to log4j, but is not a close |
| translation (as, for example, {}\ulink{log4p}{http://log4p.sourceforge.net/} |
| appears to be). |
| |
| |
| |
| \subsection{Functions} |
| |
| The \module{logging} module defines the following functions: |
| |
| |
| \begin{funcdesc}{getLevelName}{level} |
| |
| Return the textual representation of logging level \var{level}. |
| |
| If the level is one of the predefined levels (\var{CRITICAL}, \var{ERROR}, |
| {}\var{WARN}, \var{INFO}, \var{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{level} |
| is returned. Otherwise, the string "Level \%s" \% level is returned. |
| |
| \end{funcdesc} |
| |
| |
| \begin{funcdesc}{addLevelName}{level, levelName} |
| |
| Associate \var{levelName} with \var{level}. This is used when converting |
| levels to text during message formatting. |
| |
| \end{funcdesc} |
| |
| |
| \begin{funcdesc}{setLoggerClass}{klass} |
| |
| Set the class to be used when instantiating a logger. The class should |
| define \code{__init__()} such that only a name argument is required, and the |
| {}\code{__init__()} should call Logger.__init__() |
| |
| \end{funcdesc} |
| |
| |
| \begin{funcdesc}{basicConfig}{} |
| |
| Do basic configuration for the logging system by creating a |
| {}\class{StreamHandler} with a default {}\class{Formatter} and adding it to |
| the root logger. |
| |
| \end{funcdesc} |
| |
| |
| \begin{funcdesc}{getLogger}{\optional{name=None}} |
| |
| Return a logger with the specified name, creating it if necessary. If no |
| name is specified, return the root logger. |
| |
| \end{funcdesc} |
| |
| |
| \begin{funcdesc}{critical}{msg, *args, **kwargs} |
| |
| Log a message with severity \code{CRITICAL} on the root logger. |
| |
| \end{funcdesc} |
| |
| |
| \begin{funcdesc}{error}{msg, *args, **kwargs} |
| |
| Log a message with severity \var{ERROR} on the root logger. |
| |
| \end{funcdesc} |
| |
| |
| \begin{funcdesc}{exception}{msg, *args} |
| |
| Log a message with severity \code{ERROR} on the root logger, |
| with exception information. |
| |
| \end{funcdesc} |
| |
| \begin{funcdesc}{warn}{msg, *args, **kwargs} |
| |
| Log a message with severity \code{WARN} on the root logger. |
| |
| \end{funcdesc} |
| |
| |
| \begin{funcdesc}{info}{msg, *args, **kwargs} |
| |
| Log a message with severity \code{INFO} on the root logger. |
| |
| \end{funcdesc} |
| |
| |
| \begin{funcdesc}{debug}{msg, *args, **kwargs} |
| |
| Log a message with severity \code{DEBUG} on the root logger. |
| |
| \end{funcdesc} |
| |
| |
| \begin{funcdesc}{disable}{level} |
| |
| Disable all logging calls less severe than \code{level}. |
| |
| \end{funcdesc} |
| |
| |
| \begin{funcdesc}{shutdown}{} |
| |
| Perform any cleanup actions in the logging system (e.g. flushing buffers). |
| Should be called at application exit. |
| |
| \end{funcdesc} |
| |
| |
| |
| \subsection{Data} |
| |
| The \module{logging} module defines the following data objects: |
| |
| \begin{datadesc}{root} |
| |
| The default logger. |
| |
| \end{datadesc} |
| |
| |
| \begin{datadesc}{BASIC_FORMAT} |
| |
| The default message format. |
| |
| \end{datadesc} |
| |
| |
| \begin{datadesc}{CRITICAL} |
| |
| The \code{CRITICAL} level. |
| |
| \end{datadesc} |
| |
| |
| \begin{datadesc}{FATAL} |
| |
| The \code {FATAL} level. A synonym for \code{CRITICAL}. |
| |
| \end{datadesc} |
| |
| |
| \begin{datadesc}{WARN} |
| |
| The \code {WARN} level. |
| |
| \end{datadesc} |
| |
| |
| \begin{datadesc}{INFO} |
| |
| The \code{INFO} level. |
| |
| \end{datadesc} |
| |
| |
| \begin{datadesc}{DEBUG} |
| |
| The \code{DEBUG} level. |
| |
| \end{datadesc} |
| |
| |
| \begin{datadesc}{NOTSET} |
| |
| The \code{NOTSET} level. |
| |
| \end{datadesc} |
| |
| |
| \begin{datadesc}{raiseExceptions} |
| |
| Indicates whether exceptions during handling should be propagated. True by |
| default. |
| |
| \end{datadesc} |
| |
| |
| |
| \subsection{Classes} |
| |
| The \module{logging} module defines the following classes: |
| |
| |
| \begin{classdesc}{Formatter}{\optional{fmt=None\optional{, datefmt=None}}} |
| |
| Formatters need to know how a LogRecord is constructed. They are responsible |
| for converting a LogRecord to (usually) a string which can be interpreted by |
| either a human or an external system. The base Formatter allows a formatting |
| string to be specified. If none is supplied, the default value of |
| \code{"\%s(message)\e n"} is used. |
| |
| The Formatter can be initialized with a format string which makes use of |
| knowledge of the LogRecord attributes - e.g. the default value mentioned |
| above makes use of the fact that the user's message and arguments are pre- |
| formatted into a LogRecord's message attribute. Currently, the useful |
| attributes in a LogRecord are described by: |
| |
| \begin{description} |
| |
| \item[\%(name)s]{Name of the logger (logging channel)} |
| |
| \item[\%(levelno)s]{Numeric logging level for the message (DEBUG, INFO, |
| WARN, ERROR, CRITICAL)} |
| |
| \item[\%(levelname)s]{Text logging level for the message ("DEBUG", "INFO", |
| "WARN", "ERROR", "CRITICAL")} |
| |
| \item[\%(pathname)s]{Full pathname of the source file where the logging |
| call was issued (if available)} |
| |
| \item[\%(filename)s]{Filename portion of pathname} |
| |
| \item[\%(module)s]{Module (name portion of filename)} |
| |
| \item[\%(lineno)d]{Source line number where the logging call was issued |
| (if available)} |
| |
| \item[\%(created)f]{Time when the LogRecord was created (time.time() |
| return value)} |
| |
| \item[\%(asctime)s]{Textual time when the LogRecord was created} |
| |
| \item[\%(msecs)d]{Millisecond portion of the creation time} |
| |
| \item[\%(relativeCreated)d]{Time in milliseconds when the LogRecord was |
| created, relative to the time the logging module was loaded (typically at |
| application startup time)} |
| |
| \item[\%(thread)d]{Thread ID (if available)} |
| |
| \item[\%(message)s]{The result of record.getMessage(), computed just as the |
| record is emitted} |
| |
| \end{description} |
| |
| \end{classdesc} |
| |
| \begin{methoddesc}{format}{self, record} |
| |
| The record's attribute dictionary is used as the operand to a string |
| formatting operation which yields the returned string. Before formatting |
| the dictionary, a couple of preparatory steps are carried out. The message |
| attribute of the record is computed using \code{LogRecord.getMessage()}. If |
| the formatting string contains "\%(asctime)", \code{formatTime()} is called |
| to format the event time. If there is exception information, it is |
| formatted using \code{formatException()} and appended to the message. |
| |
| \end{methoddesc} |
| |
| \begin{methoddesc}{formatException}{self, ei} |
| |
| Format the specified exception information as a string. This default |
| implementation just uses \code{traceback.print_exception()} |
| |
| \end{methoddesc} |
| |
| \begin{methoddesc}{formatTime}{self, record\optional{, datefmt=None}} |
| |
| This method should be called from \code{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 behaviour is as |
| follows: if datefmt (a string) is specified, it is used with time.strftime() |
| to format the creation time of the record. Otherwise, the ISO8601 format is |
| used. The resulting string is returned. This function uses a |
| user-configurable function to convert the creation time to a tuple. By |
| default, \code{time.localtime()} is used; to change this for a particular |
| formatter instance, set the 'converter' attribute to a function with the |
| same signature as \code{time.localtime()} or \code{time.gmtime()}. To change |
| it for all formatters, for example if you want all logging times to be shown |
| in GMT, set the 'converter' attribute in the \class{Formatter} class. |
| |
| \end{methoddesc} |
| |
| |
| \begin{classdesc}{Filterer}{} |
| |
| A base class for loggers and handlers which allows them to share common |
| code. |
| |
| \end{classdesc} |
| |
| \begin{methoddesc}{addFilter}{filter} |
| |
| Add the specified filter to this handler. |
| |
| \end{methoddesc} |
| |
| \begin{methoddesc}{filter}{self, record} |
| |
| Determine if a record is loggable by consulting all the filters. The default |
| is to allow the record to be logged; any filter can veto this and the record |
| is then dropped. Returns a boolean value. |
| |
| \end{methoddesc} |
| |
| \begin{methoddesc}{removeFilter}{filter} |
| |
| Remove the specified filter from this handler. |
| |
| \end{methoddesc} |
| |
| |
| \begin{classdesc}{BufferingFormatter}{\optional{linefmt=None}} |
| |
| A formatter suitable for formatting a number of records. Optionally specify |
| a formatter which will be used to format each individual record. |
| |
| \end{classdesc} |
| |
| |
| \begin{methoddesc}{format}{records} |
| |
| Format the specified records and return the result as a string. |
| |
| \end{methoddesc} |
| |
| \begin{methoddesc}{formatFooter}{records} |
| |
| Return the footer string for the specified records. |
| |
| \end{methoddesc} |
| |
| \begin{methoddesc}{formatHeader}{records} |
| |
| Return the header string for the specified records. |
| |
| \end{methoddesc} |
| |
| \begin{classdesc}{BufferingHandler}{capacity} |
| |
| A handler class which buffers logging records in memory. Whenever each |
| record is added to the buffer, a check is made to see if the buffer should |
| be flushed. If it should, then \code{flush()} is expected to do the needful. |
| The handler is initialized with the buffer size. |
| |
| \end{classdesc} |
| |
| \begin{methoddesc}{emit}{record} |
| |
| Append the record. If \code{shouldFlush()} tells us to, call \code{flush()} |
| to process the buffer. |
| |
| \end{methoddesc} |
| |
| \begin{methoddesc}{flush}{} |
| |
| Override to implement custom flushing behaviour. 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}{DatagramHandler}{host,port} |
| |
| A handler class which writes logging records, in pickle format, to a |
| datagram socket. Note that the very simple wire protocol used means that |
| packet sizes are expected to be encodable within 16 bits (i.e. < 32767 |
| bytes). |
| |
| Initializes the handler with a specific \code{host} and \code{port}. |
| |
| \end{classdesc} |
| |
| \begin{methoddesc}{makeSocket}{} |
| |
| The factory method of SocketHandler is here overridden to create a UDP |
| socket (SOCK_DGRAM). |
| |
| \end{methoddesc} |
| |
| \begin{methoddesc}{send}{s} |
| |
| Send a pickled string to a socket. This function allows for partial sends |
| which can happen when the network is busy. |
| |
| \end{methoddesc} |
| |
| \begin{classdesc}{FileHandler}{filename\optional{, mode='a+'}} |
| |
| A handler class which writes formatted logging records to disk files. The |
| specified file is opened and used as the stream for logging. By default, |
| the file grows indefinitely. You can call \code{setRollover()} to allow the |
| file to rollover at a predetermined size. |
| |
| \end{classdesc} |
| |
| \begin{methoddesc}{close}{} |
| |
| Closes the stream. |
| |
| \end{methoddesc} |
| |
| \begin{methoddesc}{doRollover}{} |
| |
| Do a rollover, as described in \code{setRollover()}. |
| |
| \end{methoddesc} |
| |
| \begin{methoddesc}{emit}{record} |
| |
| Output the record to the file, catering for rollover as described |
| in \code{setRollover()}. |
| |
| \end{methoddesc} |
| |
| \begin{methoddesc}{setRollover}{maxBytes, backupCount} |
| |
| Set the rollover parameters so that rollover occurs whenever the current log |
| file is nearly \var{maxBytes} in length. If \var{backupCount} is >= 1, the |
| system will successively create new files with the same pathname as the base |
| file, but with extensions ".1", ".2" etc. appended to it. For example, with |
| a \var{backupCount} of 5 and a base file name of "app.log", you would get |
| "app.log", "app.log.1", "app.log.2", ... through to "app.log.5". When the |
| last file reaches its size limit, the logging reverts to "app.log" which is |
| truncated xto zero length. If maxBytes is zero, rollover never occurs. |
| |
| \end{methoddesc} |
| |
| \begin{classdesc}{Filter}{\optional{name=''}} |
| |
| The base filter class. \class{Logger} and \class{Handler} instances can |
| optionally use \class{Filter} instances to filter records as desired. 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. |
| |
| The instance is initialized with the name of the logger which, together with |
| its children, will have its events allowed through the filter. If no name is |
| specified, allow every event. |
| |
| \end{classdesc} |
| |
| \begin{methoddesc}{filter}{record} |
| |
| Is the specified record to be logged? Returns 0 for no, nonzero for yes. If |
| deemed appropriate, the record may be modified in-place. |
| |
| \end{methoddesc} |
| |
| |
| \begin{classdesc}{HTTPHandler}{host, url\optional{, method='GET'}} |
| |
| A class which sends records to a Web server, using either GET or POST |
| semantics. The instance is initialized with the \var{host}, the request |
| \var{url}, and the \var{method} ("GET" or "POST") |
| |
| \end{classdesc} |
| |
| \begin{methoddesc}{emit}{record} |
| |
| Send the \var{record} to the Web server as an URL-encoded dictionary |
| |
| \end{methoddesc} |
| |
| \begin{classdesc}{Handler}{\optional{level=0}} |
| |
| The base handler class. Acts as a placeholder which defines the Handler |
| interface. \class{Handler} instances can optionally use \class{Formatter} |
| instances to format records as desired. By default, no formatter is |
| specified; in this case, the 'raw' message as determined by record.message |
| is logged. Initializes the instance - basically setting the formatter to |
| None and the filter list to empty. |
| |
| XXX - what does the level do? |
| |
| \end{classdesc} |
| |
| \begin{methoddesc}{acquire}{} |
| |
| Acquire the I/O thread lock. |
| |
| \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}{createLock}{} |
| |
| Acquire a thread lock for serializing access to the underlying I/O. |
| |
| \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} |
| |
| \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}{format}{record} |
| |
| Do formatting for a \var{record} - if a formatter is set, use it. |
| Otherwise, use the default formatter for the module. |
| |
| \end{methoddesc} |
| |
| \begin{methoddesc}{handle}{record} |
| |
| Conditionally emit the specified logging \var{record}, depending on filters |
| which may have been added to the handler. Wrap the actual emission of the |
| record with acquisition/release of the I/O thread lock. |
| |
| \end{methoddesc} |
| |
| \begin{methoddesc}{handleError}{} |
| |
| This method should be called from handlers when an exception is encountered |
| during an \code{emit()} call. By default it does nothing, because by default |
| {}\var{raiseExceptions} is false, 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. |
| |
| XXX looks to me like raiseExceptions defaults to 1. |
| |
| \end{methoddesc} |
| |
| \begin{methoddesc}{release}{} |
| |
| Release the I/O thread lock. |
| |
| \end{methoddesc} |
| |
| \begin{methoddesc}{setFormatter}{formatter} |
| |
| Set the \var{formatter} for this handler. |
| |
| \end{methoddesc} |
| |
| \begin{methoddesc}{setLevel}{level} |
| |
| Set the logging \var{level} of this handler. |
| |
| \end{methoddesc} |
| |
| \begin{classdesc}{LogRecord}{name,lvl,pathname,lineno,msg,args,exc_info} |
| |
| \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 |
| \code{str(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. |
| |
| \end{classdesc} |
| |
| \begin{methoddesc}{getMessage}{} |
| |
| Return the message for this LogRecord, merging any user-supplied arguments |
| with the message. |
| |
| \end{methoddesc} |
| |
| \begin{classdesc}{Logger}{name\optional{, level=0}} |
| |
| Instances of the \class{Logger} class represent a single logging channel. A |
| "logging channel" indicates an area of an application. Exactly how an "area" |
| is defined is up to the application developer. Since an application can have |
| any number of areas, logging channels are identified by a unique |
| string. Application areas can be nested (e.g. an area of "input processing" |
| might include sub-areas "read CSV files", "read XLS files" and "read |
| Gnumeric files"). To cater for this natural nesting, channel names are |
| organized into a namespace hierarchy where levels are separated by periods, |
| much like the Java or Python package namespace. So in the instance given |
| above, channel names might be "input" for the upper level, and "input.csv", |
| "input.xls" and "input.gnu" for the sub-levels. There is no arbitrary limit |
| to the depth of nesting. |
| |
| The logger is initialized with a \var{name} and an optional \var{level}. |
| |
| \end{classdesc} |
| |
| \begin{methoddesc}{_log}{lvl, msg, args\optional{, exc_info=None}} |
| |
| Low-level logging routine which creates a \class{LogRecord} and then calls |
| all the handlers of this logger to handle the record. |
| |
| \end{methoddesc} |
| |
| \begin{methoddesc}{addHandler}{hdlr} |
| |
| Add the specified handler to this logger. |
| |
| \end{methoddesc} |
| |
| \begin{methoddesc}{callHandlers}{record} |
| |
| Loop through all handlers for this logger and its parents in the logger |
| hierarchy. If no handler was found, output a one-off error message to |
| sys.stderr. Stop searching up the hierarchy whenever a logger with the |
| "propagate" attribute set to zero is found - that will be the last logger |
| whose handlers are called. |
| |
| \end{methoddesc} |
| |
| \begin{methoddesc}{critical}{msg, *args, **kwargs} |
| |
| Log \code{msg \% args} with severity \code{CRITICAL}. To pass exception |
| information, use the keyword argument \var{exc_info} with a true value, |
| e.g., \code{logger.critical("Houston, we have a \%s", "major disaster", |
| exc_info=1)}. |
| |
| \end{methoddesc} |
| |
| \begin{methoddesc}{fatal}{msg, *args, **kwargs} |
| |
| Synonym for \method{critical}. |
| |
| \end{methoddesc} |
| |
| \begin{methoddesc}{debug}{msg, *args, **kwargs} |
| |
| Log \code{msg \% args} with severity \code{DEBUG}. To pass exception |
| information, use the keyword argument exc_info with a true value, e.g., |
| \code{logger.debug("Houston, we have a \%s", "thorny problem", exc_info=1)}. |
| |
| \end{methoddesc} |
| |
| \begin{methoddesc}{error}{msg, *args, **kwargs} |
| |
| Log \code{msg \% args} with severity \code{ERROR}. To pass exception |
| information, use the keyword argument exc_info with a true value, e.g., |
| \code{logger.error("Houston, we have a \%s", "major problem", exc_info=1)} |
| |
| \end{methoddesc} |
| |
| \begin{methoddesc}{exception}{msg, *args} |
| |
| Convenience method for logging an \code{ERROR} with exception information. |
| |
| \end{methoddesc} |
| |
| |
| \begin{methoddesc}{findCaller}{} |
| |
| Find the stack frame of the caller so that we can note the source file name |
| and line number. |
| |
| \end{methoddesc} |
| |
| \begin{methoddesc}{getEffectiveLevel}{} |
| |
| Loop through this logger and its parents in the logger hierarchy, looking |
| for a non-zero logging level. Return the first one found. |
| |
| \end{methoddesc} |
| |
| \begin{methoddesc}{handle}{record} |
| |
| Call the handlers for the specified \var{record}. This method is used for |
| unpickled records received from a socket, as well as those created |
| locally. Logger-level filtering is applied. |
| |
| \end{methoddesc} |
| |
| \begin{methoddesc}{info}{msg, *args, **kwargs} |
| |
| Log \code{msg \% args} with severity \code{INFO}. To pass exception |
| information, use the keyword argument exc_info with a true value, e.g., |
| \code{logger.info("Houston, we have a \%s", "interesting problem", |
| exc_info=1)} |
| |
| \end{methoddesc} |
| |
| \begin{methoddesc}{isEnabledFor}{lvl} |
| |
| Is this logger enabled for level \var{lvl}? |
| |
| \end{methoddesc} |
| |
| \begin{methoddesc}{log}{lvl, msg, *args, **kwargs} |
| |
| Log \code{msg \% args} with the severity \var{lvl}. To pass exception |
| information, use the keyword argument \var{exc_info} with a true value, |
| e.g., \code{logger.log(lvl, "We have a \%s", "mysterious problem", |
| exc_info=1)} |
| |
| \end{methoddesc} |
| |
| \begin{methoddesc}{makeRecord}{name, lvl, fn, lno, msg, args, exc_info} |
| |
| A factory method which can be overridden in subclasses to create specialized |
| \code{LogRecord} instances. |
| |
| \end{methoddesc} |
| |
| \begin{methoddesc}{removeHandler}{hdlr} |
| |
| Remove the specified handler from this logger. |
| |
| \end{methoddesc} |
| |
| \begin{methoddesc}{setLevel}{level} |
| |
| Set the logging \var{level} of this logger. |
| |
| \end{methoddesc} |
| |
| \begin{methoddesc}{warn}{msg, *args, **kwargs} |
| |
| Log \code{msg \% args} with severity \code{WARN}. To pass exception |
| information, use the keyword argument exc_info with a true value, e.g., |
| \code{logger.warn("Houston, we have a \%s", "bit of a problem", exc_info=1)} |
| |
| \end{methoddesc} |
| |
| |
| \begin{classdesc}{Manager}{root} |
| |
| There is (under normal circumstances) just one \code{Manager} instance, |
| which holds the hierarchy of loggers. |
| |
| The manager is initialized with the \var{root} node of the logger hierarchy. |
| |
| \end{classdesc} |
| |
| \begin{methoddesc}{_fixupChildren}{ph, logger} |
| |
| Ensure that children of the placeholder \var{ph} are connected to the |
| specified \code{logger}. |
| |
| \end{methoddesc} |
| |
| \begin{methoddesc}{_fixupParents}{logger} |
| |
| Ensure that there are either loggers or placeholders all the way from the |
| specified \var{logger} to the root of the logger hierarchy. |
| |
| \end{methoddesc} |
| |
| \begin{methoddesc}{getLogger}{name} |
| |
| Get a logger with the specified \var{name} (channel name), creating it if it |
| doesn't yet exist. If a PlaceHolder existed for the specified name (i.e. the |
| logger didn't exist but a child of it did), replace it with the created |
| logger and fix up the parent/child references which pointed to the |
| placeholder to now point to the logger. |
| |
| \end{methoddesc} |
| |
| \begin{classdesc}{MemoryHandler}{capacity\optional{, |
| flushLevel=40\optional{, target=None}}} |
| |
| A handler class which buffers logging records in memory, periodically |
| flushing them to a target handler. Flushing occurs whenever the buffer is |
| full, or when an event of a certain severity or greater is seen. |
| |
| The handler is initialized with the buffer size (\var{capacity}), the level |
| at which flushing should occur (\var{flushLevel}) and an optional |
| {}\var{target}. Note that without a target being set either here or via |
| \code{setTarget()}, a \class{MemoryHandler} is no use to anyone! |
| |
| \end{classdesc} |
| |
| \begin{methoddesc}{close}{} |
| |
| Flush, set the target to None and lose 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} |
| |
| Set the \var{target} handler for this handler. |
| |
| \end{methoddesc} |
| |
| \begin{methoddesc}{shouldFlush}{record} |
| |
| Check for buffer full or a \var{record} at the flushLevel or higher. |
| |
| \end{methoddesc} |
| |
| |
| \begin{classdesc}{NTEventLogHandler}{appname\optional{, |
| dllname=None\optional{, logtype='Application'}}} |
| |
| A handler class which sends events to the NT Event Log. Adds a registry |
| entry for the specified application name. If no \var{dllname} is provided, |
| \code{win32service.pyd} (which contains some basic message placeholders) is |
| used. 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 which contains the message |
| definitions you want to use in the event log. |
| |
| XXX what is \var{logtype}? |
| |
| \end{classdesc} |
| |
| \begin{methoddesc}{close}{} |
| |
| 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. |
| |
| \end{methoddesc} |
| |
| \begin{methoddesc}{emit}{record} |
| |
| Determine the message ID, event category and event type. Then log the |
| \var{record} in the NT event log. |
| |
| \end{methoddesc} |
| |
| \begin{methoddesc}{getEventCategory}{record} |
| |
| Return the event category for the \var{record}. Override this if you want |
| to specify your own categories. This version returns 0. |
| |
| \end{methoddesc} |
| |
| \begin{methoddesc}{getEventType}{record} |
| |
| Return the event type for the \var{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 the constructor to a dictionary which |
| contains mappings for \var{DEBUG}, \var{INFO}, \var{WARN}, \var{ERROR} and |
| {}\var{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 typemap |
| attribute. |
| |
| \end{methoddesc} |
| |
| \begin{methoddesc}{getMessageID}{record} |
| |
| Return the message ID for the event \var{record}. If you are using your own |
| messages, you could do this by having the msg passed to the logger being an |
| ID rather than a formatting 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 \code{win32service.pyd}. |
| |
| \end{methoddesc} |
| |
| |
| \begin{classdesc}PlaceHolder{logger} |
| |
| \class{PlaceHolder} instances are used in the \class{Manager} logger |
| hierarchy to take the place of nodes for which no loggers have been defined |
| |
| Initialize with the specified \var{logger} being a child of this |
| \class{PlaceHolder}. |
| |
| \end{classdesc} |
| |
| \begin{methoddesc}{append}{logger} |
| |
| Add the specified \var{logger} as a child of this placeholder. |
| |
| \end{methoddesc} |
| |
| \begin{classdesc}RootLogger{level} |
| |
| A root logger is not that different to any other logger, except that it must |
| have a logging \var{level} and there is only one instance of it in the |
| hierarchy. |
| |
| \end{classdesc} |
| |
| |
| \begin{classdesc}{SMTPHandler}{mailhost, fromaddr, toaddr, subject} |
| |
| A handler class which sends an SMTP email for each logging event. |
| |
| The instance is initialized with the from (\var{fromaddr}) and to |
| (\var{toaddr}) addresses and \var{subject} line of the email. To specify a |
| non-standard SMTP port, use the (host, port) tuple format for the |
| \var{mailhost} argument. |
| |
| \end{classdesc} |
| |
| |
| \begin{methoddesc}{emit}{record} |
| |
| Format the \var{record} and send it to the specified addressees. |
| |
| \end{methoddesc} |
| |
| \begin{methoddesc}{getSubject}{record} |
| |
| If you want to specify a subject line which is \var{record}-dependent, |
| override this method. |
| |
| \end{methoddesc} |
| |
| \begin{classdesc}{SocketHandler}{host, port} |
| |
| A handler class which writes pickled logging records to a streaming |
| socket. The socket is kept open across logging calls. If the peer resets |
| it, an attempt is made to reconnect on the next call. Note that the very |
| simple wire protocol used means that packet sizes are expected to be |
| encodable within 16 bits (i.e. < 32767 bytes). |
| |
| The handler is initialized with a specific \var{host} address and |
| {}\var{port}. The attribute \var{closeOnError} is set to 1 - which means |
| that if a socket error occurs, the socket is silently closed and then |
| reopened on the next logging call. |
| |
| \end{classdesc} |
| |
| \begin{methoddesc}{close}{} |
| |
| Closes the socket. |
| |
| \end{methoddesc} |
| |
| \begin{methoddesc}{emit}{record} |
| |
| Pickles the \var{record} and writes it to the socket in binary format. If |
| there is an error with the socket, silently drop the packet. If there was a |
| problem with the socket, re-establishes the socket. |
| |
| \end{methoddesc} |
| |
| \begin{methoddesc}{handleError}{} |
| |
| An error has occurred during logging. Most likely cause - connection lost. |
| Close the socket so that we can retry on the next event. |
| |
| \end{methoddesc} |
| |
| \begin{methoddesc}{makePickle}{record} |
| |
| Pickles the \var{record} in binary format with a length prefix, and returns |
| it ready for transmission across the socket. |
| |
| \end{methoddesc} |
| |
| \begin{methoddesc}{makeSocket}{} |
| |
| A factory method which allows subclasses to define the precise type of |
| socket they want. |
| |
| \end{methoddesc} |
| |
| \begin{methoddesc}{send}{s} |
| |
| Send a pickled string (\var{s}) to the socket. This function allows for |
| partial sends which can happen when the network is busy. |
| |
| \end{methoddesc} |
| |
| \begin{classdesc}{StreamHandler}{\optional{strm=None}} |
| |
| A handler class which writes logging records, appropriately formatted, to a |
| stream. Note that this class does not close the stream, as \var{sys.stdout} |
| or \var{sys.stderr} may be used. |
| |
| If \var{strm} is not specified, \var{sys.stderr} is used. |
| |
| \end{classdesc} |
| |
| \begin{methoddesc}{emit}{record} |
| |
| If a formatter is specified, it is used to format the \var{record}. The |
| record is then written to the stream with a trailing newline (N.B. this may |
| be removed depending on feedback). If exception information is present, it |
| is formatted using \var{traceback.print_exception} and appended to the |
| stream. |
| |
| \end{methoddesc} |
| |
| \begin{methoddesc}{flush}{} |
| |
| Flushes the stream. |
| |
| \end{methoddesc} |
| |
| \begin{classdesc}{SysLogHandler}{\optional{address=('localhost', |
| 514)\optional{, facility=1}}} |
| |
| A handler class which sends formatted logging records to a syslog |
| server. Based on Sam Rushing's |
| \ulink{http://www.nightmare.com/squirl/python-ext/misc/syslog.py}{syslog |
| module}. Contributed by Nicolas Untz (after which minor refactoring changes |
| have been made). |
| |
| If \var{address} is specified as a string, UNIX socket is used. If |
| \var{facility} is not specified, \code{LOG_USER} is used. |
| |
| \end{classdesc} |
| |
| \begin{methoddesc}{close}{} |
| |
| Closes the socket. |
| |
| \end{methoddesc} |
| |
| \begin{methoddesc}{emit}{record} |
| |
| The \var{record} is formatted, and then sent to the syslog server. If |
| exception information is present, it is not sent to the server. |
| |
| \end{methoddesc} |
| |
| \begin{methoddesc}{encodePriority}{facility, priority} |
| |
| Encode the \var{facility} and \var{priority}. You can pass in strings or |
| integers - if strings are passed, the \var{facility_names} and |
| \var{priority_names} mapping dictionaries are used to convert them to |
| integers. |
| |
| \end{methoddesc} |
| |
| |
| \subsection{Examples \label{logging-example}} |
| |
| Using the package doesn't get much simpler. It is packaged as a Python |
| package. You just need to \code{import logging} and you're ready to |
| go. Minimal example: |
| |
| \begin{verbatim} |
| # -- app.py -- |
| import logging |
| |
| logging.info("Starting...") |
| logging.warn("Nothing to do!") |
| logging.info("Done...") |
| \end{verbatim} |
| |
| When you run \code{app.py}, the results are: |
| |
| \begin{verbatim} |
| 2002-03-15 01:09:10,440 root INFO - Starting... |
| 2002-03-15 01:09:10,440 root WARN - Nothing to do! |
| 2002-03-15 01:09:10,440 root INFO - Done... |
| \end{verbatim} |
| |
| |
| |
| Here's a |
| slightly more involved example; if you've just looked at \pep{282} you will |
| probably get a feeling of dejà vu. (This is intentional.) |
| |
| \begin{verbatim} |
| # -- mymodule.py -- |
| import logging |
| log = logging.getLogger("MyModule") |
| |
| def doIt(): |
| log.debug("doin' stuff") |
| #do stuff...but suppose an error occurs? |
| raise TypeError, "bogus type error for testing" |
| \end{verbatim} |
| |
| \begin{verbatim} |
| # -- myapp.py -- |
| import logging, mymodule |
| |
| logging.basicConfig() # basic configuration - console output |
| |
| log = logging.getLogger("MyApp") |
| |
| log.info("start my app") |
| try: |
| mymodule.doIt() |
| except Exception, e: |
| log.exception("There was a problem doin' stuff.") |
| log.info("end my app") |
| \end{verbatim} |
| |
| When you run \code{myapp.py}, the results are: |
| |
| \begin{verbatim} |
| 2002-03-14 23:40:49,299 MyApp INFO - start my app |
| 2002-03-14 23:40:49,299 MyModule DEBUG - doin' stuff |
| 2002-03-14 23:40:49,299 MyApp ERROR - There was a problem doin' stuff. |
| Traceback (innermost last): |
| File "myapp.py", line 9, in ? |
| mymodule.doIt() |
| File "mymodule.py", line 7, in doIt |
| raise TypeError, "bogus type error for testing" |
| TypeError: bogus type error for testing |
| 2002-03-14 23:40:49,409 MyApp INFO - end my app |
| \end{verbatim} |