Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 1 | \section{\module{logging} --- |
| 2 | Logging facility for Python} |
| 3 | |
Fred Drake | 9a5b6a6 | 2003-07-08 15:38:40 +0000 | [diff] [blame] | 4 | \declaremodule{standard}{logging} |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 5 | |
| 6 | % These apply to all modules, and may be given more than once: |
| 7 | |
| 8 | \moduleauthor{Vinay Sajip}{vinay_sajip@red-dove.com} |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 9 | \sectionauthor{Vinay Sajip}{vinay_sajip@red-dove.com} |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 10 | |
Fred Drake | 68e6d57 | 2003-01-28 22:02:35 +0000 | [diff] [blame] | 11 | \modulesynopsis{Logging module for Python based on \pep{282}.} |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 12 | |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 13 | \indexii{Errors}{logging} |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 14 | |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 15 | \versionadded{2.3} |
| 16 | This module defines functions and classes which implement a flexible |
| 17 | error logging system for applications. |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 18 | |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 19 | Logging is performed by calling methods on instances of the |
| 20 | \class{Logger} class (hereafter called \dfn{loggers}). Each instance has a |
| 21 | name, and they are conceptually arranged in a name space hierarchy |
| 22 | using dots (periods) as separators. For example, a logger named |
| 23 | "scan" is the parent of loggers "scan.text", "scan.html" and "scan.pdf". |
| 24 | Logger names can be anything you want, and indicate the area of an |
| 25 | application in which a logged message originates. |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 26 | |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 27 | Logged messages also have levels of importance associated with them. |
| 28 | The default levels provided are \constant{DEBUG}, \constant{INFO}, |
| 29 | \constant{WARNING}, \constant{ERROR} and \constant{CRITICAL}. As a |
| 30 | convenience, you indicate the importance of a logged message by calling |
| 31 | an appropriate method of \class{Logger}. The methods are |
Fred Drake | c23e019 | 2003-01-28 22:09:16 +0000 | [diff] [blame] | 32 | \method{debug()}, \method{info()}, \method{warning()}, \method{error()} and |
| 33 | \method{critical()}, which mirror the default levels. You are not |
| 34 | constrained to use these levels: you can specify your own and use a |
| 35 | more general \class{Logger} method, \method{log()}, which takes an |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 36 | explicit level argument. |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 37 | |
Vinay Sajip | e8fdc45 | 2004-12-02 21:27:42 +0000 | [diff] [blame] | 38 | The numeric values of logging levels are given in the following table. These |
| 39 | are primarily of interest if you want to define your own levels, and need |
| 40 | them to have specific values relative to the predefined levels. If you |
| 41 | define a level with the same numeric value, it overwrites the predefined |
| 42 | value; the predefined name is lost. |
| 43 | |
| 44 | \begin{tableii}{l|l}{code}{Level}{Numeric value} |
| 45 | \lineii{CRITICAL}{50} |
| 46 | \lineii{ERROR}{40} |
| 47 | \lineii{WARNING}{30} |
| 48 | \lineii{INFO}{20} |
| 49 | \lineii{DEBUG}{10} |
| 50 | \lineii{NOTSET}{0} |
| 51 | \end{tableii} |
| 52 | |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 53 | Levels can also be associated with loggers, being set either by the |
| 54 | developer or through loading a saved logging configuration. When a |
| 55 | logging method is called on a logger, the logger compares its own |
| 56 | level with the level associated with the method call. If the logger's |
| 57 | level is higher than the method call's, no logging message is actually |
| 58 | generated. This is the basic mechanism controlling the verbosity of |
| 59 | logging output. |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 60 | |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 61 | Logging messages are encoded as instances of the \class{LogRecord} class. |
Georg Brandl | 0f19423 | 2006-01-01 21:35:20 +0000 | [diff] [blame] | 62 | When a logger decides to actually log an event, a \class{LogRecord} |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 63 | instance is created from the logging message. |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 64 | |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 65 | Logging messages are subjected to a dispatch mechanism through the |
| 66 | use of \dfn{handlers}, which are instances of subclasses of the |
| 67 | \class{Handler} class. Handlers are responsible for ensuring that a logged |
| 68 | message (in the form of a \class{LogRecord}) ends up in a particular |
| 69 | location (or set of locations) which is useful for the target audience for |
Raymond Hettinger | 6f3eaa6 | 2003-06-27 21:43:39 +0000 | [diff] [blame] | 70 | that message (such as end users, support desk staff, system administrators, |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 71 | developers). Handlers are passed \class{LogRecord} instances intended for |
| 72 | particular destinations. Each logger can have zero, one or more handlers |
Fred Drake | 6b3b046 | 2004-04-09 18:26:40 +0000 | [diff] [blame] | 73 | associated with it (via the \method{addHandler()} method of \class{Logger}). |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 74 | In addition to any handlers directly associated with a logger, |
Fred Drake | c23e019 | 2003-01-28 22:09:16 +0000 | [diff] [blame] | 75 | \emph{all handlers associated with all ancestors of the logger} are |
| 76 | called to dispatch the message. |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 77 | |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 78 | Just as for loggers, handlers can have levels associated with them. |
| 79 | A handler's level acts as a filter in the same way as a logger's level does. |
Fred Drake | c23e019 | 2003-01-28 22:09:16 +0000 | [diff] [blame] | 80 | If a handler decides to actually dispatch an event, the \method{emit()} method |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 81 | is used to send the message to its destination. Most user-defined subclasses |
Fred Drake | c23e019 | 2003-01-28 22:09:16 +0000 | [diff] [blame] | 82 | of \class{Handler} will need to override this \method{emit()}. |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 83 | |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 84 | In addition to the base \class{Handler} class, many useful subclasses |
| 85 | are provided: |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 86 | |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 87 | \begin{enumerate} |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 88 | |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 89 | \item \class{StreamHandler} instances send error messages to |
| 90 | streams (file-like objects). |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 91 | |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 92 | \item \class{FileHandler} instances send error messages to disk |
| 93 | files. |
| 94 | |
Andrew M. Kuchling | e024514 | 2005-08-18 21:45:31 +0000 | [diff] [blame] | 95 | \item \class{BaseRotatingHandler} is the base class for handlers that |
Johannes Gijsbers | f164322 | 2004-11-07 16:11:35 +0000 | [diff] [blame] | 96 | rotate log files at a certain point. It is not meant to be instantiated |
Vinay Sajip | edde492 | 2004-11-11 13:54:48 +0000 | [diff] [blame] | 97 | directly. Instead, use \class{RotatingFileHandler} or |
| 98 | \class{TimedRotatingFileHandler}. |
Johannes Gijsbers | f164322 | 2004-11-07 16:11:35 +0000 | [diff] [blame] | 99 | |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 100 | \item \class{RotatingFileHandler} instances send error messages to disk |
| 101 | files, with support for maximum log file sizes and log file rotation. |
| 102 | |
Johannes Gijsbers | 4f802ac | 2004-11-07 14:14:27 +0000 | [diff] [blame] | 103 | \item \class{TimedRotatingFileHandler} instances send error messages to |
| 104 | disk files rotating the log file at certain timed intervals. |
| 105 | |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 106 | \item \class{SocketHandler} instances send error messages to |
| 107 | TCP/IP sockets. |
| 108 | |
| 109 | \item \class{DatagramHandler} instances send error messages to UDP |
| 110 | sockets. |
| 111 | |
| 112 | \item \class{SMTPHandler} instances send error messages to a |
| 113 | designated email address. |
| 114 | |
| 115 | \item \class{SysLogHandler} instances send error messages to a |
Fred Drake | 68e6d57 | 2003-01-28 22:02:35 +0000 | [diff] [blame] | 116 | \UNIX{} syslog daemon, possibly on a remote machine. |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 117 | |
| 118 | \item \class{NTEventLogHandler} instances send error messages to a |
| 119 | Windows NT/2000/XP event log. |
| 120 | |
| 121 | \item \class{MemoryHandler} instances send error messages to a |
| 122 | buffer in memory, which is flushed whenever specific criteria are |
| 123 | met. |
| 124 | |
| 125 | \item \class{HTTPHandler} instances send error messages to an |
Fred Drake | 68e6d57 | 2003-01-28 22:02:35 +0000 | [diff] [blame] | 126 | HTTP server using either \samp{GET} or \samp{POST} semantics. |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 127 | |
| 128 | \end{enumerate} |
| 129 | |
| 130 | The \class{StreamHandler} and \class{FileHandler} classes are defined |
| 131 | in the core logging package. The other handlers are defined in a sub- |
| 132 | module, \module{logging.handlers}. (There is also another sub-module, |
| 133 | \module{logging.config}, for configuration functionality.) |
| 134 | |
| 135 | Logged messages are formatted for presentation through instances of the |
| 136 | \class{Formatter} class. They are initialized with a format string |
| 137 | suitable for use with the \% operator and a dictionary. |
| 138 | |
| 139 | For formatting multiple messages in a batch, instances of |
| 140 | \class{BufferingFormatter} can be used. In addition to the format string |
| 141 | (which is applied to each message in the batch), there is provision for |
| 142 | header and trailer format strings. |
| 143 | |
| 144 | When filtering based on logger level and/or handler level is not enough, |
| 145 | instances of \class{Filter} can be added to both \class{Logger} and |
Fred Drake | c23e019 | 2003-01-28 22:09:16 +0000 | [diff] [blame] | 146 | \class{Handler} instances (through their \method{addFilter()} method). |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 147 | Before deciding to process a message further, both loggers and handlers |
| 148 | consult all their filters for permission. If any filter returns a false |
| 149 | value, the message is not processed further. |
| 150 | |
| 151 | The basic \class{Filter} functionality allows filtering by specific logger |
| 152 | name. If this feature is used, messages sent to the named logger and its |
| 153 | children are allowed through the filter, and all others dropped. |
| 154 | |
| 155 | In addition to the classes described above, there are a number of module- |
| 156 | level functions. |
| 157 | |
| 158 | \begin{funcdesc}{getLogger}{\optional{name}} |
| 159 | Return a logger with the specified name or, if no name is specified, return |
Vinay Sajip | 17952b7 | 2004-08-31 10:21:51 +0000 | [diff] [blame] | 160 | a logger which is the root logger of the hierarchy. If specified, the name |
| 161 | is typically a dot-separated hierarchical name like \var{"a"}, \var{"a.b"} |
| 162 | or \var{"a.b.c.d"}. Choice of these names is entirely up to the developer |
| 163 | who is using logging. |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 164 | |
| 165 | All calls to this function with a given name return the same logger instance. |
| 166 | This means that logger instances never need to be passed between different |
| 167 | parts of an application. |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 168 | \end{funcdesc} |
| 169 | |
Vinay Sajip | c6646c0 | 2004-09-22 12:55:16 +0000 | [diff] [blame] | 170 | \begin{funcdesc}{getLoggerClass}{} |
| 171 | Return either the standard \class{Logger} class, or the last class passed to |
| 172 | \function{setLoggerClass()}. This function may be called from within a new |
| 173 | class definition, to ensure that installing a customised \class{Logger} class |
| 174 | will not undo customisations already applied by other code. For example: |
| 175 | |
| 176 | \begin{verbatim} |
| 177 | class MyLogger(logging.getLoggerClass()): |
| 178 | # ... override behaviour here |
| 179 | \end{verbatim} |
| 180 | |
| 181 | \end{funcdesc} |
| 182 | |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 183 | \begin{funcdesc}{debug}{msg\optional{, *args\optional{, **kwargs}}} |
| 184 | Logs a message with level \constant{DEBUG} on the root logger. |
| 185 | The \var{msg} is the message format string, and the \var{args} are the |
Vinay Sajip | b4549c4 | 2006-02-09 08:54:11 +0000 | [diff] [blame] | 186 | arguments which are merged into \var{msg} using the string formatting |
| 187 | operator. (Note that this means that you can use keywords in the |
| 188 | format string, together with a single dictionary argument.) |
| 189 | |
| 190 | There are two keyword arguments in \var{kwargs} which are inspected: |
| 191 | \var{exc_info} which, if it does not evaluate as false, causes exception |
| 192 | information to be added to the logging message. If an exception tuple (in the |
| 193 | format returned by \function{sys.exc_info()}) is provided, it is used; |
| 194 | otherwise, \function{sys.exc_info()} is called to get the exception |
| 195 | information. |
| 196 | |
| 197 | The other optional keyword argument is \var{extra} which can be used to pass |
| 198 | a dictionary which is used to populate the __dict__ of the LogRecord created |
| 199 | for the logging event with user-defined attributes. These custom attributes |
| 200 | can then be used as you like. For example, they could be incorporated into |
| 201 | logged messages. For example: |
| 202 | |
| 203 | \begin{verbatim} |
| 204 | FORMAT = "%(asctime)-15s %(clientip)s %(user)-8s %(message)s" |
| 205 | logging.basicConfig(format=FORMAT) |
| 206 | dict = { 'clientip' : '192.168.0.1', 'user' : 'fbloggs' } |
| 207 | logging.warning("Protocol problem: %s", "connection reset", extra=d) |
| 208 | \end{verbatim} |
| 209 | |
| 210 | would print something like |
| 211 | \begin{verbatim} |
| 212 | 2006-02-08 22:20:02,165 192.168.0.1 fbloggs Protocol problem: connection reset |
| 213 | \end{verbatim} |
| 214 | |
| 215 | The keys in the dictionary passed in \var{extra} should not clash with the keys |
| 216 | used by the logging system. (See the \class{Formatter} documentation for more |
| 217 | information on which keys are used by the logging system.) |
| 218 | |
| 219 | If you choose to use these attributes in logged messages, you need to exercise |
| 220 | some care. In the above example, for instance, the \class{Formatter} has been |
| 221 | set up with a format string which expects 'clientip' and 'user' in the |
| 222 | attribute dictionary of the LogRecord. If these are missing, the message will |
| 223 | not be logged because a string formatting exception will occur. So in this |
| 224 | case, you always need to pass the \var{extra} dictionary with these keys. |
| 225 | |
| 226 | While this might be annoying, this feature is intended for use in specialized |
| 227 | circumstances, such as multi-threaded servers where the same code executes |
| 228 | in many contexts, and interesting conditions which arise are dependent on this |
| 229 | context (such as remote client IP address and authenticated user name, in the |
| 230 | above example). In such circumstances, it is likely that specialized |
| 231 | \class{Formatter}s would be used with particular \class{Handler}s. |
Vinay Sajip | 55aafab | 2006-02-15 21:47:32 +0000 | [diff] [blame] | 232 | |
| 233 | \versionchanged[\var{extra} was added]{2.5} |
| 234 | |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 235 | \end{funcdesc} |
| 236 | |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 237 | \begin{funcdesc}{info}{msg\optional{, *args\optional{, **kwargs}}} |
| 238 | Logs a message with level \constant{INFO} on the root logger. |
| 239 | The arguments are interpreted as for \function{debug()}. |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 240 | \end{funcdesc} |
| 241 | |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 242 | \begin{funcdesc}{warning}{msg\optional{, *args\optional{, **kwargs}}} |
| 243 | Logs a message with level \constant{WARNING} on the root logger. |
| 244 | The arguments are interpreted as for \function{debug()}. |
| 245 | \end{funcdesc} |
| 246 | |
| 247 | \begin{funcdesc}{error}{msg\optional{, *args\optional{, **kwargs}}} |
| 248 | Logs a message with level \constant{ERROR} on the root logger. |
| 249 | The arguments are interpreted as for \function{debug()}. |
| 250 | \end{funcdesc} |
| 251 | |
| 252 | \begin{funcdesc}{critical}{msg\optional{, *args\optional{, **kwargs}}} |
| 253 | Logs a message with level \constant{CRITICAL} on the root logger. |
| 254 | The arguments are interpreted as for \function{debug()}. |
| 255 | \end{funcdesc} |
| 256 | |
| 257 | \begin{funcdesc}{exception}{msg\optional{, *args}} |
| 258 | Logs a message with level \constant{ERROR} on the root logger. |
| 259 | The arguments are interpreted as for \function{debug()}. Exception info |
| 260 | is added to the logging message. This function should only be called |
| 261 | from an exception handler. |
| 262 | \end{funcdesc} |
| 263 | |
Vinay Sajip | 739d49e | 2004-09-24 11:46:44 +0000 | [diff] [blame] | 264 | \begin{funcdesc}{log}{level, msg\optional{, *args\optional{, **kwargs}}} |
| 265 | Logs a message with level \var{level} on the root logger. |
| 266 | The other arguments are interpreted as for \function{debug()}. |
| 267 | \end{funcdesc} |
| 268 | |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 269 | \begin{funcdesc}{disable}{lvl} |
| 270 | Provides an overriding level \var{lvl} for all loggers which takes |
| 271 | precedence over the logger's own level. When the need arises to |
| 272 | temporarily throttle logging output down across the whole application, |
| 273 | this function can be useful. |
| 274 | \end{funcdesc} |
| 275 | |
| 276 | \begin{funcdesc}{addLevelName}{lvl, levelName} |
| 277 | Associates level \var{lvl} with text \var{levelName} in an internal |
| 278 | dictionary, which is used to map numeric levels to a textual |
| 279 | representation, for example when a \class{Formatter} formats a message. |
| 280 | This function can also be used to define your own levels. The only |
| 281 | constraints are that all levels used must be registered using this |
| 282 | function, levels should be positive integers and they should increase |
| 283 | in increasing order of severity. |
| 284 | \end{funcdesc} |
| 285 | |
| 286 | \begin{funcdesc}{getLevelName}{lvl} |
| 287 | Returns the textual representation of logging level \var{lvl}. If the |
| 288 | level is one of the predefined levels \constant{CRITICAL}, |
| 289 | \constant{ERROR}, \constant{WARNING}, \constant{INFO} or \constant{DEBUG} |
| 290 | then you get the corresponding string. If you have associated levels |
| 291 | with names using \function{addLevelName()} then the name you have associated |
Vinay Sajip | a13c60b | 2004-07-03 11:45:53 +0000 | [diff] [blame] | 292 | with \var{lvl} is returned. If a numeric value corresponding to one of the |
| 293 | defined levels is passed in, the corresponding string representation is |
| 294 | returned. Otherwise, the string "Level \%s" \% lvl is returned. |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 295 | \end{funcdesc} |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 296 | |
Raymond Hettinger | 6f3eaa6 | 2003-06-27 21:43:39 +0000 | [diff] [blame] | 297 | \begin{funcdesc}{makeLogRecord}{attrdict} |
| 298 | Creates and returns a new \class{LogRecord} instance whose attributes are |
| 299 | defined by \var{attrdict}. This function is useful for taking a pickled |
| 300 | \class{LogRecord} attribute dictionary, sent over a socket, and reconstituting |
| 301 | it as a \class{LogRecord} instance at the receiving end. |
| 302 | \end{funcdesc} |
| 303 | |
Vinay Sajip | c320c22 | 2005-07-29 11:52:19 +0000 | [diff] [blame] | 304 | \begin{funcdesc}{basicConfig}{\optional{**kwargs}} |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 305 | Does basic configuration for the logging system by creating a |
| 306 | \class{StreamHandler} with a default \class{Formatter} and adding it to |
| 307 | the root logger. The functions \function{debug()}, \function{info()}, |
| 308 | \function{warning()}, \function{error()} and \function{critical()} will call |
| 309 | \function{basicConfig()} automatically if no handlers are defined for the |
| 310 | root logger. |
Vinay Sajip | c320c22 | 2005-07-29 11:52:19 +0000 | [diff] [blame] | 311 | |
| 312 | \versionchanged[Formerly, \function{basicConfig} did not take any keyword |
| 313 | arguments]{2.4} |
| 314 | |
| 315 | The following keyword arguments are supported. |
| 316 | |
| 317 | \begin{tableii}{l|l}{code}{Format}{Description} |
| 318 | \lineii{filename}{Specifies that a FileHandler be created, using the |
| 319 | specified filename, rather than a StreamHandler.} |
| 320 | \lineii{filemode}{Specifies the mode to open the file, if filename is |
| 321 | specified (if filemode is unspecified, it defaults to 'a').} |
| 322 | \lineii{format}{Use the specified format string for the handler.} |
| 323 | \lineii{datefmt}{Use the specified date/time format.} |
| 324 | \lineii{level}{Set the root logger level to the specified level.} |
| 325 | \lineii{stream}{Use the specified stream to initialize the StreamHandler. |
| 326 | Note that this argument is incompatible with 'filename' - if both |
| 327 | are present, 'stream' is ignored.} |
| 328 | \end{tableii} |
| 329 | |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 330 | \end{funcdesc} |
| 331 | |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 332 | \begin{funcdesc}{shutdown}{} |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 333 | Informs the logging system to perform an orderly shutdown by flushing and |
| 334 | closing all handlers. |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 335 | \end{funcdesc} |
| 336 | |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 337 | \begin{funcdesc}{setLoggerClass}{klass} |
| 338 | Tells the logging system to use the class \var{klass} when instantiating a |
| 339 | logger. The class should define \method{__init__()} such that only a name |
| 340 | argument is required, and the \method{__init__()} should call |
| 341 | \method{Logger.__init__()}. This function is typically called before any |
| 342 | loggers are instantiated by applications which need to use custom logger |
| 343 | behavior. |
| 344 | \end{funcdesc} |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 345 | |
Fred Drake | 68e6d57 | 2003-01-28 22:02:35 +0000 | [diff] [blame] | 346 | |
| 347 | \begin{seealso} |
| 348 | \seepep{282}{A Logging System} |
| 349 | {The proposal which described this feature for inclusion in |
| 350 | the Python standard library.} |
Fred Drake | 1151479 | 2004-01-08 14:59:02 +0000 | [diff] [blame] | 351 | \seelink{http://www.red-dove.com/python_logging.html} |
| 352 | {Original Python \module{logging} package} |
| 353 | {This is the original source for the \module{logging} |
| 354 | package. The version of the package available from this |
Vinay Sajip | a13c60b | 2004-07-03 11:45:53 +0000 | [diff] [blame] | 355 | site is suitable for use with Python 1.5.2, 2.1.x and 2.2.x, |
| 356 | which do not include the \module{logging} package in the standard |
Fred Drake | 1151479 | 2004-01-08 14:59:02 +0000 | [diff] [blame] | 357 | library.} |
Fred Drake | 68e6d57 | 2003-01-28 22:02:35 +0000 | [diff] [blame] | 358 | \end{seealso} |
| 359 | |
| 360 | |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 361 | \subsection{Logger Objects} |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 362 | |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 363 | Loggers have the following attributes and methods. Note that Loggers are |
| 364 | never instantiated directly, but always through the module-level function |
| 365 | \function{logging.getLogger(name)}. |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 366 | |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 367 | \begin{datadesc}{propagate} |
| 368 | If this evaluates to false, logging messages are not passed by this |
| 369 | logger or by child loggers to higher level (ancestor) loggers. The |
| 370 | constructor sets this attribute to 1. |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 371 | \end{datadesc} |
| 372 | |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 373 | \begin{methoddesc}{setLevel}{lvl} |
| 374 | Sets the threshold for this logger to \var{lvl}. Logging messages |
| 375 | which are less severe than \var{lvl} will be ignored. When a logger is |
Neal Norwitz | 6fa635d | 2003-02-18 14:20:07 +0000 | [diff] [blame] | 376 | created, the level is set to \constant{NOTSET} (which causes all messages |
Vinay Sajip | e8fdc45 | 2004-12-02 21:27:42 +0000 | [diff] [blame] | 377 | to be processed when the logger is the root logger, or delegation to the |
| 378 | parent when the logger is a non-root logger). Note that the root logger |
| 379 | is created with level \constant{WARNING}. |
Vinay Sajip | d1c0239 | 2005-09-26 00:14:46 +0000 | [diff] [blame] | 380 | |
| 381 | The term "delegation to the parent" means that if a logger has a level |
| 382 | of NOTSET, its chain of ancestor loggers is traversed until either an |
| 383 | ancestor with a level other than NOTSET is found, or the root is |
| 384 | reached. |
| 385 | |
| 386 | If an ancestor is found with a level other than NOTSET, then that |
| 387 | ancestor's level is treated as the effective level of the logger where |
| 388 | the ancestor search began, and is used to determine how a logging |
| 389 | event is handled. |
| 390 | |
| 391 | If the root is reached, and it has a level of NOTSET, then all |
| 392 | messages will be processed. Otherwise, the root's level will be used |
| 393 | as the effective level. |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 394 | \end{methoddesc} |
| 395 | |
| 396 | \begin{methoddesc}{isEnabledFor}{lvl} |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 397 | Indicates if a message of severity \var{lvl} would be processed by |
| 398 | this logger. This method checks first the module-level level set by |
| 399 | \function{logging.disable(lvl)} and then the logger's effective level as |
| 400 | determined by \method{getEffectiveLevel()}. |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 401 | \end{methoddesc} |
| 402 | |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 403 | \begin{methoddesc}{getEffectiveLevel}{} |
| 404 | Indicates the effective level for this logger. If a value other than |
Neal Norwitz | 6fa635d | 2003-02-18 14:20:07 +0000 | [diff] [blame] | 405 | \constant{NOTSET} has been set using \method{setLevel()}, it is returned. |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 406 | Otherwise, the hierarchy is traversed towards the root until a value |
Raymond Hettinger | 6f3eaa6 | 2003-06-27 21:43:39 +0000 | [diff] [blame] | 407 | other than \constant{NOTSET} is found, and that value is returned. |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 408 | \end{methoddesc} |
| 409 | |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 410 | \begin{methoddesc}{debug}{msg\optional{, *args\optional{, **kwargs}}} |
| 411 | Logs a message with level \constant{DEBUG} on this logger. |
| 412 | The \var{msg} is the message format string, and the \var{args} are the |
Vinay Sajip | b4549c4 | 2006-02-09 08:54:11 +0000 | [diff] [blame] | 413 | arguments which are merged into \var{msg} using the string formatting |
| 414 | operator. (Note that this means that you can use keywords in the |
| 415 | format string, together with a single dictionary argument.) |
| 416 | |
| 417 | There are two keyword arguments in \var{kwargs} which are inspected: |
| 418 | \var{exc_info} which, if it does not evaluate as false, causes exception |
| 419 | information to be added to the logging message. If an exception tuple (in the |
| 420 | format returned by \function{sys.exc_info()}) is provided, it is used; |
| 421 | otherwise, \function{sys.exc_info()} is called to get the exception |
| 422 | information. |
| 423 | |
| 424 | The other optional keyword argument is \var{extra} which can be used to pass |
| 425 | a dictionary which is used to populate the __dict__ of the LogRecord created |
| 426 | for the logging event with user-defined attributes. These custom attributes |
| 427 | can then be used as you like. For example, they could be incorporated into |
| 428 | logged messages. For example: |
| 429 | |
| 430 | \begin{verbatim} |
| 431 | FORMAT = "%(asctime)-15s %(clientip)s %(user)-8s %(message)s" |
| 432 | logging.basicConfig(format=FORMAT) |
| 433 | dict = { 'clientip' : '192.168.0.1', 'user' : 'fbloggs' } |
| 434 | logger = logging.getLogger("tcpserver") |
| 435 | logger.warning("Protocol problem: %s", "connection reset", extra=d) |
| 436 | \end{verbatim} |
| 437 | |
| 438 | would print something like |
| 439 | \begin{verbatim} |
| 440 | 2006-02-08 22:20:02,165 192.168.0.1 fbloggs Protocol problem: connection reset |
| 441 | \end{verbatim} |
| 442 | |
| 443 | The keys in the dictionary passed in \var{extra} should not clash with the keys |
| 444 | used by the logging system. (See the \class{Formatter} documentation for more |
| 445 | information on which keys are used by the logging system.) |
| 446 | |
| 447 | If you choose to use these attributes in logged messages, you need to exercise |
| 448 | some care. In the above example, for instance, the \class{Formatter} has been |
| 449 | set up with a format string which expects 'clientip' and 'user' in the |
| 450 | attribute dictionary of the LogRecord. If these are missing, the message will |
| 451 | not be logged because a string formatting exception will occur. So in this |
| 452 | case, you always need to pass the \var{extra} dictionary with these keys. |
| 453 | |
| 454 | While this might be annoying, this feature is intended for use in specialized |
| 455 | circumstances, such as multi-threaded servers where the same code executes |
| 456 | in many contexts, and interesting conditions which arise are dependent on this |
| 457 | context (such as remote client IP address and authenticated user name, in the |
| 458 | above example). In such circumstances, it is likely that specialized |
| 459 | \class{Formatter}s would be used with particular \class{Handler}s. |
Vinay Sajip | 55aafab | 2006-02-15 21:47:32 +0000 | [diff] [blame] | 460 | |
| 461 | \versionchanged[\var{extra} was added]{2.5} |
| 462 | |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 463 | \end{methoddesc} |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 464 | |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 465 | \begin{methoddesc}{info}{msg\optional{, *args\optional{, **kwargs}}} |
| 466 | Logs a message with level \constant{INFO} on this logger. |
| 467 | The arguments are interpreted as for \method{debug()}. |
| 468 | \end{methoddesc} |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 469 | |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 470 | \begin{methoddesc}{warning}{msg\optional{, *args\optional{, **kwargs}}} |
| 471 | Logs a message with level \constant{WARNING} on this logger. |
| 472 | The arguments are interpreted as for \method{debug()}. |
| 473 | \end{methoddesc} |
| 474 | |
| 475 | \begin{methoddesc}{error}{msg\optional{, *args\optional{, **kwargs}}} |
| 476 | Logs a message with level \constant{ERROR} on this logger. |
| 477 | The arguments are interpreted as for \method{debug()}. |
| 478 | \end{methoddesc} |
| 479 | |
| 480 | \begin{methoddesc}{critical}{msg\optional{, *args\optional{, **kwargs}}} |
| 481 | Logs a message with level \constant{CRITICAL} on this logger. |
| 482 | The arguments are interpreted as for \method{debug()}. |
| 483 | \end{methoddesc} |
| 484 | |
| 485 | \begin{methoddesc}{log}{lvl, msg\optional{, *args\optional{, **kwargs}}} |
Vinay Sajip | 1cf56d0 | 2004-08-04 08:36:44 +0000 | [diff] [blame] | 486 | Logs a message with integer level \var{lvl} on this logger. |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 487 | The other arguments are interpreted as for \method{debug()}. |
| 488 | \end{methoddesc} |
| 489 | |
| 490 | \begin{methoddesc}{exception}{msg\optional{, *args}} |
| 491 | Logs a message with level \constant{ERROR} on this logger. |
| 492 | The arguments are interpreted as for \method{debug()}. Exception info |
| 493 | is added to the logging message. This method should only be called |
| 494 | from an exception handler. |
| 495 | \end{methoddesc} |
| 496 | |
| 497 | \begin{methoddesc}{addFilter}{filt} |
| 498 | Adds the specified filter \var{filt} to this logger. |
| 499 | \end{methoddesc} |
| 500 | |
| 501 | \begin{methoddesc}{removeFilter}{filt} |
| 502 | Removes the specified filter \var{filt} from this logger. |
| 503 | \end{methoddesc} |
| 504 | |
| 505 | \begin{methoddesc}{filter}{record} |
| 506 | Applies this logger's filters to the record and returns a true value if |
| 507 | the record is to be processed. |
| 508 | \end{methoddesc} |
| 509 | |
| 510 | \begin{methoddesc}{addHandler}{hdlr} |
| 511 | Adds the specified handler \var{hdlr} to this logger. |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 512 | \end{methoddesc} |
| 513 | |
| 514 | \begin{methoddesc}{removeHandler}{hdlr} |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 515 | Removes the specified handler \var{hdlr} from this logger. |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 516 | \end{methoddesc} |
| 517 | |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 518 | \begin{methoddesc}{findCaller}{} |
| 519 | Finds the caller's source filename and line number. Returns the filename |
| 520 | and line number as a 2-element tuple. |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 521 | \end{methoddesc} |
| 522 | |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 523 | \begin{methoddesc}{handle}{record} |
| 524 | Handles a record by passing it to all handlers associated with this logger |
| 525 | and its ancestors (until a false value of \var{propagate} is found). |
| 526 | This method is used for unpickled records received from a socket, as well |
| 527 | as those created locally. Logger-level filtering is applied using |
| 528 | \method{filter()}. |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 529 | \end{methoddesc} |
| 530 | |
Vinay Sajip | b4549c4 | 2006-02-09 08:54:11 +0000 | [diff] [blame] | 531 | \begin{methoddesc}{makeRecord}{name, lvl, fn, lno, msg, args, exc_info, |
| 532 | func, extra} |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 533 | This is a factory method which can be overridden in subclasses to create |
| 534 | specialized \class{LogRecord} instances. |
Neal Norwitz | c16dd48 | 2006-02-13 02:04:37 +0000 | [diff] [blame] | 535 | \versionchanged[\var{func} and \var{extra} were added]{2.5} |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 536 | \end{methoddesc} |
| 537 | |
Vinay Sajip | a13c60b | 2004-07-03 11:45:53 +0000 | [diff] [blame] | 538 | \subsection{Basic example \label{minimal-example}} |
| 539 | |
Vinay Sajip | c320c22 | 2005-07-29 11:52:19 +0000 | [diff] [blame] | 540 | \versionchanged[formerly \function{basicConfig} did not take any keyword |
| 541 | arguments]{2.4} |
| 542 | |
Vinay Sajip | a13c60b | 2004-07-03 11:45:53 +0000 | [diff] [blame] | 543 | The \module{logging} package provides a lot of flexibility, and its |
| 544 | configuration can appear daunting. This section demonstrates that simple |
| 545 | use of the logging package is possible. |
| 546 | |
| 547 | The simplest example shows logging to the console: |
| 548 | |
| 549 | \begin{verbatim} |
| 550 | import logging |
| 551 | |
| 552 | logging.debug('A debug message') |
| 553 | logging.info('Some information') |
| 554 | logging.warning('A shot across the bows') |
| 555 | \end{verbatim} |
| 556 | |
| 557 | If you run the above script, you'll see this: |
| 558 | \begin{verbatim} |
| 559 | WARNING:root:A shot across the bows |
| 560 | \end{verbatim} |
| 561 | |
| 562 | Because no particular logger was specified, the system used the root logger. |
| 563 | The debug and info messages didn't appear because by default, the root |
| 564 | logger is configured to only handle messages with a severity of WARNING |
| 565 | or above. The message format is also a configuration default, as is the output |
| 566 | destination of the messages - \code{sys.stderr}. The severity level, |
| 567 | the message format and destination can be easily changed, as shown in |
| 568 | the example below: |
| 569 | |
| 570 | \begin{verbatim} |
| 571 | import logging |
| 572 | |
| 573 | logging.basicConfig(level=logging.DEBUG, |
Vinay Sajip | e3c330b | 2004-07-07 15:59:49 +0000 | [diff] [blame] | 574 | format='%(asctime)s %(levelname)s %(message)s', |
| 575 | filename='/tmp/myapp.log', |
| 576 | filemode='w') |
Vinay Sajip | a13c60b | 2004-07-03 11:45:53 +0000 | [diff] [blame] | 577 | logging.debug('A debug message') |
| 578 | logging.info('Some information') |
| 579 | logging.warning('A shot across the bows') |
| 580 | \end{verbatim} |
| 581 | |
| 582 | The \method{basicConfig()} method is used to change the configuration |
| 583 | defaults, which results in output (written to \code{/tmp/myapp.log}) |
| 584 | which should look something like the following: |
| 585 | |
| 586 | \begin{verbatim} |
| 587 | 2004-07-02 13:00:08,743 DEBUG A debug message |
| 588 | 2004-07-02 13:00:08,743 INFO Some information |
| 589 | 2004-07-02 13:00:08,743 WARNING A shot across the bows |
| 590 | \end{verbatim} |
| 591 | |
| 592 | This time, all messages with a severity of DEBUG or above were handled, |
| 593 | and the format of the messages was also changed, and output went to the |
| 594 | specified file rather than the console. |
| 595 | |
| 596 | Formatting uses standard Python string formatting - see section |
| 597 | \ref{typesseq-strings}. The format string takes the following |
| 598 | common specifiers. For a complete list of specifiers, consult the |
| 599 | \class{Formatter} documentation. |
| 600 | |
| 601 | \begin{tableii}{l|l}{code}{Format}{Description} |
| 602 | \lineii{\%(name)s} {Name of the logger (logging channel).} |
| 603 | \lineii{\%(levelname)s}{Text logging level for the message |
| 604 | (\code{'DEBUG'}, \code{'INFO'}, |
| 605 | \code{'WARNING'}, \code{'ERROR'}, |
| 606 | \code{'CRITICAL'}).} |
| 607 | \lineii{\%(asctime)s} {Human-readable time when the \class{LogRecord} |
| 608 | was created. By default this is of the form |
| 609 | ``2003-07-08 16:49:45,896'' (the numbers after the |
| 610 | comma are millisecond portion of the time).} |
| 611 | \lineii{\%(message)s} {The logged message.} |
| 612 | \end{tableii} |
| 613 | |
| 614 | To change the date/time format, you can pass an additional keyword parameter, |
| 615 | \var{datefmt}, as in the following: |
| 616 | |
| 617 | \begin{verbatim} |
| 618 | import logging |
| 619 | |
| 620 | logging.basicConfig(level=logging.DEBUG, |
Vinay Sajip | e3c330b | 2004-07-07 15:59:49 +0000 | [diff] [blame] | 621 | format='%(asctime)s %(levelname)-8s %(message)s', |
| 622 | datefmt='%a, %d %b %Y %H:%M:%S', |
| 623 | filename='/temp/myapp.log', |
| 624 | filemode='w') |
Vinay Sajip | a13c60b | 2004-07-03 11:45:53 +0000 | [diff] [blame] | 625 | logging.debug('A debug message') |
| 626 | logging.info('Some information') |
| 627 | logging.warning('A shot across the bows') |
| 628 | \end{verbatim} |
| 629 | |
| 630 | which would result in output like |
| 631 | |
| 632 | \begin{verbatim} |
| 633 | Fri, 02 Jul 2004 13:06:18 DEBUG A debug message |
| 634 | Fri, 02 Jul 2004 13:06:18 INFO Some information |
| 635 | Fri, 02 Jul 2004 13:06:18 WARNING A shot across the bows |
| 636 | \end{verbatim} |
| 637 | |
| 638 | The date format string follows the requirements of \function{strftime()} - |
| 639 | see the documentation for the \refmodule{time} module. |
| 640 | |
| 641 | If, instead of sending logging output to the console or a file, you'd rather |
| 642 | use a file-like object which you have created separately, you can pass it |
| 643 | to \function{basicConfig()} using the \var{stream} keyword argument. Note |
| 644 | that if both \var{stream} and \var{filename} keyword arguments are passed, |
| 645 | the \var{stream} argument is ignored. |
| 646 | |
Vinay Sajip | b4bf62f | 2004-07-21 14:40:11 +0000 | [diff] [blame] | 647 | Of course, you can put variable information in your output. To do this, |
| 648 | simply have the message be a format string and pass in additional arguments |
| 649 | containing the variable information, as in the following example: |
| 650 | |
| 651 | \begin{verbatim} |
| 652 | import logging |
| 653 | |
| 654 | logging.basicConfig(level=logging.DEBUG, |
| 655 | format='%(asctime)s %(levelname)-8s %(message)s', |
| 656 | datefmt='%a, %d %b %Y %H:%M:%S', |
| 657 | filename='/temp/myapp.log', |
| 658 | filemode='w') |
Vinay Sajip | 93ae4c1 | 2004-10-22 21:43:15 +0000 | [diff] [blame] | 659 | logging.error('Pack my box with %d dozen %s', 5, 'liquor jugs') |
Vinay Sajip | b4bf62f | 2004-07-21 14:40:11 +0000 | [diff] [blame] | 660 | \end{verbatim} |
| 661 | |
| 662 | which would result in |
| 663 | |
| 664 | \begin{verbatim} |
Vinay Sajip | 93ae4c1 | 2004-10-22 21:43:15 +0000 | [diff] [blame] | 665 | Wed, 21 Jul 2004 15:35:16 ERROR Pack my box with 5 dozen liquor jugs |
Vinay Sajip | b4bf62f | 2004-07-21 14:40:11 +0000 | [diff] [blame] | 666 | \end{verbatim} |
| 667 | |
Vinay Sajip | 93ae4c1 | 2004-10-22 21:43:15 +0000 | [diff] [blame] | 668 | \subsection{Logging to multiple destinations \label{multiple-destinations}} |
| 669 | |
| 670 | Let's say you want to log to console and file with different message formats |
| 671 | and in differing circumstances. Say you want to log messages with levels |
| 672 | of DEBUG and higher to file, and those messages at level INFO and higher to |
| 673 | the console. Let's also assume that the file should contain timestamps, but |
| 674 | the console messages should not. Here's how you can achieve this: |
| 675 | |
| 676 | \begin{verbatim} |
| 677 | import logging |
| 678 | |
Fred Drake | 048840c | 2004-10-29 14:35:42 +0000 | [diff] [blame] | 679 | # set up logging to file - see previous section for more details |
Vinay Sajip | 93ae4c1 | 2004-10-22 21:43:15 +0000 | [diff] [blame] | 680 | logging.basicConfig(level=logging.DEBUG, |
| 681 | format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s', |
| 682 | datefmt='%m-%d %H:%M', |
| 683 | filename='/temp/myapp.log', |
| 684 | filemode='w') |
Fred Drake | 048840c | 2004-10-29 14:35:42 +0000 | [diff] [blame] | 685 | # define a Handler which writes INFO messages or higher to the sys.stderr |
Vinay Sajip | 93ae4c1 | 2004-10-22 21:43:15 +0000 | [diff] [blame] | 686 | console = logging.StreamHandler() |
| 687 | console.setLevel(logging.INFO) |
Fred Drake | 048840c | 2004-10-29 14:35:42 +0000 | [diff] [blame] | 688 | # set a format which is simpler for console use |
Vinay Sajip | 93ae4c1 | 2004-10-22 21:43:15 +0000 | [diff] [blame] | 689 | formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s') |
Fred Drake | 048840c | 2004-10-29 14:35:42 +0000 | [diff] [blame] | 690 | # tell the handler to use this format |
Vinay Sajip | 93ae4c1 | 2004-10-22 21:43:15 +0000 | [diff] [blame] | 691 | console.setFormatter(formatter) |
Fred Drake | 048840c | 2004-10-29 14:35:42 +0000 | [diff] [blame] | 692 | # add the handler to the root logger |
Vinay Sajip | 93ae4c1 | 2004-10-22 21:43:15 +0000 | [diff] [blame] | 693 | logging.getLogger('').addHandler(console) |
| 694 | |
Fred Drake | 048840c | 2004-10-29 14:35:42 +0000 | [diff] [blame] | 695 | # Now, we can log to the root logger, or any other logger. First the root... |
Vinay Sajip | 93ae4c1 | 2004-10-22 21:43:15 +0000 | [diff] [blame] | 696 | logging.info('Jackdaws love my big sphinx of quartz.') |
| 697 | |
Fred Drake | 048840c | 2004-10-29 14:35:42 +0000 | [diff] [blame] | 698 | # Now, define a couple of other loggers which might represent areas in your |
| 699 | # application: |
Vinay Sajip | 93ae4c1 | 2004-10-22 21:43:15 +0000 | [diff] [blame] | 700 | |
| 701 | logger1 = logging.getLogger('myapp.area1') |
| 702 | logger2 = logging.getLogger('myapp.area2') |
| 703 | |
| 704 | logger1.debug('Quick zephyrs blow, vexing daft Jim.') |
| 705 | logger1.info('How quickly daft jumping zebras vex.') |
| 706 | logger2.warning('Jail zesty vixen who grabbed pay from quack.') |
| 707 | logger2.error('The five boxing wizards jump quickly.') |
| 708 | \end{verbatim} |
| 709 | |
| 710 | When you run this, on the console you will see |
| 711 | |
| 712 | \begin{verbatim} |
| 713 | root : INFO Jackdaws love my big sphinx of quartz. |
| 714 | myapp.area1 : INFO How quickly daft jumping zebras vex. |
| 715 | myapp.area2 : WARNING Jail zesty vixen who grabbed pay from quack. |
| 716 | myapp.area2 : ERROR The five boxing wizards jump quickly. |
| 717 | \end{verbatim} |
| 718 | |
| 719 | and in the file you will see something like |
| 720 | |
| 721 | \begin{verbatim} |
| 722 | 10-22 22:19 root INFO Jackdaws love my big sphinx of quartz. |
| 723 | 10-22 22:19 myapp.area1 DEBUG Quick zephyrs blow, vexing daft Jim. |
| 724 | 10-22 22:19 myapp.area1 INFO How quickly daft jumping zebras vex. |
| 725 | 10-22 22:19 myapp.area2 WARNING Jail zesty vixen who grabbed pay from quack. |
| 726 | 10-22 22:19 myapp.area2 ERROR The five boxing wizards jump quickly. |
| 727 | \end{verbatim} |
| 728 | |
| 729 | As you can see, the DEBUG message only shows up in the file. The other |
| 730 | messages are sent to both destinations. |
| 731 | |
Vinay Sajip | 006483b | 2004-10-29 12:30:28 +0000 | [diff] [blame] | 732 | This example uses console and file handlers, but you can use any number and |
| 733 | combination of handlers you choose. |
| 734 | |
| 735 | \subsection{Sending and receiving logging events across a network |
| 736 | \label{network-logging}} |
| 737 | |
| 738 | Let's say you want to send logging events across a network, and handle them |
| 739 | at the receiving end. A simple way of doing this is attaching a |
| 740 | \class{SocketHandler} instance to the root logger at the sending end: |
| 741 | |
| 742 | \begin{verbatim} |
| 743 | import logging, logging.handlers |
| 744 | |
| 745 | rootLogger = logging.getLogger('') |
| 746 | rootLogger.setLevel(logging.DEBUG) |
| 747 | socketHandler = logging.handlers.SocketHandler('localhost', |
| 748 | logging.handlers.DEFAULT_TCP_LOGGING_PORT) |
| 749 | # don't bother with a formatter, since a socket handler sends the event as |
| 750 | # an unformatted pickle |
| 751 | rootLogger.addHandler(socketHandler) |
| 752 | |
Fred Drake | 048840c | 2004-10-29 14:35:42 +0000 | [diff] [blame] | 753 | # Now, we can log to the root logger, or any other logger. First the root... |
Vinay Sajip | 006483b | 2004-10-29 12:30:28 +0000 | [diff] [blame] | 754 | logging.info('Jackdaws love my big sphinx of quartz.') |
| 755 | |
Fred Drake | 048840c | 2004-10-29 14:35:42 +0000 | [diff] [blame] | 756 | # Now, define a couple of other loggers which might represent areas in your |
| 757 | # application: |
Vinay Sajip | 006483b | 2004-10-29 12:30:28 +0000 | [diff] [blame] | 758 | |
| 759 | logger1 = logging.getLogger('myapp.area1') |
| 760 | logger2 = logging.getLogger('myapp.area2') |
| 761 | |
| 762 | logger1.debug('Quick zephyrs blow, vexing daft Jim.') |
| 763 | logger1.info('How quickly daft jumping zebras vex.') |
| 764 | logger2.warning('Jail zesty vixen who grabbed pay from quack.') |
| 765 | logger2.error('The five boxing wizards jump quickly.') |
| 766 | \end{verbatim} |
| 767 | |
| 768 | At the receiving end, you can set up a receiver using the |
| 769 | \module{SocketServer} module. Here is a basic working example: |
| 770 | |
| 771 | \begin{verbatim} |
Fred Drake | 048840c | 2004-10-29 14:35:42 +0000 | [diff] [blame] | 772 | import cPickle |
| 773 | import logging |
| 774 | import logging.handlers |
| 775 | import SocketServer |
| 776 | import struct |
Vinay Sajip | 006483b | 2004-10-29 12:30:28 +0000 | [diff] [blame] | 777 | |
Vinay Sajip | 006483b | 2004-10-29 12:30:28 +0000 | [diff] [blame] | 778 | |
Fred Drake | 048840c | 2004-10-29 14:35:42 +0000 | [diff] [blame] | 779 | class LogRecordStreamHandler(SocketServer.StreamRequestHandler): |
| 780 | """Handler for a streaming logging request. |
| 781 | |
| 782 | This basically logs the record using whatever logging policy is |
| 783 | configured locally. |
Vinay Sajip | 006483b | 2004-10-29 12:30:28 +0000 | [diff] [blame] | 784 | """ |
| 785 | |
| 786 | def handle(self): |
| 787 | """ |
| 788 | Handle multiple requests - each expected to be a 4-byte length, |
| 789 | followed by the LogRecord in pickle format. Logs the record |
| 790 | according to whatever policy is configured locally. |
| 791 | """ |
| 792 | while 1: |
| 793 | chunk = self.connection.recv(4) |
| 794 | if len(chunk) < 4: |
| 795 | break |
| 796 | slen = struct.unpack(">L", chunk)[0] |
| 797 | chunk = self.connection.recv(slen) |
| 798 | while len(chunk) < slen: |
| 799 | chunk = chunk + self.connection.recv(slen - len(chunk)) |
| 800 | obj = self.unPickle(chunk) |
| 801 | record = logging.makeLogRecord(obj) |
| 802 | self.handleLogRecord(record) |
| 803 | |
| 804 | def unPickle(self, data): |
| 805 | return cPickle.loads(data) |
| 806 | |
| 807 | def handleLogRecord(self, record): |
Fred Drake | 048840c | 2004-10-29 14:35:42 +0000 | [diff] [blame] | 808 | # if a name is specified, we use the named logger rather than the one |
| 809 | # implied by the record. |
Vinay Sajip | 006483b | 2004-10-29 12:30:28 +0000 | [diff] [blame] | 810 | if self.server.logname is not None: |
| 811 | name = self.server.logname |
| 812 | else: |
| 813 | name = record.name |
| 814 | logger = logging.getLogger(name) |
Fred Drake | 048840c | 2004-10-29 14:35:42 +0000 | [diff] [blame] | 815 | # N.B. EVERY record gets logged. This is because Logger.handle |
| 816 | # is normally called AFTER logger-level filtering. If you want |
| 817 | # to do filtering, do it at the client end to save wasting |
| 818 | # cycles and network bandwidth! |
Vinay Sajip | 006483b | 2004-10-29 12:30:28 +0000 | [diff] [blame] | 819 | logger.handle(record) |
| 820 | |
Fred Drake | 048840c | 2004-10-29 14:35:42 +0000 | [diff] [blame] | 821 | class LogRecordSocketReceiver(SocketServer.ThreadingTCPServer): |
| 822 | """simple TCP socket-based logging receiver suitable for testing. |
Vinay Sajip | 006483b | 2004-10-29 12:30:28 +0000 | [diff] [blame] | 823 | """ |
| 824 | |
| 825 | allow_reuse_address = 1 |
| 826 | |
| 827 | def __init__(self, host='localhost', |
Fred Drake | 048840c | 2004-10-29 14:35:42 +0000 | [diff] [blame] | 828 | port=logging.handlers.DEFAULT_TCP_LOGGING_PORT, |
| 829 | handler=LogRecordStreamHandler): |
| 830 | SocketServer.ThreadingTCPServer.__init__(self, (host, port), handler) |
Vinay Sajip | 006483b | 2004-10-29 12:30:28 +0000 | [diff] [blame] | 831 | self.abort = 0 |
| 832 | self.timeout = 1 |
| 833 | self.logname = None |
| 834 | |
| 835 | def serve_until_stopped(self): |
| 836 | import select |
| 837 | abort = 0 |
| 838 | while not abort: |
| 839 | rd, wr, ex = select.select([self.socket.fileno()], |
| 840 | [], [], |
| 841 | self.timeout) |
| 842 | if rd: |
| 843 | self.handle_request() |
| 844 | abort = self.abort |
| 845 | |
| 846 | def main(): |
| 847 | logging.basicConfig( |
Vinay Sajip | edde492 | 2004-11-11 13:54:48 +0000 | [diff] [blame] | 848 | format="%(relativeCreated)5d %(name)-15s %(levelname)-8s %(message)s") |
Vinay Sajip | 006483b | 2004-10-29 12:30:28 +0000 | [diff] [blame] | 849 | tcpserver = LogRecordSocketReceiver() |
| 850 | print "About to start TCP server..." |
| 851 | tcpserver.serve_until_stopped() |
| 852 | |
| 853 | if __name__ == "__main__": |
| 854 | main() |
| 855 | \end{verbatim} |
| 856 | |
Vinay Sajip | edde492 | 2004-11-11 13:54:48 +0000 | [diff] [blame] | 857 | First run the server, and then the client. On the client side, nothing is |
| 858 | printed on the console; on the server side, you should see something like: |
Vinay Sajip | 006483b | 2004-10-29 12:30:28 +0000 | [diff] [blame] | 859 | |
| 860 | \begin{verbatim} |
| 861 | About to start TCP server... |
| 862 | 59 root INFO Jackdaws love my big sphinx of quartz. |
| 863 | 59 myapp.area1 DEBUG Quick zephyrs blow, vexing daft Jim. |
| 864 | 69 myapp.area1 INFO How quickly daft jumping zebras vex. |
| 865 | 69 myapp.area2 WARNING Jail zesty vixen who grabbed pay from quack. |
| 866 | 69 myapp.area2 ERROR The five boxing wizards jump quickly. |
| 867 | \end{verbatim} |
| 868 | |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 869 | \subsection{Handler Objects} |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 870 | |
Fred Drake | 68e6d57 | 2003-01-28 22:02:35 +0000 | [diff] [blame] | 871 | Handlers have the following attributes and methods. Note that |
| 872 | \class{Handler} is never instantiated directly; this class acts as a |
| 873 | base for more useful subclasses. However, the \method{__init__()} |
| 874 | method in subclasses needs to call \method{Handler.__init__()}. |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 875 | |
Neal Norwitz | 6fa635d | 2003-02-18 14:20:07 +0000 | [diff] [blame] | 876 | \begin{methoddesc}{__init__}{level=\constant{NOTSET}} |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 877 | Initializes the \class{Handler} instance by setting its level, setting |
| 878 | the list of filters to the empty list and creating a lock (using |
Raymond Hettinger | c75c3e0 | 2003-09-01 22:50:52 +0000 | [diff] [blame] | 879 | \method{createLock()}) for serializing access to an I/O mechanism. |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 880 | \end{methoddesc} |
| 881 | |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 882 | \begin{methoddesc}{createLock}{} |
| 883 | Initializes a thread lock which can be used to serialize access to |
| 884 | underlying I/O functionality which may not be threadsafe. |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 885 | \end{methoddesc} |
| 886 | |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 887 | \begin{methoddesc}{acquire}{} |
| 888 | Acquires the thread lock created with \method{createLock()}. |
| 889 | \end{methoddesc} |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 890 | |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 891 | \begin{methoddesc}{release}{} |
| 892 | Releases the thread lock acquired with \method{acquire()}. |
| 893 | \end{methoddesc} |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 894 | |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 895 | \begin{methoddesc}{setLevel}{lvl} |
| 896 | Sets the threshold for this handler to \var{lvl}. Logging messages which are |
| 897 | less severe than \var{lvl} will be ignored. When a handler is created, the |
Neal Norwitz | 6fa635d | 2003-02-18 14:20:07 +0000 | [diff] [blame] | 898 | level is set to \constant{NOTSET} (which causes all messages to be processed). |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 899 | \end{methoddesc} |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 900 | |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 901 | \begin{methoddesc}{setFormatter}{form} |
| 902 | Sets the \class{Formatter} for this handler to \var{form}. |
| 903 | \end{methoddesc} |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 904 | |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 905 | \begin{methoddesc}{addFilter}{filt} |
| 906 | Adds the specified filter \var{filt} to this handler. |
| 907 | \end{methoddesc} |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 908 | |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 909 | \begin{methoddesc}{removeFilter}{filt} |
| 910 | Removes the specified filter \var{filt} from this handler. |
| 911 | \end{methoddesc} |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 912 | |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 913 | \begin{methoddesc}{filter}{record} |
| 914 | Applies this handler's filters to the record and returns a true value if |
| 915 | the record is to be processed. |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 916 | \end{methoddesc} |
| 917 | |
| 918 | \begin{methoddesc}{flush}{} |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 919 | Ensure all logging output has been flushed. This version does |
| 920 | nothing and is intended to be implemented by subclasses. |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 921 | \end{methoddesc} |
| 922 | |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 923 | \begin{methoddesc}{close}{} |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 924 | Tidy up any resources used by the handler. This version does |
| 925 | nothing and is intended to be implemented by subclasses. |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 926 | \end{methoddesc} |
| 927 | |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 928 | \begin{methoddesc}{handle}{record} |
| 929 | Conditionally emits the specified logging record, depending on |
| 930 | filters which may have been added to the handler. Wraps the actual |
| 931 | emission of the record with acquisition/release of the I/O thread |
| 932 | lock. |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 933 | \end{methoddesc} |
| 934 | |
Vinay Sajip | a13c60b | 2004-07-03 11:45:53 +0000 | [diff] [blame] | 935 | \begin{methoddesc}{handleError}{record} |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 936 | This method should be called from handlers when an exception is |
Vinay Sajip | a13c60b | 2004-07-03 11:45:53 +0000 | [diff] [blame] | 937 | encountered during an \method{emit()} call. By default it does nothing, |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 938 | which means that exceptions get silently ignored. This is what is |
| 939 | mostly wanted for a logging system - most users will not care |
| 940 | about errors in the logging system, they are more interested in |
| 941 | application errors. You could, however, replace this with a custom |
Vinay Sajip | a13c60b | 2004-07-03 11:45:53 +0000 | [diff] [blame] | 942 | handler if you wish. The specified record is the one which was being |
| 943 | processed when the exception occurred. |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 944 | \end{methoddesc} |
| 945 | |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 946 | \begin{methoddesc}{format}{record} |
| 947 | Do formatting for a record - if a formatter is set, use it. |
| 948 | Otherwise, use the default formatter for the module. |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 949 | \end{methoddesc} |
| 950 | |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 951 | \begin{methoddesc}{emit}{record} |
| 952 | Do whatever it takes to actually log the specified logging record. |
| 953 | This version is intended to be implemented by subclasses and so |
| 954 | raises a \exception{NotImplementedError}. |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 955 | \end{methoddesc} |
| 956 | |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 957 | \subsubsection{StreamHandler} |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 958 | |
Vinay Sajip | 51f5235 | 2006-01-22 11:58:39 +0000 | [diff] [blame] | 959 | The \class{StreamHandler} class, located in the core \module{logging} |
| 960 | package, sends logging output to streams such as \var{sys.stdout}, |
| 961 | \var{sys.stderr} or any file-like object (or, more precisely, any |
| 962 | object which supports \method{write()} and \method{flush()} methods). |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 963 | |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 964 | \begin{classdesc}{StreamHandler}{\optional{strm}} |
| 965 | Returns a new instance of the \class{StreamHandler} class. If \var{strm} is |
| 966 | specified, the instance will use it for logging output; otherwise, |
| 967 | \var{sys.stderr} will be used. |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 968 | \end{classdesc} |
| 969 | |
| 970 | \begin{methoddesc}{emit}{record} |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 971 | If a formatter is specified, it is used to format the record. |
| 972 | The record is then written to the stream with a trailing newline. |
| 973 | If exception information is present, it is formatted using |
| 974 | \function{traceback.print_exception()} and appended to the stream. |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 975 | \end{methoddesc} |
| 976 | |
| 977 | \begin{methoddesc}{flush}{} |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 978 | Flushes the stream by calling its \method{flush()} method. Note that |
| 979 | the \method{close()} method is inherited from \class{Handler} and |
| 980 | so does nothing, so an explicit \method{flush()} call may be needed |
| 981 | at times. |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 982 | \end{methoddesc} |
| 983 | |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 984 | \subsubsection{FileHandler} |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 985 | |
Vinay Sajip | 51f5235 | 2006-01-22 11:58:39 +0000 | [diff] [blame] | 986 | The \class{FileHandler} class, located in the core \module{logging} |
| 987 | package, sends logging output to a disk file. It inherits the output |
| 988 | functionality from \class{StreamHandler}. |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 989 | |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 990 | \begin{classdesc}{FileHandler}{filename\optional{, mode}} |
| 991 | Returns a new instance of the \class{FileHandler} class. The specified |
| 992 | file is opened and used as the stream for logging. If \var{mode} is |
Fred Drake | 9a5b6a6 | 2003-07-08 15:38:40 +0000 | [diff] [blame] | 993 | not specified, \constant{'a'} is used. By default, the file grows |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 994 | indefinitely. |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 995 | \end{classdesc} |
| 996 | |
| 997 | \begin{methoddesc}{close}{} |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 998 | Closes the file. |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 999 | \end{methoddesc} |
| 1000 | |
| 1001 | \begin{methoddesc}{emit}{record} |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 1002 | Outputs the record to the file. |
| 1003 | \end{methoddesc} |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 1004 | |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 1005 | \subsubsection{RotatingFileHandler} |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 1006 | |
Vinay Sajip | 51f5235 | 2006-01-22 11:58:39 +0000 | [diff] [blame] | 1007 | The \class{RotatingFileHandler} class, located in the \module{logging.handlers} |
| 1008 | module, supports rotation of disk log files. |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 1009 | |
Fred Drake | 9a5b6a6 | 2003-07-08 15:38:40 +0000 | [diff] [blame] | 1010 | \begin{classdesc}{RotatingFileHandler}{filename\optional{, mode\optional{, |
| 1011 | maxBytes\optional{, backupCount}}}} |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 1012 | Returns a new instance of the \class{RotatingFileHandler} class. The |
| 1013 | specified file is opened and used as the stream for logging. If |
Fred Drake | 68e6d57 | 2003-01-28 22:02:35 +0000 | [diff] [blame] | 1014 | \var{mode} is not specified, \code{'a'} is used. By default, the |
Vinay Sajip | a13c60b | 2004-07-03 11:45:53 +0000 | [diff] [blame] | 1015 | file grows indefinitely. |
Andrew M. Kuchling | 7cf4d9b | 2003-09-26 13:45:18 +0000 | [diff] [blame] | 1016 | |
| 1017 | You can use the \var{maxBytes} and |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 1018 | \var{backupCount} values to allow the file to \dfn{rollover} at a |
| 1019 | predetermined size. When the size is about to be exceeded, the file is |
Andrew M. Kuchling | 7cf4d9b | 2003-09-26 13:45:18 +0000 | [diff] [blame] | 1020 | closed and a new file is silently opened for output. Rollover occurs |
| 1021 | whenever the current log file is nearly \var{maxBytes} in length; if |
| 1022 | \var{maxBytes} is zero, rollover never occurs. If \var{backupCount} |
| 1023 | is non-zero, the system will save old log files by appending the |
| 1024 | extensions ".1", ".2" etc., to the filename. For example, with |
| 1025 | a \var{backupCount} of 5 and a base file name of |
| 1026 | \file{app.log}, you would get \file{app.log}, |
| 1027 | \file{app.log.1}, \file{app.log.2}, up to \file{app.log.5}. The file being |
| 1028 | written to is always \file{app.log}. When this file is filled, it is |
| 1029 | closed and renamed to \file{app.log.1}, and if files \file{app.log.1}, |
| 1030 | \file{app.log.2}, etc. exist, then they are renamed to \file{app.log.2}, |
Vinay Sajip | a13c60b | 2004-07-03 11:45:53 +0000 | [diff] [blame] | 1031 | \file{app.log.3} etc. respectively. |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 1032 | \end{classdesc} |
| 1033 | |
| 1034 | \begin{methoddesc}{doRollover}{} |
| 1035 | Does a rollover, as described above. |
| 1036 | \end{methoddesc} |
| 1037 | |
| 1038 | \begin{methoddesc}{emit}{record} |
Johannes Gijsbers | f164322 | 2004-11-07 16:11:35 +0000 | [diff] [blame] | 1039 | Outputs the record to the file, catering for rollover as described previously. |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 1040 | \end{methoddesc} |
| 1041 | |
Johannes Gijsbers | 4f802ac | 2004-11-07 14:14:27 +0000 | [diff] [blame] | 1042 | \subsubsection{TimedRotatingFileHandler} |
| 1043 | |
Vinay Sajip | 51f5235 | 2006-01-22 11:58:39 +0000 | [diff] [blame] | 1044 | The \class{TimedRotatingFileHandler} class, located in the |
| 1045 | \module{logging.handlers} module, supports rotation of disk log files |
Johannes Gijsbers | 4f802ac | 2004-11-07 14:14:27 +0000 | [diff] [blame] | 1046 | at certain timed intervals. |
| 1047 | |
| 1048 | \begin{classdesc}{TimedRotatingFileHandler}{filename |
| 1049 | \optional{,when |
| 1050 | \optional{,interval |
| 1051 | \optional{,backupCount}}}} |
| 1052 | |
| 1053 | Returns a new instance of the \class{TimedRotatingFileHandler} class. The |
| 1054 | specified file is opened and used as the stream for logging. On rotating |
| 1055 | it also sets the filename suffix. Rotating happens based on the product |
Vinay Sajip | edde492 | 2004-11-11 13:54:48 +0000 | [diff] [blame] | 1056 | of \var{when} and \var{interval}. |
Johannes Gijsbers | 4f802ac | 2004-11-07 14:14:27 +0000 | [diff] [blame] | 1057 | |
| 1058 | You can use the \var{when} to specify the type of \var{interval}. The |
| 1059 | list of possible values is, note that they are not case sensitive: |
| 1060 | |
| 1061 | \begin{tableii}{l|l}{}{Value}{Type of interval} |
| 1062 | \lineii{S}{Seconds} |
| 1063 | \lineii{M}{Minutes} |
| 1064 | \lineii{H}{Hours} |
| 1065 | \lineii{D}{Days} |
| 1066 | \lineii{W}{Week day (0=Monday)} |
| 1067 | \lineii{midnight}{Roll over at midnight} |
| 1068 | \end{tableii} |
| 1069 | |
| 1070 | If \var{backupCount} is non-zero, the system will save old log files by |
Thomas Wouters | 0e3f591 | 2006-08-11 14:57:12 +0000 | [diff] [blame] | 1071 | appending extensions to the filename. The extensions are date-and-time |
| 1072 | based, using the strftime format \code{\%Y-\%m-\%d_\%H-\%M-\%S} or a leading |
| 1073 | portion thereof, depending on the rollover interval. At most \var{backupCount} |
| 1074 | files will be kept, and if more would be created when rollover occurs, the |
| 1075 | oldest one is deleted. |
Johannes Gijsbers | 4f802ac | 2004-11-07 14:14:27 +0000 | [diff] [blame] | 1076 | \end{classdesc} |
| 1077 | |
| 1078 | \begin{methoddesc}{doRollover}{} |
| 1079 | Does a rollover, as described above. |
| 1080 | \end{methoddesc} |
| 1081 | |
| 1082 | \begin{methoddesc}{emit}{record} |
| 1083 | Outputs the record to the file, catering for rollover as described |
| 1084 | above. |
| 1085 | \end{methoddesc} |
| 1086 | |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 1087 | \subsubsection{SocketHandler} |
| 1088 | |
Vinay Sajip | 51f5235 | 2006-01-22 11:58:39 +0000 | [diff] [blame] | 1089 | The \class{SocketHandler} class, located in the |
| 1090 | \module{logging.handlers} module, sends logging output to a network |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 1091 | socket. The base class uses a TCP socket. |
| 1092 | |
| 1093 | \begin{classdesc}{SocketHandler}{host, port} |
| 1094 | Returns a new instance of the \class{SocketHandler} class intended to |
| 1095 | communicate with a remote machine whose address is given by \var{host} |
| 1096 | and \var{port}. |
| 1097 | \end{classdesc} |
| 1098 | |
| 1099 | \begin{methoddesc}{close}{} |
| 1100 | Closes the socket. |
| 1101 | \end{methoddesc} |
| 1102 | |
| 1103 | \begin{methoddesc}{handleError}{} |
| 1104 | \end{methoddesc} |
| 1105 | |
| 1106 | \begin{methoddesc}{emit}{} |
Raymond Hettinger | 6f3eaa6 | 2003-06-27 21:43:39 +0000 | [diff] [blame] | 1107 | Pickles the record's attribute dictionary and writes it to the socket in |
| 1108 | binary format. If there is an error with the socket, silently drops the |
| 1109 | packet. If the connection was previously lost, re-establishes the connection. |
Fred Drake | 6b3b046 | 2004-04-09 18:26:40 +0000 | [diff] [blame] | 1110 | To unpickle the record at the receiving end into a \class{LogRecord}, use the |
| 1111 | \function{makeLogRecord()} function. |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 1112 | \end{methoddesc} |
| 1113 | |
| 1114 | \begin{methoddesc}{handleError}{} |
| 1115 | Handles an error which has occurred during \method{emit()}. The |
| 1116 | most likely cause is a lost connection. Closes the socket so that |
| 1117 | we can retry on the next event. |
| 1118 | \end{methoddesc} |
| 1119 | |
| 1120 | \begin{methoddesc}{makeSocket}{} |
| 1121 | This is a factory method which allows subclasses to define the precise |
| 1122 | type of socket they want. The default implementation creates a TCP |
| 1123 | socket (\constant{socket.SOCK_STREAM}). |
| 1124 | \end{methoddesc} |
| 1125 | |
| 1126 | \begin{methoddesc}{makePickle}{record} |
Raymond Hettinger | 6f3eaa6 | 2003-06-27 21:43:39 +0000 | [diff] [blame] | 1127 | Pickles the record's attribute dictionary in binary format with a length |
| 1128 | prefix, and returns it ready for transmission across the socket. |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 1129 | \end{methoddesc} |
| 1130 | |
| 1131 | \begin{methoddesc}{send}{packet} |
Raymond Hettinger | 2ef85a7 | 2003-01-25 21:46:53 +0000 | [diff] [blame] | 1132 | Send a pickled string \var{packet} to the socket. This function allows |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 1133 | for partial sends which can happen when the network is busy. |
| 1134 | \end{methoddesc} |
| 1135 | |
| 1136 | \subsubsection{DatagramHandler} |
| 1137 | |
Vinay Sajip | 51f5235 | 2006-01-22 11:58:39 +0000 | [diff] [blame] | 1138 | The \class{DatagramHandler} class, located in the |
| 1139 | \module{logging.handlers} module, inherits from \class{SocketHandler} |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 1140 | to support sending logging messages over UDP sockets. |
| 1141 | |
| 1142 | \begin{classdesc}{DatagramHandler}{host, port} |
| 1143 | Returns a new instance of the \class{DatagramHandler} class intended to |
| 1144 | communicate with a remote machine whose address is given by \var{host} |
| 1145 | and \var{port}. |
| 1146 | \end{classdesc} |
| 1147 | |
| 1148 | \begin{methoddesc}{emit}{} |
Raymond Hettinger | 6f3eaa6 | 2003-06-27 21:43:39 +0000 | [diff] [blame] | 1149 | Pickles the record's attribute dictionary and writes it to the socket in |
| 1150 | binary format. If there is an error with the socket, silently drops the |
| 1151 | packet. |
Fred Drake | 6b3b046 | 2004-04-09 18:26:40 +0000 | [diff] [blame] | 1152 | To unpickle the record at the receiving end into a \class{LogRecord}, use the |
| 1153 | \function{makeLogRecord()} function. |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 1154 | \end{methoddesc} |
| 1155 | |
| 1156 | \begin{methoddesc}{makeSocket}{} |
| 1157 | The factory method of \class{SocketHandler} is here overridden to create |
| 1158 | a UDP socket (\constant{socket.SOCK_DGRAM}). |
| 1159 | \end{methoddesc} |
| 1160 | |
| 1161 | \begin{methoddesc}{send}{s} |
Raymond Hettinger | 6f3eaa6 | 2003-06-27 21:43:39 +0000 | [diff] [blame] | 1162 | Send a pickled string to a socket. |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 1163 | \end{methoddesc} |
| 1164 | |
| 1165 | \subsubsection{SysLogHandler} |
| 1166 | |
Vinay Sajip | 51f5235 | 2006-01-22 11:58:39 +0000 | [diff] [blame] | 1167 | The \class{SysLogHandler} class, located in the |
| 1168 | \module{logging.handlers} module, supports sending logging messages to |
| 1169 | a remote or local \UNIX{} syslog. |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 1170 | |
| 1171 | \begin{classdesc}{SysLogHandler}{\optional{address\optional{, facility}}} |
| 1172 | Returns a new instance of the \class{SysLogHandler} class intended to |
Fred Drake | 68e6d57 | 2003-01-28 22:02:35 +0000 | [diff] [blame] | 1173 | communicate with a remote \UNIX{} machine whose address is given by |
| 1174 | \var{address} in the form of a \code{(\var{host}, \var{port})} |
| 1175 | tuple. If \var{address} is not specified, \code{('localhost', 514)} is |
| 1176 | used. The address is used to open a UDP socket. If \var{facility} is |
| 1177 | not specified, \constant{LOG_USER} is used. |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 1178 | \end{classdesc} |
| 1179 | |
| 1180 | \begin{methoddesc}{close}{} |
| 1181 | Closes the socket to the remote host. |
| 1182 | \end{methoddesc} |
| 1183 | |
| 1184 | \begin{methoddesc}{emit}{record} |
| 1185 | The record is formatted, and then sent to the syslog server. If |
| 1186 | exception information is present, it is \emph{not} sent to the server. |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 1187 | \end{methoddesc} |
| 1188 | |
| 1189 | \begin{methoddesc}{encodePriority}{facility, priority} |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 1190 | Encodes the facility and priority into an integer. You can pass in strings |
| 1191 | or integers - if strings are passed, internal mapping dictionaries are used |
| 1192 | to convert them to integers. |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 1193 | \end{methoddesc} |
| 1194 | |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 1195 | \subsubsection{NTEventLogHandler} |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 1196 | |
Vinay Sajip | 51f5235 | 2006-01-22 11:58:39 +0000 | [diff] [blame] | 1197 | The \class{NTEventLogHandler} class, located in the |
| 1198 | \module{logging.handlers} module, supports sending logging messages to |
| 1199 | a local Windows NT, Windows 2000 or Windows XP event log. Before you |
| 1200 | can use it, you need Mark Hammond's Win32 extensions for Python |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 1201 | installed. |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 1202 | |
Fred Drake | 9a5b6a6 | 2003-07-08 15:38:40 +0000 | [diff] [blame] | 1203 | \begin{classdesc}{NTEventLogHandler}{appname\optional{, |
| 1204 | dllname\optional{, logtype}}} |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 1205 | Returns a new instance of the \class{NTEventLogHandler} class. The |
| 1206 | \var{appname} is used to define the application name as it appears in the |
| 1207 | event log. An appropriate registry entry is created using this name. |
| 1208 | The \var{dllname} should give the fully qualified pathname of a .dll or .exe |
| 1209 | which contains message definitions to hold in the log (if not specified, |
Fred Drake | 9a5b6a6 | 2003-07-08 15:38:40 +0000 | [diff] [blame] | 1210 | \code{'win32service.pyd'} is used - this is installed with the Win32 |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 1211 | extensions and contains some basic placeholder message definitions. |
| 1212 | Note that use of these placeholders will make your event logs big, as the |
| 1213 | entire message source is held in the log. If you want slimmer logs, you have |
| 1214 | to pass in the name of your own .dll or .exe which contains the message |
| 1215 | definitions you want to use in the event log). The \var{logtype} is one of |
Fred Drake | 9a5b6a6 | 2003-07-08 15:38:40 +0000 | [diff] [blame] | 1216 | \code{'Application'}, \code{'System'} or \code{'Security'}, and |
| 1217 | defaults to \code{'Application'}. |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 1218 | \end{classdesc} |
| 1219 | |
| 1220 | \begin{methoddesc}{close}{} |
| 1221 | At this point, you can remove the application name from the registry as a |
| 1222 | source of event log entries. However, if you do this, you will not be able |
| 1223 | to see the events as you intended in the Event Log Viewer - it needs to be |
| 1224 | able to access the registry to get the .dll name. The current version does |
| 1225 | not do this (in fact it doesn't do anything). |
| 1226 | \end{methoddesc} |
| 1227 | |
| 1228 | \begin{methoddesc}{emit}{record} |
| 1229 | Determines the message ID, event category and event type, and then logs the |
| 1230 | message in the NT event log. |
| 1231 | \end{methoddesc} |
| 1232 | |
| 1233 | \begin{methoddesc}{getEventCategory}{record} |
| 1234 | Returns the event category for the record. Override this if you |
| 1235 | want to specify your own categories. This version returns 0. |
| 1236 | \end{methoddesc} |
| 1237 | |
| 1238 | \begin{methoddesc}{getEventType}{record} |
| 1239 | Returns the event type for the record. Override this if you want |
| 1240 | to specify your own types. This version does a mapping using the |
| 1241 | handler's typemap attribute, which is set up in \method{__init__()} |
| 1242 | to a dictionary which contains mappings for \constant{DEBUG}, |
| 1243 | \constant{INFO}, \constant{WARNING}, \constant{ERROR} and |
| 1244 | \constant{CRITICAL}. If you are using your own levels, you will either need |
| 1245 | to override this method or place a suitable dictionary in the |
| 1246 | handler's \var{typemap} attribute. |
| 1247 | \end{methoddesc} |
| 1248 | |
| 1249 | \begin{methoddesc}{getMessageID}{record} |
| 1250 | Returns the message ID for the record. If you are using your |
| 1251 | own messages, you could do this by having the \var{msg} passed to the |
| 1252 | logger being an ID rather than a format string. Then, in here, |
| 1253 | you could use a dictionary lookup to get the message ID. This |
| 1254 | version returns 1, which is the base message ID in |
Fred Drake | 9a5b6a6 | 2003-07-08 15:38:40 +0000 | [diff] [blame] | 1255 | \file{win32service.pyd}. |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 1256 | \end{methoddesc} |
| 1257 | |
| 1258 | \subsubsection{SMTPHandler} |
| 1259 | |
Vinay Sajip | 51f5235 | 2006-01-22 11:58:39 +0000 | [diff] [blame] | 1260 | The \class{SMTPHandler} class, located in the |
| 1261 | \module{logging.handlers} module, supports sending logging messages to |
| 1262 | an email address via SMTP. |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 1263 | |
| 1264 | \begin{classdesc}{SMTPHandler}{mailhost, fromaddr, toaddrs, subject} |
| 1265 | Returns a new instance of the \class{SMTPHandler} class. The |
| 1266 | instance is initialized with the from and to addresses and subject |
Vinay Sajip | 84df97f | 2005-02-18 11:50:11 +0000 | [diff] [blame] | 1267 | line of the email. The \var{toaddrs} should be a list of strings. To specify a |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 1268 | non-standard SMTP port, use the (host, port) tuple format for the |
| 1269 | \var{mailhost} argument. If you use a string, the standard SMTP port |
| 1270 | is used. |
| 1271 | \end{classdesc} |
| 1272 | |
| 1273 | \begin{methoddesc}{emit}{record} |
| 1274 | Formats the record and sends it to the specified addressees. |
| 1275 | \end{methoddesc} |
| 1276 | |
| 1277 | \begin{methoddesc}{getSubject}{record} |
| 1278 | If you want to specify a subject line which is record-dependent, |
| 1279 | override this method. |
| 1280 | \end{methoddesc} |
| 1281 | |
| 1282 | \subsubsection{MemoryHandler} |
| 1283 | |
Vinay Sajip | 51f5235 | 2006-01-22 11:58:39 +0000 | [diff] [blame] | 1284 | The \class{MemoryHandler} class, located in the |
| 1285 | \module{logging.handlers} module, supports buffering of logging |
| 1286 | records in memory, periodically flushing them to a \dfn{target} |
| 1287 | handler. Flushing occurs whenever the buffer is full, or when an event |
| 1288 | of a certain severity or greater is seen. |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 1289 | |
| 1290 | \class{MemoryHandler} is a subclass of the more general |
| 1291 | \class{BufferingHandler}, which is an abstract class. This buffers logging |
| 1292 | records in memory. Whenever each record is added to the buffer, a |
| 1293 | check is made by calling \method{shouldFlush()} to see if the buffer |
| 1294 | should be flushed. If it should, then \method{flush()} is expected to |
| 1295 | do the needful. |
| 1296 | |
| 1297 | \begin{classdesc}{BufferingHandler}{capacity} |
| 1298 | Initializes the handler with a buffer of the specified capacity. |
| 1299 | \end{classdesc} |
| 1300 | |
| 1301 | \begin{methoddesc}{emit}{record} |
| 1302 | Appends the record to the buffer. If \method{shouldFlush()} returns true, |
| 1303 | calls \method{flush()} to process the buffer. |
| 1304 | \end{methoddesc} |
| 1305 | |
| 1306 | \begin{methoddesc}{flush}{} |
Raymond Hettinger | 2ef85a7 | 2003-01-25 21:46:53 +0000 | [diff] [blame] | 1307 | You can override this to implement custom flushing behavior. This version |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 1308 | just zaps the buffer to empty. |
| 1309 | \end{methoddesc} |
| 1310 | |
| 1311 | \begin{methoddesc}{shouldFlush}{record} |
| 1312 | Returns true if the buffer is up to capacity. This method can be |
| 1313 | overridden to implement custom flushing strategies. |
| 1314 | \end{methoddesc} |
| 1315 | |
| 1316 | \begin{classdesc}{MemoryHandler}{capacity\optional{, flushLevel |
Neal Norwitz | 6fa635d | 2003-02-18 14:20:07 +0000 | [diff] [blame] | 1317 | \optional{, target}}} |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 1318 | Returns a new instance of the \class{MemoryHandler} class. The |
| 1319 | instance is initialized with a buffer size of \var{capacity}. If |
| 1320 | \var{flushLevel} is not specified, \constant{ERROR} is used. If no |
| 1321 | \var{target} is specified, the target will need to be set using |
| 1322 | \method{setTarget()} before this handler does anything useful. |
| 1323 | \end{classdesc} |
| 1324 | |
| 1325 | \begin{methoddesc}{close}{} |
| 1326 | Calls \method{flush()}, sets the target to \constant{None} and |
| 1327 | clears the buffer. |
| 1328 | \end{methoddesc} |
| 1329 | |
| 1330 | \begin{methoddesc}{flush}{} |
| 1331 | For a \class{MemoryHandler}, flushing means just sending the buffered |
| 1332 | records to the target, if there is one. Override if you want |
Raymond Hettinger | 2ef85a7 | 2003-01-25 21:46:53 +0000 | [diff] [blame] | 1333 | different behavior. |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 1334 | \end{methoddesc} |
| 1335 | |
| 1336 | \begin{methoddesc}{setTarget}{target} |
| 1337 | Sets the target handler for this handler. |
| 1338 | \end{methoddesc} |
| 1339 | |
| 1340 | \begin{methoddesc}{shouldFlush}{record} |
| 1341 | Checks for buffer full or a record at the \var{flushLevel} or higher. |
| 1342 | \end{methoddesc} |
| 1343 | |
| 1344 | \subsubsection{HTTPHandler} |
| 1345 | |
Vinay Sajip | 51f5235 | 2006-01-22 11:58:39 +0000 | [diff] [blame] | 1346 | The \class{HTTPHandler} class, located in the |
| 1347 | \module{logging.handlers} module, supports sending logging messages to |
| 1348 | a Web server, using either \samp{GET} or \samp{POST} semantics. |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 1349 | |
| 1350 | \begin{classdesc}{HTTPHandler}{host, url\optional{, method}} |
| 1351 | Returns a new instance of the \class{HTTPHandler} class. The |
| 1352 | instance is initialized with a host address, url and HTTP method. |
Vinay Sajip | 00b5c93 | 2005-10-29 00:40:15 +0000 | [diff] [blame] | 1353 | The \var{host} can be of the form \code{host:port}, should you need to |
| 1354 | use a specific port number. If no \var{method} is specified, \samp{GET} |
| 1355 | is used. |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 1356 | \end{classdesc} |
| 1357 | |
| 1358 | \begin{methoddesc}{emit}{record} |
| 1359 | Sends the record to the Web server as an URL-encoded dictionary. |
| 1360 | \end{methoddesc} |
| 1361 | |
| 1362 | \subsection{Formatter Objects} |
| 1363 | |
| 1364 | \class{Formatter}s have the following attributes and methods. They are |
| 1365 | responsible for converting a \class{LogRecord} to (usually) a string |
| 1366 | which can be interpreted by either a human or an external system. The |
| 1367 | base |
| 1368 | \class{Formatter} allows a formatting string to be specified. If none is |
Fred Drake | 8efc74d | 2004-04-15 06:18:48 +0000 | [diff] [blame] | 1369 | supplied, the default value of \code{'\%(message)s'} is used. |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 1370 | |
| 1371 | A Formatter can be initialized with a format string which makes use of |
Raymond Hettinger | 6f3eaa6 | 2003-06-27 21:43:39 +0000 | [diff] [blame] | 1372 | knowledge of the \class{LogRecord} attributes - such as the default value |
| 1373 | mentioned above making use of the fact that the user's message and |
Fred Drake | 6b3b046 | 2004-04-09 18:26:40 +0000 | [diff] [blame] | 1374 | arguments are pre-formatted into a \class{LogRecord}'s \var{message} |
Anthony Baxter | a6b7d34 | 2003-07-08 08:40:20 +0000 | [diff] [blame] | 1375 | attribute. This format string contains standard python \%-style |
| 1376 | mapping keys. See section \ref{typesseq-strings}, ``String Formatting |
| 1377 | Operations,'' for more information on string formatting. |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 1378 | |
Fred Drake | 6b3b046 | 2004-04-09 18:26:40 +0000 | [diff] [blame] | 1379 | Currently, the useful mapping keys in a \class{LogRecord} are: |
Anthony Baxter | a6b7d34 | 2003-07-08 08:40:20 +0000 | [diff] [blame] | 1380 | |
Fred Drake | 9a5b6a6 | 2003-07-08 15:38:40 +0000 | [diff] [blame] | 1381 | \begin{tableii}{l|l}{code}{Format}{Description} |
| 1382 | \lineii{\%(name)s} {Name of the logger (logging channel).} |
| 1383 | \lineii{\%(levelno)s} {Numeric logging level for the message |
| 1384 | (\constant{DEBUG}, \constant{INFO}, |
| 1385 | \constant{WARNING}, \constant{ERROR}, |
| 1386 | \constant{CRITICAL}).} |
| 1387 | \lineii{\%(levelname)s}{Text logging level for the message |
| 1388 | (\code{'DEBUG'}, \code{'INFO'}, |
| 1389 | \code{'WARNING'}, \code{'ERROR'}, |
| 1390 | \code{'CRITICAL'}).} |
| 1391 | \lineii{\%(pathname)s} {Full pathname of the source file where the logging |
| 1392 | call was issued (if available).} |
| 1393 | \lineii{\%(filename)s} {Filename portion of pathname.} |
| 1394 | \lineii{\%(module)s} {Module (name portion of filename).} |
Neal Norwitz | c16dd48 | 2006-02-13 02:04:37 +0000 | [diff] [blame] | 1395 | \lineii{\%(funcName)s} {Name of function containing the logging call.} |
Fred Drake | 9a5b6a6 | 2003-07-08 15:38:40 +0000 | [diff] [blame] | 1396 | \lineii{\%(lineno)d} {Source line number where the logging call was issued |
| 1397 | (if available).} |
Fred Drake | 6b3b046 | 2004-04-09 18:26:40 +0000 | [diff] [blame] | 1398 | \lineii{\%(created)f} {Time when the \class{LogRecord} was created (as |
Fred Drake | 9a5b6a6 | 2003-07-08 15:38:40 +0000 | [diff] [blame] | 1399 | returned by \function{time.time()}).} |
Fred Drake | 6b3b046 | 2004-04-09 18:26:40 +0000 | [diff] [blame] | 1400 | \lineii{\%(asctime)s} {Human-readable time when the \class{LogRecord} |
| 1401 | was created. By default this is of the form |
Fred Drake | 9a5b6a6 | 2003-07-08 15:38:40 +0000 | [diff] [blame] | 1402 | ``2003-07-08 16:49:45,896'' (the numbers after the |
| 1403 | comma are millisecond portion of the time).} |
| 1404 | \lineii{\%(msecs)d} {Millisecond portion of the time when the |
| 1405 | \class{LogRecord} was created.} |
| 1406 | \lineii{\%(thread)d} {Thread ID (if available).} |
Vinay Sajip | 99358df | 2005-03-31 20:18:06 +0000 | [diff] [blame] | 1407 | \lineii{\%(threadName)s} {Thread name (if available).} |
Fred Drake | 9a5b6a6 | 2003-07-08 15:38:40 +0000 | [diff] [blame] | 1408 | \lineii{\%(process)d} {Process ID (if available).} |
| 1409 | \lineii{\%(message)s} {The logged message, computed as \code{msg \% args}.} |
Anthony Baxter | a6b7d34 | 2003-07-08 08:40:20 +0000 | [diff] [blame] | 1410 | \end{tableii} |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 1411 | |
Neal Norwitz | c16dd48 | 2006-02-13 02:04:37 +0000 | [diff] [blame] | 1412 | \versionchanged[\var{funcName} was added]{2.5} |
| 1413 | |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 1414 | \begin{classdesc}{Formatter}{\optional{fmt\optional{, datefmt}}} |
| 1415 | Returns a new instance of the \class{Formatter} class. The |
| 1416 | instance is initialized with a format string for the message as a whole, |
| 1417 | as well as a format string for the date/time portion of a message. If |
Neal Norwitz | dd3afa7 | 2003-07-08 16:26:34 +0000 | [diff] [blame] | 1418 | no \var{fmt} is specified, \code{'\%(message)s'} is used. If no \var{datefmt} |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 1419 | is specified, the ISO8601 date format is used. |
| 1420 | \end{classdesc} |
| 1421 | |
| 1422 | \begin{methoddesc}{format}{record} |
| 1423 | The record's attribute dictionary is used as the operand to a |
| 1424 | string formatting operation. Returns the resulting string. |
| 1425 | Before formatting the dictionary, a couple of preparatory steps |
| 1426 | are carried out. The \var{message} attribute of the record is computed |
| 1427 | using \var{msg} \% \var{args}. If the formatting string contains |
Fred Drake | 9a5b6a6 | 2003-07-08 15:38:40 +0000 | [diff] [blame] | 1428 | \code{'(asctime)'}, \method{formatTime()} is called to format the |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 1429 | event time. If there is exception information, it is formatted using |
| 1430 | \method{formatException()} and appended to the message. |
| 1431 | \end{methoddesc} |
| 1432 | |
| 1433 | \begin{methoddesc}{formatTime}{record\optional{, datefmt}} |
| 1434 | This method should be called from \method{format()} by a formatter which |
| 1435 | wants to make use of a formatted time. This method can be overridden |
| 1436 | in formatters to provide for any specific requirement, but the |
Raymond Hettinger | 2ef85a7 | 2003-01-25 21:46:53 +0000 | [diff] [blame] | 1437 | basic behavior is as follows: if \var{datefmt} (a string) is specified, |
Fred Drake | c23e019 | 2003-01-28 22:09:16 +0000 | [diff] [blame] | 1438 | it is used with \function{time.strftime()} to format the creation time of the |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 1439 | record. Otherwise, the ISO8601 format is used. The resulting |
| 1440 | string is returned. |
| 1441 | \end{methoddesc} |
| 1442 | |
| 1443 | \begin{methoddesc}{formatException}{exc_info} |
| 1444 | Formats the specified exception information (a standard exception tuple |
Fred Drake | c23e019 | 2003-01-28 22:09:16 +0000 | [diff] [blame] | 1445 | as returned by \function{sys.exc_info()}) as a string. This default |
| 1446 | implementation just uses \function{traceback.print_exception()}. |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 1447 | The resulting string is returned. |
| 1448 | \end{methoddesc} |
| 1449 | |
| 1450 | \subsection{Filter Objects} |
| 1451 | |
| 1452 | \class{Filter}s can be used by \class{Handler}s and \class{Logger}s for |
| 1453 | more sophisticated filtering than is provided by levels. The base filter |
| 1454 | class only allows events which are below a certain point in the logger |
| 1455 | hierarchy. For example, a filter initialized with "A.B" will allow events |
| 1456 | logged by loggers "A.B", "A.B.C", "A.B.C.D", "A.B.D" etc. but not "A.BB", |
| 1457 | "B.A.B" etc. If initialized with the empty string, all events are passed. |
| 1458 | |
| 1459 | \begin{classdesc}{Filter}{\optional{name}} |
| 1460 | Returns an instance of the \class{Filter} class. If \var{name} is specified, |
| 1461 | it names a logger which, together with its children, will have its events |
| 1462 | allowed through the filter. If no name is specified, allows every event. |
| 1463 | \end{classdesc} |
| 1464 | |
| 1465 | \begin{methoddesc}{filter}{record} |
| 1466 | Is the specified record to be logged? Returns zero for no, nonzero for |
| 1467 | yes. If deemed appropriate, the record may be modified in-place by this |
| 1468 | method. |
| 1469 | \end{methoddesc} |
| 1470 | |
| 1471 | \subsection{LogRecord Objects} |
| 1472 | |
Fred Drake | 6b3b046 | 2004-04-09 18:26:40 +0000 | [diff] [blame] | 1473 | \class{LogRecord} instances are created every time something is logged. They |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 1474 | contain all the information pertinent to the event being logged. The |
| 1475 | main information passed in is in msg and args, which are combined |
| 1476 | using msg \% args to create the message field of the record. The record |
| 1477 | also includes information such as when the record was created, the |
| 1478 | source line where the logging call was made, and any exception |
| 1479 | information to be logged. |
| 1480 | |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 1481 | \begin{classdesc}{LogRecord}{name, lvl, pathname, lineno, msg, args, |
Fred Drake | 9a5b6a6 | 2003-07-08 15:38:40 +0000 | [diff] [blame] | 1482 | exc_info} |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 1483 | Returns an instance of \class{LogRecord} initialized with interesting |
| 1484 | information. The \var{name} is the logger name; \var{lvl} is the |
| 1485 | numeric level; \var{pathname} is the absolute pathname of the source |
| 1486 | file in which the logging call was made; \var{lineno} is the line |
| 1487 | number in that file where the logging call is found; \var{msg} is the |
| 1488 | user-supplied message (a format string); \var{args} is the tuple |
| 1489 | which, together with \var{msg}, makes up the user message; and |
| 1490 | \var{exc_info} is the exception tuple obtained by calling |
| 1491 | \function{sys.exc_info() }(or \constant{None}, if no exception information |
| 1492 | is available). |
| 1493 | \end{classdesc} |
| 1494 | |
Vinay Sajip | e8fdc45 | 2004-12-02 21:27:42 +0000 | [diff] [blame] | 1495 | \begin{methoddesc}{getMessage}{} |
| 1496 | Returns the message for this \class{LogRecord} instance after merging any |
| 1497 | user-supplied arguments with the message. |
| 1498 | \end{methoddesc} |
| 1499 | |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 1500 | \subsection{Thread Safety} |
| 1501 | |
| 1502 | The logging module is intended to be thread-safe without any special work |
| 1503 | needing to be done by its clients. It achieves this though using threading |
| 1504 | locks; there is one lock to serialize access to the module's shared data, |
| 1505 | and each handler also creates a lock to serialize access to its underlying |
| 1506 | I/O. |
| 1507 | |
| 1508 | \subsection{Configuration} |
| 1509 | |
| 1510 | |
Fred Drake | 94ffbb7 | 2004-04-08 19:44:31 +0000 | [diff] [blame] | 1511 | \subsubsection{Configuration functions% |
| 1512 | \label{logging-config-api}} |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 1513 | |
Vinay Sajip | 51f5235 | 2006-01-22 11:58:39 +0000 | [diff] [blame] | 1514 | The following functions configure the logging module. They are located in the |
| 1515 | \module{logging.config} module. Their use is optional --- you can configure |
| 1516 | the logging module using these functions or by making calls to the |
| 1517 | main API (defined in \module{logging} itself) and defining handlers |
| 1518 | which are declared either in \module{logging} or |
| 1519 | \module{logging.handlers}. |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 1520 | |
| 1521 | \begin{funcdesc}{fileConfig}{fname\optional{, defaults}} |
| 1522 | Reads the logging configuration from a ConfigParser-format file named |
| 1523 | \var{fname}. This function can be called several times from an application, |
| 1524 | allowing an end user the ability to select from various pre-canned |
| 1525 | configurations (if the developer provides a mechanism to present the |
| 1526 | choices and load the chosen configuration). Defaults to be passed to |
| 1527 | ConfigParser can be specified in the \var{defaults} argument. |
| 1528 | \end{funcdesc} |
| 1529 | |
| 1530 | \begin{funcdesc}{listen}{\optional{port}} |
| 1531 | Starts up a socket server on the specified port, and listens for new |
| 1532 | configurations. If no port is specified, the module's default |
| 1533 | \constant{DEFAULT_LOGGING_CONFIG_PORT} is used. Logging configurations |
| 1534 | will be sent as a file suitable for processing by \function{fileConfig()}. |
| 1535 | Returns a \class{Thread} instance on which you can call \method{start()} |
| 1536 | to start the server, and which you can \method{join()} when appropriate. |
Vinay Sajip | 4c1423b | 2005-06-05 20:39:36 +0000 | [diff] [blame] | 1537 | To stop the server, call \function{stopListening()}. To send a configuration |
| 1538 | to the socket, read in the configuration file and send it to the socket |
| 1539 | as a string of bytes preceded by a four-byte length packed in binary using |
Thomas Wouters | 0e3f591 | 2006-08-11 14:57:12 +0000 | [diff] [blame] | 1540 | struct.\code{pack('>L', n)}. |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 1541 | \end{funcdesc} |
| 1542 | |
| 1543 | \begin{funcdesc}{stopListening}{} |
| 1544 | Stops the listening server which was created with a call to |
| 1545 | \function{listen()}. This is typically called before calling \method{join()} |
| 1546 | on the return value from \function{listen()}. |
| 1547 | \end{funcdesc} |
| 1548 | |
Fred Drake | 94ffbb7 | 2004-04-08 19:44:31 +0000 | [diff] [blame] | 1549 | \subsubsection{Configuration file format% |
| 1550 | \label{logging-config-fileformat}} |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 1551 | |
Fred Drake | 6b3b046 | 2004-04-09 18:26:40 +0000 | [diff] [blame] | 1552 | The configuration file format understood by \function{fileConfig()} is |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 1553 | based on ConfigParser functionality. The file must contain sections |
| 1554 | called \code{[loggers]}, \code{[handlers]} and \code{[formatters]} |
| 1555 | which identify by name the entities of each type which are defined in |
| 1556 | the file. For each such entity, there is a separate section which |
| 1557 | identified how that entity is configured. Thus, for a logger named |
| 1558 | \code{log01} in the \code{[loggers]} section, the relevant |
| 1559 | configuration details are held in a section |
| 1560 | \code{[logger_log01]}. Similarly, a handler called \code{hand01} in |
| 1561 | the \code{[handlers]} section will have its configuration held in a |
| 1562 | section called \code{[handler_hand01]}, while a formatter called |
| 1563 | \code{form01} in the \code{[formatters]} section will have its |
| 1564 | configuration specified in a section called |
| 1565 | \code{[formatter_form01]}. The root logger configuration must be |
| 1566 | specified in a section called \code{[logger_root]}. |
| 1567 | |
| 1568 | Examples of these sections in the file are given below. |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 1569 | |
| 1570 | \begin{verbatim} |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 1571 | [loggers] |
| 1572 | keys=root,log02,log03,log04,log05,log06,log07 |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 1573 | |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 1574 | [handlers] |
| 1575 | keys=hand01,hand02,hand03,hand04,hand05,hand06,hand07,hand08,hand09 |
| 1576 | |
| 1577 | [formatters] |
| 1578 | keys=form01,form02,form03,form04,form05,form06,form07,form08,form09 |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 1579 | \end{verbatim} |
| 1580 | |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 1581 | The root logger must specify a level and a list of handlers. An |
| 1582 | example of a root logger section is given below. |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 1583 | |
| 1584 | \begin{verbatim} |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 1585 | [logger_root] |
| 1586 | level=NOTSET |
| 1587 | handlers=hand01 |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 1588 | \end{verbatim} |
| 1589 | |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 1590 | The \code{level} entry can be one of \code{DEBUG, INFO, WARNING, |
| 1591 | ERROR, CRITICAL} or \code{NOTSET}. For the root logger only, |
| 1592 | \code{NOTSET} means that all messages will be logged. Level values are |
| 1593 | \function{eval()}uated in the context of the \code{logging} package's |
| 1594 | namespace. |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 1595 | |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 1596 | The \code{handlers} entry is a comma-separated list of handler names, |
| 1597 | which must appear in the \code{[handlers]} section. These names must |
| 1598 | appear in the \code{[handlers]} section and have corresponding |
| 1599 | sections in the configuration file. |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 1600 | |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 1601 | For loggers other than the root logger, some additional information is |
| 1602 | required. This is illustrated by the following example. |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 1603 | |
| 1604 | \begin{verbatim} |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 1605 | [logger_parser] |
| 1606 | level=DEBUG |
| 1607 | handlers=hand01 |
| 1608 | propagate=1 |
| 1609 | qualname=compiler.parser |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 1610 | \end{verbatim} |
| 1611 | |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 1612 | The \code{level} and \code{handlers} entries are interpreted as for |
| 1613 | the root logger, except that if a non-root logger's level is specified |
| 1614 | as \code{NOTSET}, the system consults loggers higher up the hierarchy |
| 1615 | to determine the effective level of the logger. The \code{propagate} |
| 1616 | entry is set to 1 to indicate that messages must propagate to handlers |
| 1617 | higher up the logger hierarchy from this logger, or 0 to indicate that |
| 1618 | messages are \strong{not} propagated to handlers up the hierarchy. The |
| 1619 | \code{qualname} entry is the hierarchical channel name of the logger, |
Vinay Sajip | a13c60b | 2004-07-03 11:45:53 +0000 | [diff] [blame] | 1620 | that is to say the name used by the application to get the logger. |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 1621 | |
| 1622 | Sections which specify handler configuration are exemplified by the |
| 1623 | following. |
| 1624 | |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 1625 | \begin{verbatim} |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 1626 | [handler_hand01] |
| 1627 | class=StreamHandler |
| 1628 | level=NOTSET |
| 1629 | formatter=form01 |
| 1630 | args=(sys.stdout,) |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 1631 | \end{verbatim} |
| 1632 | |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 1633 | The \code{class} entry indicates the handler's class (as determined by |
| 1634 | \function{eval()} in the \code{logging} package's namespace). The |
| 1635 | \code{level} is interpreted as for loggers, and \code{NOTSET} is taken |
| 1636 | to mean "log everything". |
| 1637 | |
| 1638 | The \code{formatter} entry indicates the key name of the formatter for |
| 1639 | this handler. If blank, a default formatter |
| 1640 | (\code{logging._defaultFormatter}) is used. If a name is specified, it |
| 1641 | must appear in the \code{[formatters]} section and have a |
| 1642 | corresponding section in the configuration file. |
| 1643 | |
| 1644 | The \code{args} entry, when \function{eval()}uated in the context of |
| 1645 | the \code{logging} package's namespace, is the list of arguments to |
| 1646 | the constructor for the handler class. Refer to the constructors for |
| 1647 | the relevant handlers, or to the examples below, to see how typical |
| 1648 | entries are constructed. |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 1649 | |
| 1650 | \begin{verbatim} |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 1651 | [handler_hand02] |
| 1652 | class=FileHandler |
| 1653 | level=DEBUG |
| 1654 | formatter=form02 |
| 1655 | args=('python.log', 'w') |
| 1656 | |
| 1657 | [handler_hand03] |
| 1658 | class=handlers.SocketHandler |
| 1659 | level=INFO |
| 1660 | formatter=form03 |
| 1661 | args=('localhost', handlers.DEFAULT_TCP_LOGGING_PORT) |
| 1662 | |
| 1663 | [handler_hand04] |
| 1664 | class=handlers.DatagramHandler |
| 1665 | level=WARN |
| 1666 | formatter=form04 |
| 1667 | args=('localhost', handlers.DEFAULT_UDP_LOGGING_PORT) |
| 1668 | |
| 1669 | [handler_hand05] |
| 1670 | class=handlers.SysLogHandler |
| 1671 | level=ERROR |
| 1672 | formatter=form05 |
| 1673 | args=(('localhost', handlers.SYSLOG_UDP_PORT), handlers.SysLogHandler.LOG_USER) |
| 1674 | |
| 1675 | [handler_hand06] |
Vinay Sajip | 20f42c4 | 2004-07-12 15:48:04 +0000 | [diff] [blame] | 1676 | class=handlers.NTEventLogHandler |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 1677 | level=CRITICAL |
| 1678 | formatter=form06 |
| 1679 | args=('Python Application', '', 'Application') |
| 1680 | |
| 1681 | [handler_hand07] |
Vinay Sajip | 20f42c4 | 2004-07-12 15:48:04 +0000 | [diff] [blame] | 1682 | class=handlers.SMTPHandler |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 1683 | level=WARN |
| 1684 | formatter=form07 |
| 1685 | args=('localhost', 'from@abc', ['user1@abc', 'user2@xyz'], 'Logger Subject') |
| 1686 | |
| 1687 | [handler_hand08] |
Vinay Sajip | 20f42c4 | 2004-07-12 15:48:04 +0000 | [diff] [blame] | 1688 | class=handlers.MemoryHandler |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 1689 | level=NOTSET |
| 1690 | formatter=form08 |
| 1691 | target= |
| 1692 | args=(10, ERROR) |
| 1693 | |
| 1694 | [handler_hand09] |
Vinay Sajip | 20f42c4 | 2004-07-12 15:48:04 +0000 | [diff] [blame] | 1695 | class=handlers.HTTPHandler |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 1696 | level=NOTSET |
| 1697 | formatter=form09 |
| 1698 | args=('localhost:9022', '/log', 'GET') |
Skip Montanaro | 649698f | 2002-11-14 03:57:19 +0000 | [diff] [blame] | 1699 | \end{verbatim} |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 1700 | |
| 1701 | Sections which specify formatter configuration are typified by the following. |
| 1702 | |
| 1703 | \begin{verbatim} |
| 1704 | [formatter_form01] |
| 1705 | format=F1 %(asctime)s %(levelname)s %(message)s |
| 1706 | datefmt= |
Vinay Sajip | 51f5235 | 2006-01-22 11:58:39 +0000 | [diff] [blame] | 1707 | class=logging.Formatter |
Neal Norwitz | cd5c8c2 | 2003-01-25 21:29:41 +0000 | [diff] [blame] | 1708 | \end{verbatim} |
| 1709 | |
| 1710 | The \code{format} entry is the overall format string, and the |
| 1711 | \code{datefmt} entry is the \function{strftime()}-compatible date/time format |
| 1712 | string. If empty, the package substitutes ISO8601 format date/times, which |
| 1713 | is almost equivalent to specifying the date format string "%Y-%m-%d %H:%M:%S". |
| 1714 | The ISO8601 format also specifies milliseconds, which are appended to the |
| 1715 | result of using the above format string, with a comma separator. An example |
| 1716 | time in ISO8601 format is \code{2003-01-23 00:29:50,411}. |
Vinay Sajip | 51f5235 | 2006-01-22 11:58:39 +0000 | [diff] [blame] | 1717 | |
| 1718 | The \code{class} entry is optional. It indicates the name of the |
| 1719 | formatter's class (as a dotted module and class name.) This option is |
| 1720 | useful for instantiating a \class{Formatter} subclass. Subclasses of |
| 1721 | \class{Formatter} can present exception tracebacks in an expanded or |
| 1722 | condensed format. |