blob: 8fe5bd99b2c60e785f059188316348b61623beea [file] [log] [blame]
Vinay Sajip9b727ec2012-01-25 17:49:45 +00001# Copyright 2001-2012 by Vinay Sajip. All Rights Reserved.
Guido van Rossum57102f82002-11-13 16:15:58 +00002#
3# Permission to use, copy, modify, and distribute this software and its
4# documentation for any purpose and without fee is hereby granted,
5# provided that the above copyright notice appear in all copies and that
6# both that copyright notice and this permission notice appear in
7# supporting documentation, and that the name of Vinay Sajip
8# not be used in advertising or publicity pertaining to distribution
9# of the software without specific, written prior permission.
10# VINAY SAJIP DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
11# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
12# VINAY SAJIP BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
13# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
14# IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
15# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
Guido van Rossum57102f82002-11-13 16:15:58 +000016
17"""
18Logging package for Python. Based on PEP 282 and comments thereto in
19comp.lang.python, and influenced by Apache's log4j system.
20
Vinay Sajipe6c1eb92011-03-29 17:20:34 +010021Copyright (C) 2001-2011 Vinay Sajip. All Rights Reserved.
Guido van Rossum57102f82002-11-13 16:15:58 +000022
23To use, simply 'import logging' and log away!
24"""
25
Benjamin Peterson55549932009-11-25 17:19:56 +000026import sys, os, time, io, traceback, warnings, weakref
Vinay Sajip6a65c5d2010-10-26 13:16:11 +000027from string import Template
Georg Brandlf9734072008-12-07 15:30:06 +000028
Christian Heimes18c66892008-02-17 13:31:39 +000029__all__ = ['BASIC_FORMAT', 'BufferingFormatter', 'CRITICAL', 'DEBUG', 'ERROR',
Vinay Sajipad5fa2f2009-04-27 13:55:05 +000030 'FATAL', 'FileHandler', 'Filter', 'Formatter', 'Handler', 'INFO',
31 'LogRecord', 'Logger', 'LoggerAdapter', 'NOTSET', 'NullHandler',
32 'StreamHandler', 'WARN', 'WARNING', 'addLevelName', 'basicConfig',
33 'captureWarnings', 'critical', 'debug', 'disable', 'error',
34 'exception', 'fatal', 'getLevelName', 'getLogger', 'getLoggerClass',
Vinay Sajip062d56b2010-10-19 15:26:24 +000035 'info', 'log', 'makeLogRecord', 'setLoggerClass', 'warn', 'warning',
Vinay Sajip5a27d402010-12-10 11:42:57 +000036 'getLogRecordFactory', 'setLogRecordFactory', 'lastResort']
Vinay Sajipb89e7c92005-03-13 09:54:31 +000037
38try:
Guido van Rossum57102f82002-11-13 16:15:58 +000039 import threading
Vinay Sajip26fe4b72011-04-26 18:43:05 +010040except ImportError: #pragma: no cover
Victor Stinner2a129742011-05-30 23:02:52 +020041 threading = None
Guido van Rossum57102f82002-11-13 16:15:58 +000042
43__author__ = "Vinay Sajip <vinay_sajip@red-dove.com>"
Thomas Wouters477c8d52006-05-27 19:21:47 +000044__status__ = "production"
Vinay Sajipdb81c4c2010-02-25 23:13:06 +000045__version__ = "0.5.1.2"
46__date__ = "07 February 2010"
Guido van Rossum57102f82002-11-13 16:15:58 +000047
48#---------------------------------------------------------------------------
49# Miscellaneous module data
50#---------------------------------------------------------------------------
51
52#
Vinay Sajip829dc512005-02-18 11:53:32 +000053# _srcfile is used when walking the stack to check when we've got the first
Guido van Rossum57102f82002-11-13 16:15:58 +000054# caller stack frame.
Neal Norwitz6fa635d2003-02-18 14:20:07 +000055#
Vinay Sajipc384fc22005-09-02 11:20:33 +000056if hasattr(sys, 'frozen'): #support for py2exe
57 _srcfile = "logging%s__init__%s" % (os.sep, __file__[-4:])
Guido van Rossum57102f82002-11-13 16:15:58 +000058else:
Guido van Rossum455ab772002-11-13 16:18:29 +000059 _srcfile = __file__
60_srcfile = os.path.normcase(_srcfile)
Guido van Rossum57102f82002-11-13 16:15:58 +000061
Vinay Sajip829dc512005-02-18 11:53:32 +000062
Vinay Sajip26fe4b72011-04-26 18:43:05 +010063if hasattr(sys, '_getframe'):
64 currentframe = lambda: sys._getframe(3)
65else: #pragma: no cover
66 def currentframe():
67 """Return the frame object for the caller's stack frame."""
68 try:
69 raise Exception
70 except:
71 return sys.exc_info()[2].tb_frame.f_back
Vinay Sajip829dc512005-02-18 11:53:32 +000072
Jeremy Hylton250684d2003-01-23 18:29:29 +000073# _srcfile is only used in conjunction with sys._getframe().
74# To provide compatibility with older versions of Python, set _srcfile
75# to None if _getframe() is not available; this value will prevent
76# findCaller() from being called.
Vinay Sajip829dc512005-02-18 11:53:32 +000077#if not hasattr(sys, "_getframe"):
78# _srcfile = None
Jeremy Hylton250684d2003-01-23 18:29:29 +000079
Guido van Rossum57102f82002-11-13 16:15:58 +000080#
81#_startTime is used as the base when calculating the relative time of events
82#
83_startTime = time.time()
84
85#
86#raiseExceptions is used to see if exceptions during handling should be
87#propagated
88#
Vinay Sajip26fe4b72011-04-26 18:43:05 +010089raiseExceptions = True
Guido van Rossum57102f82002-11-13 16:15:58 +000090
Vinay Sajipd364a072006-03-13 22:05:28 +000091#
92# If you don't want threading information in the log, set this to zero
93#
Vinay Sajip26fe4b72011-04-26 18:43:05 +010094logThreads = True
Vinay Sajipd364a072006-03-13 22:05:28 +000095
96#
Jesse Noller9a0fc972009-01-18 21:12:58 +000097# If you don't want multiprocessing information in the log, set this to zero
98#
Vinay Sajip26fe4b72011-04-26 18:43:05 +010099logMultiprocessing = True
Jesse Noller9a0fc972009-01-18 21:12:58 +0000100
101#
Vinay Sajipd364a072006-03-13 22:05:28 +0000102# If you don't want process information in the log, set this to zero
103#
Vinay Sajip26fe4b72011-04-26 18:43:05 +0100104logProcesses = True
Vinay Sajipd364a072006-03-13 22:05:28 +0000105
Guido van Rossum57102f82002-11-13 16:15:58 +0000106#---------------------------------------------------------------------------
107# Level related stuff
108#---------------------------------------------------------------------------
109#
110# Default levels and level names, these can be replaced with any positive set
111# of values having corresponding names. There is a pseudo-level, NOTSET, which
112# is only really there as a lower limit for user-defined levels. Handlers and
113# loggers are initialized with NOTSET so that they will log all messages, even
114# at user-defined levels.
115#
Vinay Sajipb89e7c92005-03-13 09:54:31 +0000116
Guido van Rossum57102f82002-11-13 16:15:58 +0000117CRITICAL = 50
118FATAL = CRITICAL
119ERROR = 40
Neal Norwitz6fa635d2003-02-18 14:20:07 +0000120WARNING = 30
121WARN = WARNING
Guido van Rossum57102f82002-11-13 16:15:58 +0000122INFO = 20
123DEBUG = 10
124NOTSET = 0
125
126_levelNames = {
127 CRITICAL : 'CRITICAL',
128 ERROR : 'ERROR',
Neal Norwitz6fa635d2003-02-18 14:20:07 +0000129 WARNING : 'WARNING',
Guido van Rossum57102f82002-11-13 16:15:58 +0000130 INFO : 'INFO',
131 DEBUG : 'DEBUG',
132 NOTSET : 'NOTSET',
133 'CRITICAL' : CRITICAL,
134 'ERROR' : ERROR,
Neal Norwitz6fa635d2003-02-18 14:20:07 +0000135 'WARN' : WARNING,
136 'WARNING' : WARNING,
Guido van Rossum57102f82002-11-13 16:15:58 +0000137 'INFO' : INFO,
138 'DEBUG' : DEBUG,
139 'NOTSET' : NOTSET,
140}
141
142def getLevelName(level):
143 """
144 Return the textual representation of logging level 'level'.
145
Neal Norwitz6fa635d2003-02-18 14:20:07 +0000146 If the level is one of the predefined levels (CRITICAL, ERROR, WARNING,
Guido van Rossum57102f82002-11-13 16:15:58 +0000147 INFO, DEBUG) then you get the corresponding string. If you have
148 associated levels with names using addLevelName then the name you have
Vinay Sajip779e0c92004-07-03 11:47:26 +0000149 associated with 'level' is returned.
150
151 If a numeric value corresponding to one of the defined levels is passed
152 in, the corresponding string representation is returned.
153
154 Otherwise, the string "Level %s" % level is returned.
Guido van Rossum57102f82002-11-13 16:15:58 +0000155 """
156 return _levelNames.get(level, ("Level %s" % level))
157
158def addLevelName(level, levelName):
159 """
160 Associate 'levelName' with 'level'.
161
162 This is used when converting levels to text during message formatting.
163 """
164 _acquireLock()
165 try: #unlikely to cause an exception, but you never know...
166 _levelNames[level] = levelName
167 _levelNames[levelName] = level
168 finally:
169 _releaseLock()
170
Vinay Sajipd4fabf42009-07-13 11:28:25 +0000171def _checkLevel(level):
172 if isinstance(level, int):
173 rv = level
174 elif str(level) == level:
175 if level not in _levelNames:
176 raise ValueError("Unknown level: %r" % level)
177 rv = _levelNames[level]
178 else:
179 raise TypeError("Level not an integer or a valid string: %r" % level)
180 return rv
181
Guido van Rossum57102f82002-11-13 16:15:58 +0000182#---------------------------------------------------------------------------
183# Thread-related stuff
184#---------------------------------------------------------------------------
185
186#
187#_lock is used to serialize access to shared data structures in this module.
Benjamin Peterson55549932009-11-25 17:19:56 +0000188#This needs to be an RLock because fileConfig() creates and configures
189#Handlers, and so might arbitrary user threads. Since Handler code updates the
190#shared dictionary _handlers, it needs to acquire the lock. But if configuring,
Guido van Rossum57102f82002-11-13 16:15:58 +0000191#the lock would already have been acquired - so we need an RLock.
192#The same argument applies to Loggers and Manager.loggerDict.
193#
Victor Stinner2a129742011-05-30 23:02:52 +0200194if threading:
Vinay Sajip03f6c112009-11-27 14:03:36 +0000195 _lock = threading.RLock()
Vinay Sajip26fe4b72011-04-26 18:43:05 +0100196else: #pragma: no cover
Vinay Sajip03f6c112009-11-27 14:03:36 +0000197 _lock = None
198
Guido van Rossum57102f82002-11-13 16:15:58 +0000199
200def _acquireLock():
201 """
202 Acquire the module-level lock for serializing access to shared data.
203
204 This should be released with _releaseLock().
205 """
Guido van Rossum57102f82002-11-13 16:15:58 +0000206 if _lock:
207 _lock.acquire()
208
209def _releaseLock():
210 """
211 Release the module-level lock acquired by calling _acquireLock().
212 """
213 if _lock:
214 _lock.release()
215
216#---------------------------------------------------------------------------
217# The logging record
218#---------------------------------------------------------------------------
219
Benjamin Peterson55549932009-11-25 17:19:56 +0000220class LogRecord(object):
Guido van Rossum57102f82002-11-13 16:15:58 +0000221 """
222 A LogRecord instance represents an event being logged.
223
224 LogRecord instances are created every time something is logged. They
225 contain all the information pertinent to the event being logged. The
226 main information passed in is in msg and args, which are combined
227 using str(msg) % args to create the message field of the record. The
228 record also includes information such as when the record was created,
229 the source line where the logging call was made, and any exception
230 information to be logged.
231 """
Vinay Sajiped1992f2006-02-09 08:48:36 +0000232 def __init__(self, name, level, pathname, lineno,
Vinay Sajip61561522010-12-03 11:50:38 +0000233 msg, args, exc_info, func=None, sinfo=None, **kwargs):
Guido van Rossum57102f82002-11-13 16:15:58 +0000234 """
235 Initialize a logging record with interesting information.
236 """
237 ct = time.time()
238 self.name = name
239 self.msg = msg
Vinay Sajip4ed315a2004-10-20 08:39:40 +0000240 #
241 # The following statement allows passing of a dictionary as a sole
242 # argument, so that you can do something like
243 # logging.debug("a %(a)d b %(b)s", {'a':1, 'b':2})
244 # Suggested by Stefan Behnel.
245 # Note that without the test for args[0], we get a problem because
246 # during formatting, we test to see if the arg is present using
247 # 'if self.args:'. If the event being logged is e.g. 'Value is %d'
248 # and if the passed arg fails 'if self.args:' then no formatting
Vinay Sajip0a889532011-10-22 13:34:48 +0100249 # is done. For example, logger.warning('Value is %d', 0) would log
Vinay Sajip4ed315a2004-10-20 08:39:40 +0000250 # 'Value is %d' instead of 'Value is 0'.
251 # For the use case of passing a dictionary, this should not be a
252 # problem.
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000253 if args and len(args) == 1 and isinstance(args[0], dict) and args[0]:
Vinay Sajip4ed315a2004-10-20 08:39:40 +0000254 args = args[0]
Guido van Rossum57102f82002-11-13 16:15:58 +0000255 self.args = args
256 self.levelname = getLevelName(level)
257 self.levelno = level
258 self.pathname = pathname
259 try:
260 self.filename = os.path.basename(pathname)
261 self.module = os.path.splitext(self.filename)[0]
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000262 except (TypeError, ValueError, AttributeError):
Guido van Rossum57102f82002-11-13 16:15:58 +0000263 self.filename = pathname
264 self.module = "Unknown module"
265 self.exc_info = exc_info
Vinay Sajiped6bb142004-02-20 13:18:36 +0000266 self.exc_text = None # used to cache the traceback text
Vinay Sajip8593ae62010-11-14 21:33:04 +0000267 self.stack_info = sinfo
Guido van Rossum57102f82002-11-13 16:15:58 +0000268 self.lineno = lineno
Vinay Sajiped1992f2006-02-09 08:48:36 +0000269 self.funcName = func
Guido van Rossum57102f82002-11-13 16:15:58 +0000270 self.created = ct
Guido van Rossume2a383d2007-01-15 16:59:06 +0000271 self.msecs = (ct - int(ct)) * 1000
Guido van Rossum57102f82002-11-13 16:15:58 +0000272 self.relativeCreated = (self.created - _startTime) * 1000
Victor Stinner2a129742011-05-30 23:02:52 +0200273 if logThreads and threading:
274 self.thread = threading.get_ident()
Benjamin Peterson72753702008-08-18 18:09:21 +0000275 self.threadName = threading.current_thread().name
Vinay Sajip26fe4b72011-04-26 18:43:05 +0100276 else: # pragma: no cover
Guido van Rossum57102f82002-11-13 16:15:58 +0000277 self.thread = None
Vinay Sajip4a704862005-03-31 20:16:55 +0000278 self.threadName = None
Vinay Sajip26fe4b72011-04-26 18:43:05 +0100279 if not logMultiprocessing: # pragma: no cover
Jesse Noller9a0fc972009-01-18 21:12:58 +0000280 self.processName = None
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000281 else:
Benjamin Peterson22005fc2010-04-11 16:25:06 +0000282 self.processName = 'MainProcess'
283 mp = sys.modules.get('multiprocessing')
284 if mp is not None:
285 # Errors may occur if multiprocessing has not finished loading
286 # yet - e.g. if a custom import hook causes third-party code
287 # to run when multiprocessing calls import. See issue 8200
288 # for an example
289 try:
290 self.processName = mp.current_process().name
Vinay Sajip9b727ec2012-01-25 17:49:45 +0000291 except Exception: #pragma: no cover
Benjamin Peterson22005fc2010-04-11 16:25:06 +0000292 pass
Vinay Sajipd364a072006-03-13 22:05:28 +0000293 if logProcesses and hasattr(os, 'getpid'):
Jack Jansen4c641d02003-02-21 22:29:45 +0000294 self.process = os.getpid()
295 else:
296 self.process = None
Guido van Rossum57102f82002-11-13 16:15:58 +0000297
298 def __str__(self):
299 return '<LogRecord: %s, %s, %s, %s, "%s">'%(self.name, self.levelno,
300 self.pathname, self.lineno, self.msg)
301
302 def getMessage(self):
303 """
304 Return the message for this LogRecord.
305
306 Return the message for this LogRecord after merging any user-supplied
307 arguments with the message.
308 """
Vinay Sajipdc5097f2010-08-31 07:52:17 +0000309 msg = str(self.msg)
Guido van Rossum57102f82002-11-13 16:15:58 +0000310 if self.args:
311 msg = msg % self.args
312 return msg
313
Vinay Sajip062d56b2010-10-19 15:26:24 +0000314#
315# Determine which class to use when instantiating log records.
316#
Vinay Sajip61561522010-12-03 11:50:38 +0000317_logRecordFactory = LogRecord
Vinay Sajip062d56b2010-10-19 15:26:24 +0000318
Vinay Sajip61561522010-12-03 11:50:38 +0000319def setLogRecordFactory(factory):
Vinay Sajip062d56b2010-10-19 15:26:24 +0000320 """
Vinay Sajipfad058f2010-12-03 13:01:11 +0000321 Set the factory to be used when instantiating a log record.
Vinay Sajip062d56b2010-10-19 15:26:24 +0000322
Vinay Sajip61561522010-12-03 11:50:38 +0000323 :param factory: A callable which will be called to instantiate
324 a log record.
325 """
326 global _logRecordFactory
327 _logRecordFactory = factory
328
329def getLogRecordFactory():
Vinay Sajip062d56b2010-10-19 15:26:24 +0000330 """
Vinay Sajipfad058f2010-12-03 13:01:11 +0000331 Return the factory to be used when instantiating a log record.
Vinay Sajip062d56b2010-10-19 15:26:24 +0000332 """
333
Vinay Sajip61561522010-12-03 11:50:38 +0000334 return _logRecordFactory
Vinay Sajip062d56b2010-10-19 15:26:24 +0000335
Raymond Hettinger6f3eaa62003-06-27 21:43:39 +0000336def makeLogRecord(dict):
337 """
338 Make a LogRecord whose attributes are defined by the specified dictionary,
339 This function is useful for converting a logging event received over
340 a socket connection (which is sent as a dictionary) into a LogRecord
341 instance.
342 """
Vinay Sajip61561522010-12-03 11:50:38 +0000343 rv = _logRecordFactory(None, None, "", 0, "", (), None, None)
Raymond Hettinger6f3eaa62003-06-27 21:43:39 +0000344 rv.__dict__.update(dict)
345 return rv
346
Guido van Rossum57102f82002-11-13 16:15:58 +0000347#---------------------------------------------------------------------------
348# Formatter classes and functions
349#---------------------------------------------------------------------------
350
Vinay Sajip6a65c5d2010-10-26 13:16:11 +0000351class PercentStyle(object):
352
353 default_format = '%(message)s'
354 asctime_format = '%(asctime)s'
Vinay Sajip10914b72011-02-26 14:15:48 +0000355 asctime_search = '%(asctime)'
Vinay Sajip6a65c5d2010-10-26 13:16:11 +0000356
357 def __init__(self, fmt):
358 self._fmt = fmt or self.default_format
359
360 def usesTime(self):
Vinay Sajip10914b72011-02-26 14:15:48 +0000361 return self._fmt.find(self.asctime_search) >= 0
Vinay Sajip6a65c5d2010-10-26 13:16:11 +0000362
363 def format(self, record):
364 return self._fmt % record.__dict__
365
366class StrFormatStyle(PercentStyle):
367 default_format = '{message}'
368 asctime_format = '{asctime}'
Vinay Sajip10914b72011-02-26 14:15:48 +0000369 asctime_search = '{asctime'
Vinay Sajip6a65c5d2010-10-26 13:16:11 +0000370
371 def format(self, record):
372 return self._fmt.format(**record.__dict__)
373
374
375class StringTemplateStyle(PercentStyle):
376 default_format = '${message}'
377 asctime_format = '${asctime}'
Vinay Sajip89807a52011-02-26 16:06:02 +0000378 asctime_search = '${asctime}'
Vinay Sajip6a65c5d2010-10-26 13:16:11 +0000379
380 def __init__(self, fmt):
381 self._fmt = fmt or self.default_format
382 self._tpl = Template(self._fmt)
383
384 def usesTime(self):
385 fmt = self._fmt
386 return fmt.find('$asctime') >= 0 or fmt.find(self.asctime_format) >= 0
387
388 def format(self, record):
389 return self._tpl.substitute(**record.__dict__)
390
391_STYLES = {
392 '%': PercentStyle,
393 '{': StrFormatStyle,
394 '$': StringTemplateStyle
395}
396
Benjamin Peterson55549932009-11-25 17:19:56 +0000397class Formatter(object):
Guido van Rossum57102f82002-11-13 16:15:58 +0000398 """
399 Formatter instances are used to convert a LogRecord to text.
400
401 Formatters need to know how a LogRecord is constructed. They are
402 responsible for converting a LogRecord to (usually) a string which can
403 be interpreted by either a human or an external system. The base Formatter
404 allows a formatting string to be specified. If none is supplied, the
Vinay Sajip2a20dfc2010-10-20 20:05:38 +0000405 default value of "%s(message)" is used.
Guido van Rossum57102f82002-11-13 16:15:58 +0000406
407 The Formatter can be initialized with a format string which makes use of
408 knowledge of the LogRecord attributes - e.g. the default value mentioned
409 above makes use of the fact that the user's message and arguments are pre-
410 formatted into a LogRecord's message attribute. Currently, the useful
411 attributes in a LogRecord are described by:
412
413 %(name)s Name of the logger (logging channel)
414 %(levelno)s Numeric logging level for the message (DEBUG, INFO,
Neal Norwitz6fa635d2003-02-18 14:20:07 +0000415 WARNING, ERROR, CRITICAL)
Guido van Rossum57102f82002-11-13 16:15:58 +0000416 %(levelname)s Text logging level for the message ("DEBUG", "INFO",
Neal Norwitz6fa635d2003-02-18 14:20:07 +0000417 "WARNING", "ERROR", "CRITICAL")
Guido van Rossum57102f82002-11-13 16:15:58 +0000418 %(pathname)s Full pathname of the source file where the logging
419 call was issued (if available)
420 %(filename)s Filename portion of pathname
421 %(module)s Module (name portion of filename)
422 %(lineno)d Source line number where the logging call was issued
423 (if available)
Vinay Sajiped1992f2006-02-09 08:48:36 +0000424 %(funcName)s Function name
Guido van Rossum57102f82002-11-13 16:15:58 +0000425 %(created)f Time when the LogRecord was created (time.time()
426 return value)
427 %(asctime)s Textual time when the LogRecord was created
428 %(msecs)d Millisecond portion of the creation time
429 %(relativeCreated)d Time in milliseconds when the LogRecord was created,
430 relative to the time the logging module was loaded
431 (typically at application startup time)
432 %(thread)d Thread ID (if available)
Vinay Sajip4a704862005-03-31 20:16:55 +0000433 %(threadName)s Thread name (if available)
Neal Norwitz6fa635d2003-02-18 14:20:07 +0000434 %(process)d Process ID (if available)
Guido van Rossum57102f82002-11-13 16:15:58 +0000435 %(message)s The result of record.getMessage(), computed just as
436 the record is emitted
437 """
438
439 converter = time.localtime
440
Vinay Sajipa39c5712010-10-25 13:57:39 +0000441 def __init__(self, fmt=None, datefmt=None, style='%'):
Guido van Rossum57102f82002-11-13 16:15:58 +0000442 """
443 Initialize the formatter with specified format strings.
444
445 Initialize the formatter either with the specified format string, or a
446 default as described above. Allow for specialized date formatting with
447 the optional datefmt argument (if omitted, you get the ISO8601 format).
Vinay Sajipa39c5712010-10-25 13:57:39 +0000448
449 Use a style parameter of '%', '{' or '$' to specify that you want to
450 use one of %-formatting, :meth:`str.format` (``{}``) formatting or
451 :class:`string.Template` formatting in your format string.
452
453 .. versionchanged: 3.2
454 Added the ``style`` parameter.
Guido van Rossum57102f82002-11-13 16:15:58 +0000455 """
Vinay Sajip6a65c5d2010-10-26 13:16:11 +0000456 if style not in _STYLES:
457 raise ValueError('Style must be one of: %s' % ','.join(
458 _STYLES.keys()))
459 self._style = _STYLES[style](fmt)
460 self._fmt = self._style._fmt
Guido van Rossum57102f82002-11-13 16:15:58 +0000461 self.datefmt = datefmt
462
Vinay Sajipae5740f2011-06-09 18:42:19 +0100463 default_time_format = '%Y-%m-%d %H:%M:%S'
464 default_msec_format = '%s,%03d'
465
Guido van Rossum57102f82002-11-13 16:15:58 +0000466 def formatTime(self, record, datefmt=None):
467 """
468 Return the creation time of the specified LogRecord as formatted text.
469
470 This method should be called from format() by a formatter which
471 wants to make use of a formatted time. This method can be overridden
472 in formatters to provide for any specific requirement, but the
473 basic behaviour is as follows: if datefmt (a string) is specified,
474 it is used with time.strftime() to format the creation time of the
475 record. Otherwise, the ISO8601 format is used. The resulting
476 string is returned. This function uses a user-configurable function
477 to convert the creation time to a tuple. By default, time.localtime()
478 is used; to change this for a particular formatter instance, set the
479 'converter' attribute to a function with the same signature as
480 time.localtime() or time.gmtime(). To change it for all formatters,
481 for example if you want all logging times to be shown in GMT,
482 set the 'converter' attribute in the Formatter class.
483 """
484 ct = self.converter(record.created)
485 if datefmt:
486 s = time.strftime(datefmt, ct)
487 else:
Vinay Sajipae5740f2011-06-09 18:42:19 +0100488 t = time.strftime(self.default_time_format, ct)
489 s = self.default_msec_format % (t, record.msecs)
Guido van Rossum57102f82002-11-13 16:15:58 +0000490 return s
491
492 def formatException(self, ei):
493 """
494 Format and return the specified exception information as a string.
495
496 This default implementation just uses
497 traceback.print_exception()
498 """
Guido van Rossum34d19282007-08-09 01:03:29 +0000499 sio = io.StringIO()
Vinay Sajip40d9a4e2010-08-30 18:10:03 +0000500 tb = ei[2]
501 # See issues #9427, #1553375. Commented out for now.
502 #if getattr(self, 'fullstack', False):
503 # traceback.print_stack(tb.tb_frame.f_back, file=sio)
504 traceback.print_exception(ei[0], ei[1], tb, None, sio)
Guido van Rossum57102f82002-11-13 16:15:58 +0000505 s = sio.getvalue()
506 sio.close()
Guido van Rossum486364b2007-06-30 05:01:58 +0000507 if s[-1:] == "\n":
Guido van Rossum57102f82002-11-13 16:15:58 +0000508 s = s[:-1]
509 return s
510
Benjamin Peterson9451a1c2010-03-13 22:30:34 +0000511 def usesTime(self):
512 """
513 Check if the format uses the creation time of the record.
514 """
Vinay Sajip6a65c5d2010-10-26 13:16:11 +0000515 return self._style.usesTime()
Benjamin Peterson9451a1c2010-03-13 22:30:34 +0000516
Vinay Sajipd0557bf2010-10-25 15:25:24 +0000517 def formatMessage(self, record):
Vinay Sajip6a65c5d2010-10-26 13:16:11 +0000518 return self._style.format(record)
Vinay Sajipd0557bf2010-10-25 15:25:24 +0000519
Vinay Sajip8593ae62010-11-14 21:33:04 +0000520 def formatStack(self, stack_info):
521 """
522 This method is provided as an extension point for specialized
523 formatting of stack information.
524
525 The input data is a string as returned from a call to
526 :func:`traceback.print_stack`, but with the last trailing newline
527 removed.
528
529 The base implementation just returns the value passed in.
530 """
531 return stack_info
532
Guido van Rossum57102f82002-11-13 16:15:58 +0000533 def format(self, record):
534 """
535 Format the specified record as text.
536
537 The record's attribute dictionary is used as the operand to a
538 string formatting operation which yields the returned string.
539 Before formatting the dictionary, a couple of preparatory steps
540 are carried out. The message attribute of the record is computed
Benjamin Peterson9451a1c2010-03-13 22:30:34 +0000541 using LogRecord.getMessage(). If the formatting string uses the
542 time (as determined by a call to usesTime(), formatTime() is
543 called to format the event time. If there is exception information,
544 it is formatted using formatException() and appended to the message.
Guido van Rossum57102f82002-11-13 16:15:58 +0000545 """
546 record.message = record.getMessage()
Benjamin Peterson9451a1c2010-03-13 22:30:34 +0000547 if self.usesTime():
Guido van Rossum57102f82002-11-13 16:15:58 +0000548 record.asctime = self.formatTime(record, self.datefmt)
Vinay Sajipd0557bf2010-10-25 15:25:24 +0000549 s = self.formatMessage(record)
Guido van Rossum57102f82002-11-13 16:15:58 +0000550 if record.exc_info:
Vinay Sajiped6bb142004-02-20 13:18:36 +0000551 # Cache the traceback text to avoid converting it multiple times
552 # (it's constant anyway)
553 if not record.exc_text:
554 record.exc_text = self.formatException(record.exc_info)
555 if record.exc_text:
Guido van Rossum486364b2007-06-30 05:01:58 +0000556 if s[-1:] != "\n":
Guido van Rossum57102f82002-11-13 16:15:58 +0000557 s = s + "\n"
Vinay Sajiped6bb142004-02-20 13:18:36 +0000558 s = s + record.exc_text
Vinay Sajip8593ae62010-11-14 21:33:04 +0000559 if record.stack_info:
560 if s[-1:] != "\n":
561 s = s + "\n"
562 s = s + self.formatStack(record.stack_info)
Guido van Rossum57102f82002-11-13 16:15:58 +0000563 return s
564
565#
566# The default formatter to use when no other is specified
567#
568_defaultFormatter = Formatter()
569
Benjamin Peterson55549932009-11-25 17:19:56 +0000570class BufferingFormatter(object):
Guido van Rossum57102f82002-11-13 16:15:58 +0000571 """
572 A formatter suitable for formatting a number of records.
573 """
574 def __init__(self, linefmt=None):
575 """
576 Optionally specify a formatter which will be used to format each
577 individual record.
578 """
579 if linefmt:
580 self.linefmt = linefmt
581 else:
582 self.linefmt = _defaultFormatter
583
584 def formatHeader(self, records):
585 """
586 Return the header string for the specified records.
587 """
588 return ""
589
590 def formatFooter(self, records):
591 """
592 Return the footer string for the specified records.
593 """
594 return ""
595
596 def format(self, records):
597 """
598 Format the specified records and return the result as a string.
599 """
600 rv = ""
601 if len(records) > 0:
602 rv = rv + self.formatHeader(records)
603 for record in records:
604 rv = rv + self.linefmt.format(record)
605 rv = rv + self.formatFooter(records)
606 return rv
607
608#---------------------------------------------------------------------------
609# Filter classes and functions
610#---------------------------------------------------------------------------
611
Benjamin Peterson55549932009-11-25 17:19:56 +0000612class Filter(object):
Guido van Rossum57102f82002-11-13 16:15:58 +0000613 """
614 Filter instances are used to perform arbitrary filtering of LogRecords.
615
616 Loggers and Handlers can optionally use Filter instances to filter
617 records as desired. The base filter class only allows events which are
618 below a certain point in the logger hierarchy. For example, a filter
619 initialized with "A.B" will allow events logged by loggers "A.B",
620 "A.B.C", "A.B.C.D", "A.B.D" etc. but not "A.BB", "B.A.B" etc. If
621 initialized with the empty string, all events are passed.
622 """
623 def __init__(self, name=''):
624 """
625 Initialize a filter.
626
627 Initialize with the name of the logger which, together with its
628 children, will have its events allowed through the filter. If no
629 name is specified, allow every event.
630 """
631 self.name = name
632 self.nlen = len(name)
633
634 def filter(self, record):
635 """
636 Determine if the specified record is to be logged.
637
638 Is the specified record to be logged? Returns 0 for no, nonzero for
639 yes. If deemed appropriate, the record may be modified in-place.
640 """
641 if self.nlen == 0:
Vinay Sajip26fe4b72011-04-26 18:43:05 +0100642 return True
Guido van Rossum57102f82002-11-13 16:15:58 +0000643 elif self.name == record.name:
Vinay Sajip26fe4b72011-04-26 18:43:05 +0100644 return True
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000645 elif record.name.find(self.name, 0, self.nlen) != 0:
Vinay Sajip26fe4b72011-04-26 18:43:05 +0100646 return False
Guido van Rossum57102f82002-11-13 16:15:58 +0000647 return (record.name[self.nlen] == ".")
648
Benjamin Peterson55549932009-11-25 17:19:56 +0000649class Filterer(object):
Guido van Rossum57102f82002-11-13 16:15:58 +0000650 """
651 A base class for loggers and handlers which allows them to share
652 common code.
653 """
654 def __init__(self):
655 """
656 Initialize the list of filters to be an empty list.
657 """
658 self.filters = []
659
660 def addFilter(self, filter):
661 """
662 Add the specified filter to this handler.
663 """
664 if not (filter in self.filters):
665 self.filters.append(filter)
666
667 def removeFilter(self, filter):
668 """
669 Remove the specified filter from this handler.
670 """
671 if filter in self.filters:
672 self.filters.remove(filter)
673
674 def filter(self, record):
675 """
676 Determine if a record is loggable by consulting all the filters.
677
678 The default is to allow the record to be logged; any filter can veto
679 this and the record is then dropped. Returns a zero value if a record
680 is to be dropped, else non-zero.
Vinay Sajip6dbed2e2010-10-19 20:53:01 +0000681
682 .. versionchanged: 3.2
683
684 Allow filters to be just callables.
Guido van Rossum57102f82002-11-13 16:15:58 +0000685 """
Vinay Sajip312cc0d2011-04-30 21:51:51 +0100686 rv = True
Guido van Rossum57102f82002-11-13 16:15:58 +0000687 for f in self.filters:
Vinay Sajip6dbed2e2010-10-19 20:53:01 +0000688 if hasattr(f, 'filter'):
689 result = f.filter(record)
Vinay Sajip6dbed2e2010-10-19 20:53:01 +0000690 else:
Vinay Sajipfc082ca2010-10-19 21:13:49 +0000691 result = f(record) # assume callable - will raise if not
Vinay Sajip6dbed2e2010-10-19 20:53:01 +0000692 if not result:
Vinay Sajip312cc0d2011-04-30 21:51:51 +0100693 rv = False
Guido van Rossum57102f82002-11-13 16:15:58 +0000694 break
695 return rv
696
697#---------------------------------------------------------------------------
698# Handler classes and functions
699#---------------------------------------------------------------------------
700
Benjamin Peterson55549932009-11-25 17:19:56 +0000701_handlers = weakref.WeakValueDictionary() #map of handler names to handlers
Vinay Sajip0ee9ba22005-09-08 18:14:16 +0000702_handlerList = [] # added to allow handlers to be removed in reverse of order initialized
Guido van Rossum57102f82002-11-13 16:15:58 +0000703
Benjamin Peterson55549932009-11-25 17:19:56 +0000704def _removeHandlerRef(wr):
705 """
706 Remove a handler reference from the internal cleanup list.
707 """
Vinay Sajipde6e9d62010-08-23 17:50:30 +0000708 # This function can be called during module teardown, when globals are
709 # set to None. If _acquireLock is None, assume this is the case and do
710 # nothing.
711 if _acquireLock is not None:
712 _acquireLock()
713 try:
714 if wr in _handlerList:
715 _handlerList.remove(wr)
716 finally:
717 _releaseLock()
Benjamin Peterson55549932009-11-25 17:19:56 +0000718
719def _addHandlerRef(handler):
720 """
721 Add a handler to the internal cleanup list using a weak reference.
722 """
723 _acquireLock()
724 try:
725 _handlerList.append(weakref.ref(handler, _removeHandlerRef))
726 finally:
727 _releaseLock()
728
Guido van Rossum57102f82002-11-13 16:15:58 +0000729class Handler(Filterer):
730 """
731 Handler instances dispatch logging events to specific destinations.
732
733 The base handler class. Acts as a placeholder which defines the Handler
734 interface. Handlers can optionally use Formatter instances to format
735 records as desired. By default, no formatter is specified; in this case,
736 the 'raw' message as determined by record.message is logged.
737 """
738 def __init__(self, level=NOTSET):
739 """
740 Initializes the instance - basically setting the formatter to None
741 and the filter list to empty.
742 """
743 Filterer.__init__(self)
Benjamin Peterson55549932009-11-25 17:19:56 +0000744 self._name = None
Vinay Sajipd4fabf42009-07-13 11:28:25 +0000745 self.level = _checkLevel(level)
Guido van Rossum57102f82002-11-13 16:15:58 +0000746 self.formatter = None
Benjamin Peterson55549932009-11-25 17:19:56 +0000747 # Add the handler to the global _handlerList (for cleanup on shutdown)
748 _addHandlerRef(self)
749 self.createLock()
750
751 def get_name(self):
752 return self._name
753
754 def set_name(self, name):
Guido van Rossum57102f82002-11-13 16:15:58 +0000755 _acquireLock()
Benjamin Peterson55549932009-11-25 17:19:56 +0000756 try:
757 if self._name in _handlers:
758 del _handlers[self._name]
759 self._name = name
760 if name:
761 _handlers[name] = self
Guido van Rossum57102f82002-11-13 16:15:58 +0000762 finally:
763 _releaseLock()
Benjamin Peterson55549932009-11-25 17:19:56 +0000764
765 name = property(get_name, set_name)
Guido van Rossum57102f82002-11-13 16:15:58 +0000766
767 def createLock(self):
768 """
769 Acquire a thread lock for serializing access to the underlying I/O.
770 """
Victor Stinner2a129742011-05-30 23:02:52 +0200771 if threading:
Vinay Sajip4a704862005-03-31 20:16:55 +0000772 self.lock = threading.RLock()
Vinay Sajip26fe4b72011-04-26 18:43:05 +0100773 else: #pragma: no cover
Guido van Rossum57102f82002-11-13 16:15:58 +0000774 self.lock = None
775
776 def acquire(self):
777 """
778 Acquire the I/O thread lock.
779 """
780 if self.lock:
781 self.lock.acquire()
782
783 def release(self):
784 """
785 Release the I/O thread lock.
786 """
787 if self.lock:
788 self.lock.release()
789
790 def setLevel(self, level):
791 """
Gregory P. Smithe85488c2011-12-17 12:36:34 -0800792 Set the logging level of this handler. level must be an int or a str.
Guido van Rossum57102f82002-11-13 16:15:58 +0000793 """
Vinay Sajipd4fabf42009-07-13 11:28:25 +0000794 self.level = _checkLevel(level)
Guido van Rossum57102f82002-11-13 16:15:58 +0000795
796 def format(self, record):
797 """
798 Format the specified record.
799
800 If a formatter is set, use it. Otherwise, use the default formatter
801 for the module.
802 """
803 if self.formatter:
804 fmt = self.formatter
805 else:
806 fmt = _defaultFormatter
807 return fmt.format(record)
808
809 def emit(self, record):
810 """
811 Do whatever it takes to actually log the specified logging record.
812
813 This version is intended to be implemented by subclasses and so
814 raises a NotImplementedError.
815 """
Collin Winterce36ad82007-08-30 01:19:48 +0000816 raise NotImplementedError('emit must be implemented '
817 'by Handler subclasses')
Guido van Rossum57102f82002-11-13 16:15:58 +0000818
819 def handle(self, record):
820 """
821 Conditionally emit the specified logging record.
822
823 Emission depends on filters which may have been added to the handler.
824 Wrap the actual emission of the record with acquisition/release of
Neal Norwitz6fa635d2003-02-18 14:20:07 +0000825 the I/O thread lock. Returns whether the filter passed the record for
826 emission.
Guido van Rossum57102f82002-11-13 16:15:58 +0000827 """
Neal Norwitz6fa635d2003-02-18 14:20:07 +0000828 rv = self.filter(record)
829 if rv:
Guido van Rossum57102f82002-11-13 16:15:58 +0000830 self.acquire()
831 try:
832 self.emit(record)
833 finally:
834 self.release()
Neal Norwitz6fa635d2003-02-18 14:20:07 +0000835 return rv
Guido van Rossum57102f82002-11-13 16:15:58 +0000836
837 def setFormatter(self, fmt):
838 """
839 Set the formatter for this handler.
840 """
841 self.formatter = fmt
842
843 def flush(self):
844 """
845 Ensure all logging output has been flushed.
846
847 This version does nothing and is intended to be implemented by
848 subclasses.
849 """
850 pass
851
852 def close(self):
853 """
854 Tidy up any resources used by the handler.
855
Benjamin Peterson55549932009-11-25 17:19:56 +0000856 This version removes the handler from an internal map of handlers,
857 _handlers, which is used for handler lookup by name. Subclasses
Vinay Sajiped6bb142004-02-20 13:18:36 +0000858 should ensure that this gets called from overridden close()
859 methods.
Guido van Rossum57102f82002-11-13 16:15:58 +0000860 """
Vinay Sajiped6bb142004-02-20 13:18:36 +0000861 #get the module data lock, as we're updating a shared structure.
862 _acquireLock()
863 try: #unlikely to raise an exception, but you never know...
Benjamin Peterson55549932009-11-25 17:19:56 +0000864 if self._name and self._name in _handlers:
865 del _handlers[self._name]
Vinay Sajiped6bb142004-02-20 13:18:36 +0000866 finally:
867 _releaseLock()
Guido van Rossum57102f82002-11-13 16:15:58 +0000868
Neal Norwitz6fa635d2003-02-18 14:20:07 +0000869 def handleError(self, record):
Guido van Rossum57102f82002-11-13 16:15:58 +0000870 """
871 Handle errors which occur during an emit() call.
872
873 This method should be called from handlers when an exception is
Neal Norwitz6fa635d2003-02-18 14:20:07 +0000874 encountered during an emit() call. If raiseExceptions is false,
Guido van Rossum57102f82002-11-13 16:15:58 +0000875 exceptions get silently ignored. This is what is mostly wanted
876 for a logging system - most users will not care about errors in
877 the logging system, they are more interested in application errors.
878 You could, however, replace this with a custom handler if you wish.
Neal Norwitz6fa635d2003-02-18 14:20:07 +0000879 The record which was being processed is passed in to this method.
Guido van Rossum57102f82002-11-13 16:15:58 +0000880 """
Vinay Sajip889bb292012-01-20 11:23:02 +0000881 if raiseExceptions and sys.stderr: # see issue 13807
Guido van Rossum57102f82002-11-13 16:15:58 +0000882 ei = sys.exc_info()
Benjamin Petersonfa0d7032009-06-01 22:42:33 +0000883 try:
Vinay Sajipdb81c4c2010-02-25 23:13:06 +0000884 traceback.print_exception(ei[0], ei[1], ei[2],
885 None, sys.stderr)
886 sys.stderr.write('Logged from file %s, line %s\n' % (
887 record.filename, record.lineno))
Vinay Sajip985ef872011-04-26 19:34:04 +0100888 except IOError: #pragma: no cover
Benjamin Petersonfa0d7032009-06-01 22:42:33 +0000889 pass # see issue 5971
890 finally:
891 del ei
Guido van Rossum57102f82002-11-13 16:15:58 +0000892
893class StreamHandler(Handler):
894 """
895 A handler class which writes logging records, appropriately formatted,
896 to a stream. Note that this class does not close the stream, as
897 sys.stdout or sys.stderr may be used.
898 """
Benjamin Peterson3e4f0552008-09-02 00:31:15 +0000899
Vinay Sajip2a20dfc2010-10-20 20:05:38 +0000900 terminator = '\n'
901
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000902 def __init__(self, stream=None):
Guido van Rossum57102f82002-11-13 16:15:58 +0000903 """
904 Initialize the handler.
905
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000906 If stream is not specified, sys.stderr is used.
Guido van Rossum57102f82002-11-13 16:15:58 +0000907 """
908 Handler.__init__(self)
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000909 if stream is None:
910 stream = sys.stderr
911 self.stream = stream
Guido van Rossum57102f82002-11-13 16:15:58 +0000912
913 def flush(self):
914 """
915 Flushes the stream.
916 """
Amaury Forgeot d'Arc35c86582008-06-17 21:11:29 +0000917 if self.stream and hasattr(self.stream, "flush"):
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000918 self.stream.flush()
Guido van Rossum57102f82002-11-13 16:15:58 +0000919
920 def emit(self, record):
921 """
922 Emit a record.
923
924 If a formatter is specified, it is used to format the record.
Benjamin Peterson3e4f0552008-09-02 00:31:15 +0000925 The record is then written to the stream with a trailing newline. If
926 exception information is present, it is formatted using
927 traceback.print_exception and appended to the stream. If the stream
Benjamin Peterson25c95f12009-05-08 20:42:26 +0000928 has an 'encoding' attribute, it is used to determine how to do the
Benjamin Peterson3e4f0552008-09-02 00:31:15 +0000929 output to the stream.
Guido van Rossum57102f82002-11-13 16:15:58 +0000930 """
931 try:
932 msg = self.format(record)
Benjamin Petersonf91df042009-02-13 02:50:59 +0000933 stream = self.stream
Vinay Sajip2a20dfc2010-10-20 20:05:38 +0000934 stream.write(msg)
935 stream.write(self.terminator)
Guido van Rossum57102f82002-11-13 16:15:58 +0000936 self.flush()
Vinay Sajip26fe4b72011-04-26 18:43:05 +0100937 except (KeyboardInterrupt, SystemExit): #pragma: no cover
Vinay Sajip85c19092005-10-31 13:14:19 +0000938 raise
Guido van Rossum57102f82002-11-13 16:15:58 +0000939 except:
Neal Norwitz6fa635d2003-02-18 14:20:07 +0000940 self.handleError(record)
Guido van Rossum57102f82002-11-13 16:15:58 +0000941
942class FileHandler(StreamHandler):
943 """
944 A handler class which writes formatted logging records to disk files.
945 """
Vinay Sajip26fe4b72011-04-26 18:43:05 +0100946 def __init__(self, filename, mode='a', encoding=None, delay=False):
Guido van Rossum57102f82002-11-13 16:15:58 +0000947 """
948 Open the specified file and use it as the stream for logging.
949 """
Vinay Sajip4bbab2b2004-07-08 10:22:35 +0000950 #keep the absolute path, otherwise derived classes which use this
951 #may come a cropper when the current directory changes
952 self.baseFilename = os.path.abspath(filename)
Guido van Rossum57102f82002-11-13 16:15:58 +0000953 self.mode = mode
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000954 self.encoding = encoding
Christian Heimese7a15bb2008-01-24 16:21:45 +0000955 if delay:
Vinay Sajip6268cbc2009-01-21 00:19:28 +0000956 #We don't open the stream, but we still need to call the
957 #Handler constructor to set level, formatter, lock etc.
958 Handler.__init__(self)
Christian Heimese7a15bb2008-01-24 16:21:45 +0000959 self.stream = None
960 else:
Vinay Sajip6268cbc2009-01-21 00:19:28 +0000961 StreamHandler.__init__(self, self._open())
Guido van Rossum57102f82002-11-13 16:15:58 +0000962
963 def close(self):
964 """
965 Closes the stream.
966 """
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000967 if self.stream:
968 self.flush()
Amaury Forgeot d'Arc35c86582008-06-17 21:11:29 +0000969 if hasattr(self.stream, "close"):
970 self.stream.close()
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000971 StreamHandler.close(self)
972 self.stream = None
Guido van Rossum57102f82002-11-13 16:15:58 +0000973
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000974 def _open(self):
975 """
976 Open the current base file with the (original) mode and encoding.
977 Return the resulting stream.
978 """
Florent Xicluna5252f9f2011-11-07 19:43:05 +0100979 return open(self.baseFilename, self.mode, encoding=self.encoding)
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000980
Christian Heimese7a15bb2008-01-24 16:21:45 +0000981 def emit(self, record):
982 """
983 Emit a record.
984
985 If the stream was not opened because 'delay' was specified in the
986 constructor, open it before calling the superclass's emit.
987 """
988 if self.stream is None:
Vinay Sajip6268cbc2009-01-21 00:19:28 +0000989 self.stream = self._open()
Christian Heimese7a15bb2008-01-24 16:21:45 +0000990 StreamHandler.emit(self, record)
991
Vinay Sajip5a27d402010-12-10 11:42:57 +0000992class _StderrHandler(StreamHandler):
993 """
994 This class is like a StreamHandler using sys.stderr, but always uses
995 whatever sys.stderr is currently set to rather than the value of
996 sys.stderr at handler construction time.
997 """
998 def __init__(self, level=NOTSET):
999 """
1000 Initialize the handler.
1001 """
1002 Handler.__init__(self, level)
1003
1004 @property
1005 def stream(self):
1006 return sys.stderr
1007
1008
1009_defaultLastResort = _StderrHandler(WARNING)
1010lastResort = _defaultLastResort
1011
Guido van Rossum57102f82002-11-13 16:15:58 +00001012#---------------------------------------------------------------------------
1013# Manager classes and functions
1014#---------------------------------------------------------------------------
1015
Benjamin Peterson55549932009-11-25 17:19:56 +00001016class PlaceHolder(object):
Guido van Rossum57102f82002-11-13 16:15:58 +00001017 """
1018 PlaceHolder instances are used in the Manager logger hierarchy to take
Vinay Sajip3f742842004-02-28 16:07:46 +00001019 the place of nodes for which no loggers have been defined. This class is
1020 intended for internal use only and not as part of the public API.
Guido van Rossum57102f82002-11-13 16:15:58 +00001021 """
1022 def __init__(self, alogger):
1023 """
1024 Initialize with the specified logger being a child of this placeholder.
1025 """
Vinay Sajip239322b2005-10-14 09:36:35 +00001026 self.loggerMap = { alogger : None }
Guido van Rossum57102f82002-11-13 16:15:58 +00001027
1028 def append(self, alogger):
1029 """
1030 Add the specified logger as a child of this placeholder.
1031 """
Guido van Rossum93662412006-08-19 16:09:41 +00001032 if alogger not in self.loggerMap:
Vinay Sajip239322b2005-10-14 09:36:35 +00001033 self.loggerMap[alogger] = None
Guido van Rossum57102f82002-11-13 16:15:58 +00001034
1035#
1036# Determine which class to use when instantiating loggers.
1037#
1038_loggerClass = None
1039
1040def setLoggerClass(klass):
1041 """
1042 Set the class to be used when instantiating a logger. The class should
1043 define __init__() such that only a name argument is required, and the
1044 __init__() should call Logger.__init__()
1045 """
1046 if klass != Logger:
Guido van Rossum57102f82002-11-13 16:15:58 +00001047 if not issubclass(klass, Logger):
Collin Winterce36ad82007-08-30 01:19:48 +00001048 raise TypeError("logger not derived from logging.Logger: "
1049 + klass.__name__)
Guido van Rossum57102f82002-11-13 16:15:58 +00001050 global _loggerClass
1051 _loggerClass = klass
1052
Vinay Sajipb9591172004-09-22 12:39:26 +00001053def getLoggerClass():
1054 """
1055 Return the class to be used when instantiating a logger.
1056 """
1057
1058 return _loggerClass
1059
Benjamin Peterson55549932009-11-25 17:19:56 +00001060class Manager(object):
Guido van Rossum57102f82002-11-13 16:15:58 +00001061 """
1062 There is [under normal circumstances] just one Manager instance, which
1063 holds the hierarchy of loggers.
1064 """
Neal Norwitzd1cade02002-11-15 23:31:28 +00001065 def __init__(self, rootnode):
Guido van Rossum57102f82002-11-13 16:15:58 +00001066 """
1067 Initialize the manager with the root node of the logger hierarchy.
1068 """
Neal Norwitzd1cade02002-11-15 23:31:28 +00001069 self.root = rootnode
Guido van Rossum57102f82002-11-13 16:15:58 +00001070 self.disable = 0
Vinay Sajip5a27d402010-12-10 11:42:57 +00001071 self.emittedNoHandlerWarning = False
Guido van Rossum57102f82002-11-13 16:15:58 +00001072 self.loggerDict = {}
Vinay Sajipdb81c4c2010-02-25 23:13:06 +00001073 self.loggerClass = None
Vinay Sajip61561522010-12-03 11:50:38 +00001074 self.logRecordFactory = None
Guido van Rossum57102f82002-11-13 16:15:58 +00001075
1076 def getLogger(self, name):
1077 """
1078 Get a logger with the specified name (channel name), creating it
Vinay Sajipb9591172004-09-22 12:39:26 +00001079 if it doesn't yet exist. This name is a dot-separated hierarchical
1080 name, such as "a", "a.b", "a.b.c" or similar.
Guido van Rossum57102f82002-11-13 16:15:58 +00001081
1082 If a PlaceHolder existed for the specified name [i.e. the logger
1083 didn't exist but a child of it did], replace it with the created
1084 logger and fix up the parent/child references which pointed to the
1085 placeholder to now point to the logger.
1086 """
1087 rv = None
Vinay Sajip61b787e2011-11-07 08:53:03 +00001088 if not isinstance(name, str):
Vinay Sajip3bd56382011-11-07 10:15:08 +00001089 raise TypeError('A logger name must be a string')
Guido van Rossum57102f82002-11-13 16:15:58 +00001090 _acquireLock()
1091 try:
Guido van Rossum93662412006-08-19 16:09:41 +00001092 if name in self.loggerDict:
Guido van Rossum57102f82002-11-13 16:15:58 +00001093 rv = self.loggerDict[name]
1094 if isinstance(rv, PlaceHolder):
1095 ph = rv
Vinay Sajipdb81c4c2010-02-25 23:13:06 +00001096 rv = (self.loggerClass or _loggerClass)(name)
Guido van Rossum57102f82002-11-13 16:15:58 +00001097 rv.manager = self
1098 self.loggerDict[name] = rv
1099 self._fixupChildren(ph, rv)
1100 self._fixupParents(rv)
1101 else:
Vinay Sajipdb81c4c2010-02-25 23:13:06 +00001102 rv = (self.loggerClass or _loggerClass)(name)
Guido van Rossum57102f82002-11-13 16:15:58 +00001103 rv.manager = self
1104 self.loggerDict[name] = rv
1105 self._fixupParents(rv)
1106 finally:
1107 _releaseLock()
1108 return rv
1109
Vinay Sajipdb81c4c2010-02-25 23:13:06 +00001110 def setLoggerClass(self, klass):
1111 """
1112 Set the class to be used when instantiating a logger with this Manager.
1113 """
1114 if klass != Logger:
1115 if not issubclass(klass, Logger):
1116 raise TypeError("logger not derived from logging.Logger: "
1117 + klass.__name__)
1118 self.loggerClass = klass
1119
Vinay Sajip61561522010-12-03 11:50:38 +00001120 def setLogRecordFactory(self, factory):
Vinay Sajip6fac8172010-10-19 20:44:14 +00001121 """
Vinay Sajipfad058f2010-12-03 13:01:11 +00001122 Set the factory to be used when instantiating a log record with this
Vinay Sajip6fac8172010-10-19 20:44:14 +00001123 Manager.
1124 """
Vinay Sajip61561522010-12-03 11:50:38 +00001125 self.logRecordFactory = factory
Vinay Sajip6fac8172010-10-19 20:44:14 +00001126
Guido van Rossum57102f82002-11-13 16:15:58 +00001127 def _fixupParents(self, alogger):
1128 """
1129 Ensure that there are either loggers or placeholders all the way
1130 from the specified logger to the root of the logger hierarchy.
1131 """
1132 name = alogger.name
Neal Norwitz9d72bb42007-04-17 08:48:32 +00001133 i = name.rfind(".")
Guido van Rossum57102f82002-11-13 16:15:58 +00001134 rv = None
1135 while (i > 0) and not rv:
1136 substr = name[:i]
Guido van Rossum93662412006-08-19 16:09:41 +00001137 if substr not in self.loggerDict:
Guido van Rossum57102f82002-11-13 16:15:58 +00001138 self.loggerDict[substr] = PlaceHolder(alogger)
1139 else:
1140 obj = self.loggerDict[substr]
1141 if isinstance(obj, Logger):
1142 rv = obj
1143 else:
1144 assert isinstance(obj, PlaceHolder)
1145 obj.append(alogger)
Neal Norwitz9d72bb42007-04-17 08:48:32 +00001146 i = name.rfind(".", 0, i - 1)
Guido van Rossum57102f82002-11-13 16:15:58 +00001147 if not rv:
1148 rv = self.root
1149 alogger.parent = rv
1150
1151 def _fixupChildren(self, ph, alogger):
1152 """
1153 Ensure that children of the placeholder ph are connected to the
1154 specified logger.
1155 """
Thomas Wouters89f507f2006-12-13 04:49:30 +00001156 name = alogger.name
1157 namelen = len(name)
Vinay Sajip239322b2005-10-14 09:36:35 +00001158 for c in ph.loggerMap.keys():
Thomas Wouters89f507f2006-12-13 04:49:30 +00001159 #The if means ... if not c.parent.name.startswith(nm)
1160 if c.parent.name[:namelen] != name:
Guido van Rossum57102f82002-11-13 16:15:58 +00001161 alogger.parent = c.parent
1162 c.parent = alogger
1163
1164#---------------------------------------------------------------------------
1165# Logger classes and functions
1166#---------------------------------------------------------------------------
1167
1168class Logger(Filterer):
1169 """
1170 Instances of the Logger class represent a single logging channel. A
1171 "logging channel" indicates an area of an application. Exactly how an
1172 "area" is defined is up to the application developer. Since an
1173 application can have any number of areas, logging channels are identified
1174 by a unique string. Application areas can be nested (e.g. an area
1175 of "input processing" might include sub-areas "read CSV files", "read
1176 XLS files" and "read Gnumeric files"). To cater for this natural nesting,
1177 channel names are organized into a namespace hierarchy where levels are
1178 separated by periods, much like the Java or Python package namespace. So
1179 in the instance given above, channel names might be "input" for the upper
1180 level, and "input.csv", "input.xls" and "input.gnu" for the sub-levels.
1181 There is no arbitrary limit to the depth of nesting.
1182 """
1183 def __init__(self, name, level=NOTSET):
1184 """
1185 Initialize the logger with a name and an optional level.
1186 """
1187 Filterer.__init__(self)
1188 self.name = name
Vinay Sajipd4fabf42009-07-13 11:28:25 +00001189 self.level = _checkLevel(level)
Guido van Rossum57102f82002-11-13 16:15:58 +00001190 self.parent = None
Vinay Sajip312cc0d2011-04-30 21:51:51 +01001191 self.propagate = True
Guido van Rossum57102f82002-11-13 16:15:58 +00001192 self.handlers = []
Vinay Sajip312cc0d2011-04-30 21:51:51 +01001193 self.disabled = False
Guido van Rossum57102f82002-11-13 16:15:58 +00001194
1195 def setLevel(self, level):
1196 """
Gregory P. Smithe85488c2011-12-17 12:36:34 -08001197 Set the logging level of this logger. level must be an int or a str.
Guido van Rossum57102f82002-11-13 16:15:58 +00001198 """
Vinay Sajipd4fabf42009-07-13 11:28:25 +00001199 self.level = _checkLevel(level)
Guido van Rossum57102f82002-11-13 16:15:58 +00001200
Guido van Rossum57102f82002-11-13 16:15:58 +00001201 def debug(self, msg, *args, **kwargs):
1202 """
1203 Log 'msg % args' with severity 'DEBUG'.
1204
1205 To pass exception information, use the keyword argument exc_info with
1206 a true value, e.g.
1207
1208 logger.debug("Houston, we have a %s", "thorny problem", exc_info=1)
1209 """
Guido van Rossum04110fb2007-08-24 16:32:05 +00001210 if self.isEnabledFor(DEBUG):
Neal Norwitzd9108552006-03-17 08:00:19 +00001211 self._log(DEBUG, msg, args, **kwargs)
Guido van Rossum57102f82002-11-13 16:15:58 +00001212
1213 def info(self, msg, *args, **kwargs):
1214 """
1215 Log 'msg % args' with severity 'INFO'.
1216
1217 To pass exception information, use the keyword argument exc_info with
1218 a true value, e.g.
1219
1220 logger.info("Houston, we have a %s", "interesting problem", exc_info=1)
1221 """
Guido van Rossum04110fb2007-08-24 16:32:05 +00001222 if self.isEnabledFor(INFO):
Neal Norwitzd9108552006-03-17 08:00:19 +00001223 self._log(INFO, msg, args, **kwargs)
Guido van Rossum57102f82002-11-13 16:15:58 +00001224
Neal Norwitz6fa635d2003-02-18 14:20:07 +00001225 def warning(self, msg, *args, **kwargs):
Guido van Rossum57102f82002-11-13 16:15:58 +00001226 """
Neal Norwitz6fa635d2003-02-18 14:20:07 +00001227 Log 'msg % args' with severity 'WARNING'.
Guido van Rossum57102f82002-11-13 16:15:58 +00001228
1229 To pass exception information, use the keyword argument exc_info with
1230 a true value, e.g.
1231
Neal Norwitz6fa635d2003-02-18 14:20:07 +00001232 logger.warning("Houston, we have a %s", "bit of a problem", exc_info=1)
Guido van Rossum57102f82002-11-13 16:15:58 +00001233 """
Neal Norwitz6fa635d2003-02-18 14:20:07 +00001234 if self.isEnabledFor(WARNING):
Neal Norwitzd9108552006-03-17 08:00:19 +00001235 self._log(WARNING, msg, args, **kwargs)
Neal Norwitz6fa635d2003-02-18 14:20:07 +00001236
Vinay Sajip04d5bc02011-10-21 07:33:42 +01001237 def warn(self, msg, *args, **kwargs):
1238 warnings.warn("The 'warn' method is deprecated, "
Vinay Sajip0a889532011-10-22 13:34:48 +01001239 "use 'warning' instead", DeprecationWarning, 2)
Vinay Sajip04d5bc02011-10-21 07:33:42 +01001240 self.warning(msg, *args, **kwargs)
Guido van Rossum57102f82002-11-13 16:15:58 +00001241
1242 def error(self, msg, *args, **kwargs):
1243 """
1244 Log 'msg % args' with severity 'ERROR'.
1245
1246 To pass exception information, use the keyword argument exc_info with
1247 a true value, e.g.
1248
1249 logger.error("Houston, we have a %s", "major problem", exc_info=1)
1250 """
Guido van Rossum57102f82002-11-13 16:15:58 +00001251 if self.isEnabledFor(ERROR):
Neal Norwitzd9108552006-03-17 08:00:19 +00001252 self._log(ERROR, msg, args, **kwargs)
Guido van Rossum57102f82002-11-13 16:15:58 +00001253
Vinay Sajip8593ae62010-11-14 21:33:04 +00001254 def exception(self, msg, *args, **kwargs):
Guido van Rossum57102f82002-11-13 16:15:58 +00001255 """
1256 Convenience method for logging an ERROR with exception information.
1257 """
Vinay Sajip8593ae62010-11-14 21:33:04 +00001258 kwargs['exc_info'] = True
1259 self.error(msg, *args, **kwargs)
Guido van Rossum57102f82002-11-13 16:15:58 +00001260
1261 def critical(self, msg, *args, **kwargs):
1262 """
1263 Log 'msg % args' with severity 'CRITICAL'.
1264
1265 To pass exception information, use the keyword argument exc_info with
1266 a true value, e.g.
1267
1268 logger.critical("Houston, we have a %s", "major disaster", exc_info=1)
1269 """
Guido van Rossum04110fb2007-08-24 16:32:05 +00001270 if self.isEnabledFor(CRITICAL):
Neal Norwitzd9108552006-03-17 08:00:19 +00001271 self._log(CRITICAL, msg, args, **kwargs)
Guido van Rossum57102f82002-11-13 16:15:58 +00001272
1273 fatal = critical
1274
1275 def log(self, level, msg, *args, **kwargs):
1276 """
Vinay Sajipeb477d02004-08-04 08:38:08 +00001277 Log 'msg % args' with the integer severity 'level'.
Guido van Rossum57102f82002-11-13 16:15:58 +00001278
1279 To pass exception information, use the keyword argument exc_info with
1280 a true value, e.g.
1281
1282 logger.log(level, "We have a %s", "mysterious problem", exc_info=1)
1283 """
Guido van Rossum13257902007-06-07 23:15:56 +00001284 if not isinstance(level, int):
Vinay Sajip779e0c92004-07-03 11:47:26 +00001285 if raiseExceptions:
Collin Winterce36ad82007-08-30 01:19:48 +00001286 raise TypeError("level must be an integer")
Vinay Sajip779e0c92004-07-03 11:47:26 +00001287 else:
1288 return
Guido van Rossum57102f82002-11-13 16:15:58 +00001289 if self.isEnabledFor(level):
Neal Norwitzd9108552006-03-17 08:00:19 +00001290 self._log(level, msg, args, **kwargs)
Guido van Rossum57102f82002-11-13 16:15:58 +00001291
Vinay Sajip8593ae62010-11-14 21:33:04 +00001292 def findCaller(self, stack_info=False):
Guido van Rossum57102f82002-11-13 16:15:58 +00001293 """
1294 Find the stack frame of the caller so that we can note the source
Vinay Sajip829dc512005-02-18 11:53:32 +00001295 file name, line number and function name.
Guido van Rossum57102f82002-11-13 16:15:58 +00001296 """
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +00001297 f = currentframe()
1298 #On some versions of IronPython, currentframe() returns None if
1299 #IronPython isn't run with -X:Frames.
1300 if f is not None:
1301 f = f.f_back
Vinay Sajip8593ae62010-11-14 21:33:04 +00001302 rv = "(unknown file)", 0, "(unknown function)", None
Thomas Woutersa9773292006-04-21 09:43:23 +00001303 while hasattr(f, "f_code"):
Jeremy Hylton250684d2003-01-23 18:29:29 +00001304 co = f.f_code
1305 filename = os.path.normcase(co.co_filename)
1306 if filename == _srcfile:
1307 f = f.f_back
1308 continue
Vinay Sajip8593ae62010-11-14 21:33:04 +00001309 sinfo = None
1310 if stack_info:
1311 sio = io.StringIO()
1312 sio.write('Stack (most recent call last):\n')
1313 traceback.print_stack(f, file=sio)
1314 sinfo = sio.getvalue()
1315 if sinfo[-1] == '\n':
1316 sinfo = sinfo[:-1]
1317 sio.close()
1318 rv = (co.co_filename, f.f_lineno, co.co_name, sinfo)
Thomas Woutersa9773292006-04-21 09:43:23 +00001319 break
1320 return rv
Guido van Rossum57102f82002-11-13 16:15:58 +00001321
Vinay Sajip8593ae62010-11-14 21:33:04 +00001322 def makeRecord(self, name, level, fn, lno, msg, args, exc_info,
1323 func=None, extra=None, sinfo=None):
Guido van Rossum57102f82002-11-13 16:15:58 +00001324 """
1325 A factory method which can be overridden in subclasses to create
1326 specialized LogRecords.
1327 """
Vinay Sajip61561522010-12-03 11:50:38 +00001328 rv = _logRecordFactory(name, level, fn, lno, msg, args, exc_info, func,
Vinay Sajip8593ae62010-11-14 21:33:04 +00001329 sinfo)
Christian Heimes04c420f2008-01-18 18:40:46 +00001330 if extra is not None:
Vinay Sajip260ce432006-02-09 08:34:14 +00001331 for key in extra:
1332 if (key in ["message", "asctime"]) or (key in rv.__dict__):
1333 raise KeyError("Attempt to overwrite %r in LogRecord" % key)
1334 rv.__dict__[key] = extra[key]
1335 return rv
Guido van Rossum57102f82002-11-13 16:15:58 +00001336
Vinay Sajip8593ae62010-11-14 21:33:04 +00001337 def _log(self, level, msg, args, exc_info=None, extra=None, stack_info=False):
Guido van Rossum57102f82002-11-13 16:15:58 +00001338 """
1339 Low-level logging routine which creates a LogRecord and then calls
1340 all the handlers of this logger to handle the record.
1341 """
Vinay Sajip8593ae62010-11-14 21:33:04 +00001342 sinfo = None
Jeremy Hylton250684d2003-01-23 18:29:29 +00001343 if _srcfile:
Vinay Sajipb672b6d2009-02-19 12:36:11 +00001344 #IronPython doesn't track Python frames, so findCaller throws an
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +00001345 #exception on some versions of IronPython. We trap it here so that
1346 #IronPython can use logging.
Vinay Sajipb672b6d2009-02-19 12:36:11 +00001347 try:
Vinay Sajip8593ae62010-11-14 21:33:04 +00001348 fn, lno, func, sinfo = self.findCaller(stack_info)
Vinay Sajip26fe4b72011-04-26 18:43:05 +01001349 except ValueError: # pragma: no cover
Vinay Sajipb672b6d2009-02-19 12:36:11 +00001350 fn, lno, func = "(unknown file)", 0, "(unknown function)"
Vinay Sajip26fe4b72011-04-26 18:43:05 +01001351 else: # pragma: no cover
Vinay Sajip829dc512005-02-18 11:53:32 +00001352 fn, lno, func = "(unknown file)", 0, "(unknown function)"
Guido van Rossum57102f82002-11-13 16:15:58 +00001353 if exc_info:
Guido van Rossum13257902007-06-07 23:15:56 +00001354 if not isinstance(exc_info, tuple):
Vinay Sajiped6bb142004-02-20 13:18:36 +00001355 exc_info = sys.exc_info()
Vinay Sajip8593ae62010-11-14 21:33:04 +00001356 record = self.makeRecord(self.name, level, fn, lno, msg, args,
1357 exc_info, func, extra, sinfo)
Guido van Rossum57102f82002-11-13 16:15:58 +00001358 self.handle(record)
1359
1360 def handle(self, record):
1361 """
1362 Call the handlers for the specified record.
1363
1364 This method is used for unpickled records received from a socket, as
1365 well as those created locally. Logger-level filtering is applied.
1366 """
1367 if (not self.disabled) and self.filter(record):
1368 self.callHandlers(record)
1369
1370 def addHandler(self, hdlr):
1371 """
1372 Add the specified handler to this logger.
1373 """
Vinay Sajip32fb6a82010-09-25 17:42:36 +00001374 _acquireLock()
1375 try:
1376 if not (hdlr in self.handlers):
1377 self.handlers.append(hdlr)
1378 finally:
1379 _releaseLock()
Guido van Rossum57102f82002-11-13 16:15:58 +00001380
1381 def removeHandler(self, hdlr):
1382 """
1383 Remove the specified handler from this logger.
1384 """
Vinay Sajip32fb6a82010-09-25 17:42:36 +00001385 _acquireLock()
1386 try:
1387 if hdlr in self.handlers:
Vinay Sajip116f16e2005-09-16 10:33:40 +00001388 self.handlers.remove(hdlr)
Vinay Sajip32fb6a82010-09-25 17:42:36 +00001389 finally:
1390 _releaseLock()
Guido van Rossum57102f82002-11-13 16:15:58 +00001391
Vinay Sajipb4a08092010-09-20 09:55:00 +00001392 def hasHandlers(self):
1393 """
1394 See if this logger has any handlers configured.
1395
1396 Loop through all handlers for this logger and its parents in the
1397 logger hierarchy. Return True if a handler was found, else False.
1398 Stop searching up the hierarchy whenever a logger with the "propagate"
1399 attribute set to zero is found - that will be the last logger which
1400 is checked for the existence of handlers.
1401 """
1402 c = self
1403 rv = False
1404 while c:
1405 if c.handlers:
1406 rv = True
1407 break
1408 if not c.propagate:
1409 break
1410 else:
1411 c = c.parent
1412 return rv
1413
Guido van Rossum57102f82002-11-13 16:15:58 +00001414 def callHandlers(self, record):
1415 """
1416 Pass a record to all relevant handlers.
1417
1418 Loop through all handlers for this logger and its parents in the
1419 logger hierarchy. If no handler was found, output a one-off error
1420 message to sys.stderr. Stop searching up the hierarchy whenever a
1421 logger with the "propagate" attribute set to zero is found - that
1422 will be the last logger whose handlers are called.
1423 """
1424 c = self
1425 found = 0
1426 while c:
1427 for hdlr in c.handlers:
1428 found = found + 1
1429 if record.levelno >= hdlr.level:
1430 hdlr.handle(record)
1431 if not c.propagate:
1432 c = None #break out
1433 else:
1434 c = c.parent
Vinay Sajip5a27d402010-12-10 11:42:57 +00001435 if (found == 0):
1436 if lastResort:
Vinay Sajip45dedaa2011-07-25 19:53:28 +01001437 if record.levelno >= lastResort.level:
1438 lastResort.handle(record)
Vinay Sajip5a27d402010-12-10 11:42:57 +00001439 elif raiseExceptions and not self.manager.emittedNoHandlerWarning:
1440 sys.stderr.write("No handlers could be found for logger"
1441 " \"%s\"\n" % self.name)
1442 self.manager.emittedNoHandlerWarning = True
Guido van Rossum57102f82002-11-13 16:15:58 +00001443
1444 def getEffectiveLevel(self):
1445 """
1446 Get the effective level for this logger.
1447
1448 Loop through this logger and its parents in the logger hierarchy,
1449 looking for a non-zero logging level. Return the first one found.
1450 """
1451 logger = self
1452 while logger:
1453 if logger.level:
1454 return logger.level
1455 logger = logger.parent
1456 return NOTSET
1457
1458 def isEnabledFor(self, level):
1459 """
1460 Is this logger enabled for level 'level'?
1461 """
1462 if self.manager.disable >= level:
Vinay Sajip26fe4b72011-04-26 18:43:05 +01001463 return False
Guido van Rossum57102f82002-11-13 16:15:58 +00001464 return level >= self.getEffectiveLevel()
1465
Benjamin Peterson22005fc2010-04-11 16:25:06 +00001466 def getChild(self, suffix):
1467 """
1468 Get a logger which is a descendant to this one.
1469
1470 This is a convenience method, such that
1471
1472 logging.getLogger('abc').getChild('def.ghi')
1473
1474 is the same as
1475
1476 logging.getLogger('abc.def.ghi')
1477
1478 It's useful, for example, when the parent logger is named using
1479 __name__ rather than a literal string.
1480 """
1481 if self.root is not self:
1482 suffix = '.'.join((self.name, suffix))
1483 return self.manager.getLogger(suffix)
1484
Guido van Rossum57102f82002-11-13 16:15:58 +00001485class RootLogger(Logger):
1486 """
1487 A root logger is not that different to any other logger, except that
1488 it must have a logging level and there is only one instance of it in
1489 the hierarchy.
1490 """
1491 def __init__(self, level):
1492 """
1493 Initialize the logger with the name "root".
1494 """
1495 Logger.__init__(self, "root", level)
1496
1497_loggerClass = Logger
1498
Benjamin Peterson55549932009-11-25 17:19:56 +00001499class LoggerAdapter(object):
Christian Heimes04c420f2008-01-18 18:40:46 +00001500 """
1501 An adapter for loggers which makes it easier to specify contextual
1502 information in logging output.
1503 """
1504
1505 def __init__(self, logger, extra):
1506 """
1507 Initialize the adapter with a logger and a dict-like object which
1508 provides contextual information. This constructor signature allows
1509 easy stacking of LoggerAdapters, if so desired.
1510
1511 You can effectively pass keyword arguments as shown in the
1512 following example:
1513
1514 adapter = LoggerAdapter(someLogger, dict(p1=v1, p2="v2"))
1515 """
1516 self.logger = logger
1517 self.extra = extra
1518
1519 def process(self, msg, kwargs):
1520 """
1521 Process the logging message and keyword arguments passed in to
1522 a logging call to insert contextual information. You can either
1523 manipulate the message itself, the keyword args or both. Return
1524 the message and kwargs modified (or not) to suit your needs.
1525
1526 Normally, you'll only need to override this one method in a
1527 LoggerAdapter subclass for your specific needs.
1528 """
1529 kwargs["extra"] = self.extra
1530 return msg, kwargs
1531
Vinay Sajip212b5902010-09-21 11:31:32 +00001532 #
1533 # Boilerplate convenience methods
1534 #
Christian Heimes04c420f2008-01-18 18:40:46 +00001535 def debug(self, msg, *args, **kwargs):
1536 """
Vinay Sajip212b5902010-09-21 11:31:32 +00001537 Delegate a debug call to the underlying logger.
Christian Heimes04c420f2008-01-18 18:40:46 +00001538 """
Vinay Sajip212b5902010-09-21 11:31:32 +00001539 self.log(DEBUG, msg, *args, **kwargs)
Christian Heimes04c420f2008-01-18 18:40:46 +00001540
1541 def info(self, msg, *args, **kwargs):
1542 """
Vinay Sajip212b5902010-09-21 11:31:32 +00001543 Delegate an info call to the underlying logger.
Christian Heimes04c420f2008-01-18 18:40:46 +00001544 """
Vinay Sajip212b5902010-09-21 11:31:32 +00001545 self.log(INFO, msg, *args, **kwargs)
Christian Heimes04c420f2008-01-18 18:40:46 +00001546
1547 def warning(self, msg, *args, **kwargs):
1548 """
Vinay Sajip212b5902010-09-21 11:31:32 +00001549 Delegate a warning call to the underlying logger.
Christian Heimes04c420f2008-01-18 18:40:46 +00001550 """
Vinay Sajip212b5902010-09-21 11:31:32 +00001551 self.log(WARNING, msg, *args, **kwargs)
Christian Heimes04c420f2008-01-18 18:40:46 +00001552
Vinay Sajip04d5bc02011-10-21 07:33:42 +01001553 def warn(self, msg, *args, **kwargs):
1554 warnings.warn("The 'warn' method is deprecated, "
Vinay Sajip0a889532011-10-22 13:34:48 +01001555 "use 'warning' instead", DeprecationWarning, 2)
Vinay Sajip04d5bc02011-10-21 07:33:42 +01001556 self.warning(msg, *args, **kwargs)
Vinay Sajipc84f0162010-09-21 11:25:39 +00001557
Christian Heimes04c420f2008-01-18 18:40:46 +00001558 def error(self, msg, *args, **kwargs):
1559 """
Vinay Sajip212b5902010-09-21 11:31:32 +00001560 Delegate an error call to the underlying logger.
Christian Heimes04c420f2008-01-18 18:40:46 +00001561 """
Vinay Sajip212b5902010-09-21 11:31:32 +00001562 self.log(ERROR, msg, *args, **kwargs)
Christian Heimes04c420f2008-01-18 18:40:46 +00001563
1564 def exception(self, msg, *args, **kwargs):
1565 """
Vinay Sajip212b5902010-09-21 11:31:32 +00001566 Delegate an exception call to the underlying logger.
Christian Heimes04c420f2008-01-18 18:40:46 +00001567 """
Vinay Sajip312cc0d2011-04-30 21:51:51 +01001568 kwargs["exc_info"] = True
Vinay Sajip212b5902010-09-21 11:31:32 +00001569 self.log(ERROR, msg, *args, **kwargs)
Christian Heimes04c420f2008-01-18 18:40:46 +00001570
1571 def critical(self, msg, *args, **kwargs):
1572 """
Vinay Sajip212b5902010-09-21 11:31:32 +00001573 Delegate a critical call to the underlying logger.
Christian Heimes04c420f2008-01-18 18:40:46 +00001574 """
Vinay Sajip212b5902010-09-21 11:31:32 +00001575 self.log(CRITICAL, msg, *args, **kwargs)
Christian Heimes04c420f2008-01-18 18:40:46 +00001576
1577 def log(self, level, msg, *args, **kwargs):
1578 """
1579 Delegate a log call to the underlying logger, after adding
1580 contextual information from this adapter instance.
1581 """
Vinay Sajip212b5902010-09-21 11:31:32 +00001582 if self.isEnabledFor(level):
1583 msg, kwargs = self.process(msg, kwargs)
1584 self.logger._log(level, msg, args, **kwargs)
1585
1586 def isEnabledFor(self, level):
1587 """
1588 Is this logger enabled for level 'level'?
1589 """
1590 if self.logger.manager.disable >= level:
1591 return False
1592 return level >= self.getEffectiveLevel()
Christian Heimes04c420f2008-01-18 18:40:46 +00001593
Vinay Sajipc84f0162010-09-21 11:25:39 +00001594 def setLevel(self, level):
1595 """
1596 Set the specified level on the underlying logger.
1597 """
1598 self.logger.setLevel(level)
1599
Vinay Sajipc84f0162010-09-21 11:25:39 +00001600 def getEffectiveLevel(self):
1601 """
1602 Get the effective level for the underlying logger.
1603 """
1604 return self.logger.getEffectiveLevel()
1605
Vinay Sajip61c3f0d2010-09-20 10:13:13 +00001606 def hasHandlers(self):
1607 """
1608 See if the underlying logger has any handlers.
1609 """
1610 return self.logger.hasHandlers()
1611
Neal Norwitz6fa635d2003-02-18 14:20:07 +00001612root = RootLogger(WARNING)
Guido van Rossum57102f82002-11-13 16:15:58 +00001613Logger.root = root
1614Logger.manager = Manager(Logger.root)
1615
1616#---------------------------------------------------------------------------
1617# Configuration classes and functions
1618#---------------------------------------------------------------------------
1619
1620BASIC_FORMAT = "%(levelname)s:%(name)s:%(message)s"
1621
Vinay Sajip779e0c92004-07-03 11:47:26 +00001622def basicConfig(**kwargs):
Guido van Rossum57102f82002-11-13 16:15:58 +00001623 """
Vinay Sajip779e0c92004-07-03 11:47:26 +00001624 Do basic configuration for the logging system.
1625
1626 This function does nothing if the root logger already has handlers
1627 configured. It is a convenience method intended for use by simple scripts
1628 to do one-shot configuration of the logging package.
1629
1630 The default behaviour is to create a StreamHandler which writes to
1631 sys.stderr, set a formatter using the BASIC_FORMAT format string, and
1632 add the handler to the root logger.
1633
1634 A number of optional keyword arguments may be specified, which can alter
1635 the default behaviour.
1636
1637 filename Specifies that a FileHandler be created, using the specified
1638 filename, rather than a StreamHandler.
1639 filemode Specifies the mode to open the file, if filename is specified
Vinay Sajipb89e7c92005-03-13 09:54:31 +00001640 (if filemode is unspecified, it defaults to 'a').
Vinay Sajip779e0c92004-07-03 11:47:26 +00001641 format Use the specified format string for the handler.
1642 datefmt Use the specified date/time format.
Vinay Sajipc5b27302010-10-31 14:59:16 +00001643 style If a format string is specified, use this to specify the
1644 type of format string (possible values '%', '{', '$', for
1645 %-formatting, :meth:`str.format` and :class:`string.Template`
1646 - defaults to '%').
Vinay Sajip779e0c92004-07-03 11:47:26 +00001647 level Set the root logger level to the specified level.
1648 stream Use the specified stream to initialize the StreamHandler. Note
1649 that this argument is incompatible with 'filename' - if both
1650 are present, 'stream' is ignored.
Vinay Sajip4a0a31d2011-04-11 08:42:07 +01001651 handlers If specified, this should be an iterable of already created
1652 handlers, which will be added to the root handler. Any handler
1653 in the list which does not have a formatter assigned will be
1654 assigned the formatter created in this function.
Vinay Sajip779e0c92004-07-03 11:47:26 +00001655
1656 Note that you could specify a stream created using open(filename, mode)
1657 rather than passing the filename and mode in. However, it should be
1658 remembered that StreamHandler does not close its stream (since it may be
1659 using sys.stdout or sys.stderr), whereas FileHandler closes its stream
1660 when the handler is closed.
Vinay Sajipc5b27302010-10-31 14:59:16 +00001661
Vinay Sajip4a0a31d2011-04-11 08:42:07 +01001662 .. versionchanged:: 3.2
Vinay Sajipc5b27302010-10-31 14:59:16 +00001663 Added the ``style`` parameter.
Vinay Sajipa3359ee2011-04-11 08:43:52 +01001664
Vinay Sajip4a0a31d2011-04-11 08:42:07 +01001665 .. versionchanged:: 3.3
1666 Added the ``handlers`` parameter. A ``ValueError`` is now thrown for
1667 incompatible arguments (e.g. ``handlers`` specified together with
1668 ``filename``/``filemode``, or ``filename``/``filemode`` specified
1669 together with ``stream``, or ``handlers`` specified together with
1670 ``stream``.
Guido van Rossum57102f82002-11-13 16:15:58 +00001671 """
Vinay Sajip2314fc72010-09-10 08:25:13 +00001672 # Add thread safety in case someone mistakenly calls
1673 # basicConfig() from multiple threads
1674 _acquireLock()
1675 try:
1676 if len(root.handlers) == 0:
Vinay Sajip4a0a31d2011-04-11 08:42:07 +01001677 handlers = kwargs.get("handlers")
1678 if handlers is None:
1679 if "stream" in kwargs and "filename" in kwargs:
1680 raise ValueError("'stream' and 'filename' should not be "
1681 "specified together")
Vinay Sajip2314fc72010-09-10 08:25:13 +00001682 else:
Vinay Sajip4a0a31d2011-04-11 08:42:07 +01001683 if "stream" in kwargs or "filename" in kwargs:
1684 raise ValueError("'stream' or 'filename' should not be "
1685 "specified together with 'handlers'")
1686 if handlers is None:
1687 filename = kwargs.get("filename")
1688 if filename:
1689 mode = kwargs.get("filemode", 'a')
1690 h = FileHandler(filename, mode)
1691 else:
1692 stream = kwargs.get("stream")
1693 h = StreamHandler(stream)
1694 handlers = [h]
Vinay Sajip2314fc72010-09-10 08:25:13 +00001695 fs = kwargs.get("format", BASIC_FORMAT)
1696 dfs = kwargs.get("datefmt", None)
Vinay Sajipc5b27302010-10-31 14:59:16 +00001697 style = kwargs.get("style", '%')
1698 fmt = Formatter(fs, dfs, style)
Vinay Sajip4a0a31d2011-04-11 08:42:07 +01001699 for h in handlers:
1700 if h.formatter is None:
1701 h.setFormatter(fmt)
1702 root.addHandler(h)
Vinay Sajip2314fc72010-09-10 08:25:13 +00001703 level = kwargs.get("level")
1704 if level is not None:
1705 root.setLevel(level)
1706 finally:
1707 _releaseLock()
Guido van Rossum57102f82002-11-13 16:15:58 +00001708
1709#---------------------------------------------------------------------------
1710# Utility functions at module level.
1711# Basically delegate everything to the root logger.
1712#---------------------------------------------------------------------------
1713
1714def getLogger(name=None):
1715 """
1716 Return a logger with the specified name, creating it if necessary.
1717
1718 If no name is specified, return the root logger.
1719 """
1720 if name:
1721 return Logger.manager.getLogger(name)
1722 else:
1723 return root
1724
Guido van Rossum57102f82002-11-13 16:15:58 +00001725def critical(msg, *args, **kwargs):
1726 """
Vinay Sajip5a27d402010-12-10 11:42:57 +00001727 Log a message with severity 'CRITICAL' on the root logger. If the logger
1728 has no handlers, call basicConfig() to add a console handler with a
1729 pre-defined format.
Guido van Rossum57102f82002-11-13 16:15:58 +00001730 """
1731 if len(root.handlers) == 0:
1732 basicConfig()
Neal Norwitzd9108552006-03-17 08:00:19 +00001733 root.critical(msg, *args, **kwargs)
Guido van Rossum57102f82002-11-13 16:15:58 +00001734
1735fatal = critical
1736
1737def error(msg, *args, **kwargs):
1738 """
Vinay Sajip5a27d402010-12-10 11:42:57 +00001739 Log a message with severity 'ERROR' on the root logger. If the logger has
1740 no handlers, call basicConfig() to add a console handler with a pre-defined
1741 format.
Guido van Rossum57102f82002-11-13 16:15:58 +00001742 """
1743 if len(root.handlers) == 0:
1744 basicConfig()
Neal Norwitzd9108552006-03-17 08:00:19 +00001745 root.error(msg, *args, **kwargs)
Guido van Rossum57102f82002-11-13 16:15:58 +00001746
Vinay Sajip8593ae62010-11-14 21:33:04 +00001747def exception(msg, *args, **kwargs):
Guido van Rossum57102f82002-11-13 16:15:58 +00001748 """
Vinay Sajip5a27d402010-12-10 11:42:57 +00001749 Log a message with severity 'ERROR' on the root logger, with exception
1750 information. If the logger has no handlers, basicConfig() is called to add
1751 a console handler with a pre-defined format.
Guido van Rossum57102f82002-11-13 16:15:58 +00001752 """
Vinay Sajip8593ae62010-11-14 21:33:04 +00001753 kwargs['exc_info'] = True
1754 error(msg, *args, **kwargs)
Guido van Rossum57102f82002-11-13 16:15:58 +00001755
Neal Norwitz6fa635d2003-02-18 14:20:07 +00001756def warning(msg, *args, **kwargs):
Guido van Rossum57102f82002-11-13 16:15:58 +00001757 """
Vinay Sajip5a27d402010-12-10 11:42:57 +00001758 Log a message with severity 'WARNING' on the root logger. If the logger has
1759 no handlers, call basicConfig() to add a console handler with a pre-defined
1760 format.
Guido van Rossum57102f82002-11-13 16:15:58 +00001761 """
1762 if len(root.handlers) == 0:
1763 basicConfig()
Neal Norwitzd9108552006-03-17 08:00:19 +00001764 root.warning(msg, *args, **kwargs)
Neal Norwitz6fa635d2003-02-18 14:20:07 +00001765
Vinay Sajip04d5bc02011-10-21 07:33:42 +01001766def warn(msg, *args, **kwargs):
1767 warnings.warn("The 'warn' function is deprecated, "
Vinay Sajip0a889532011-10-22 13:34:48 +01001768 "use 'warning' instead", DeprecationWarning, 2)
Vinay Sajip04d5bc02011-10-21 07:33:42 +01001769 warning(msg, *args, **kwargs)
Guido van Rossum57102f82002-11-13 16:15:58 +00001770
1771def info(msg, *args, **kwargs):
1772 """
Vinay Sajip5a27d402010-12-10 11:42:57 +00001773 Log a message with severity 'INFO' on the root logger. If the logger has
1774 no handlers, call basicConfig() to add a console handler with a pre-defined
1775 format.
Guido van Rossum57102f82002-11-13 16:15:58 +00001776 """
1777 if len(root.handlers) == 0:
1778 basicConfig()
Neal Norwitzd9108552006-03-17 08:00:19 +00001779 root.info(msg, *args, **kwargs)
Guido van Rossum57102f82002-11-13 16:15:58 +00001780
1781def debug(msg, *args, **kwargs):
1782 """
Vinay Sajip5a27d402010-12-10 11:42:57 +00001783 Log a message with severity 'DEBUG' on the root logger. If the logger has
1784 no handlers, call basicConfig() to add a console handler with a pre-defined
1785 format.
Guido van Rossum57102f82002-11-13 16:15:58 +00001786 """
1787 if len(root.handlers) == 0:
1788 basicConfig()
Neal Norwitzd9108552006-03-17 08:00:19 +00001789 root.debug(msg, *args, **kwargs)
Guido van Rossum57102f82002-11-13 16:15:58 +00001790
Vinay Sajipb2635b22004-09-24 11:45:52 +00001791def log(level, msg, *args, **kwargs):
1792 """
Vinay Sajip5a27d402010-12-10 11:42:57 +00001793 Log 'msg % args' with the integer severity 'level' on the root logger. If
1794 the logger has no handlers, call basicConfig() to add a console handler
1795 with a pre-defined format.
Vinay Sajipb2635b22004-09-24 11:45:52 +00001796 """
1797 if len(root.handlers) == 0:
1798 basicConfig()
Neal Norwitzd9108552006-03-17 08:00:19 +00001799 root.log(level, msg, *args, **kwargs)
Vinay Sajipb2635b22004-09-24 11:45:52 +00001800
Guido van Rossum57102f82002-11-13 16:15:58 +00001801def disable(level):
1802 """
Benjamin Peterson886af962010-03-21 23:13:07 +00001803 Disable all logging calls of severity 'level' and below.
Guido van Rossum57102f82002-11-13 16:15:58 +00001804 """
1805 root.manager.disable = level
1806
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001807def shutdown(handlerList=_handlerList):
Guido van Rossum57102f82002-11-13 16:15:58 +00001808 """
1809 Perform any cleanup actions in the logging system (e.g. flushing
1810 buffers).
1811
1812 Should be called at application exit.
1813 """
Benjamin Peterson55549932009-11-25 17:19:56 +00001814 for wr in reversed(handlerList[:]):
Vinay Sajipe12f7152004-07-29 09:19:30 +00001815 #errors might occur, for example, if files are locked
Vinay Sajip260ce432006-02-09 08:34:14 +00001816 #we just ignore them if raiseExceptions is not set
Vinay Sajipe12f7152004-07-29 09:19:30 +00001817 try:
Benjamin Peterson55549932009-11-25 17:19:56 +00001818 h = wr()
Vinay Sajipde6e9d62010-08-23 17:50:30 +00001819 if h:
1820 try:
Vinay Sajipd9512e92011-03-08 22:53:21 +00001821 h.acquire()
Vinay Sajipde6e9d62010-08-23 17:50:30 +00001822 h.flush()
1823 h.close()
1824 except (IOError, ValueError):
1825 # Ignore errors which might be caused
1826 # because handlers have been closed but
1827 # references to them are still around at
1828 # application exit.
1829 pass
Vinay Sajipd9512e92011-03-08 22:53:21 +00001830 finally:
1831 h.release()
Vinay Sajipe12f7152004-07-29 09:19:30 +00001832 except:
Vinay Sajip260ce432006-02-09 08:34:14 +00001833 if raiseExceptions:
1834 raise
1835 #else, swallow
Vinay Sajiped6bb142004-02-20 13:18:36 +00001836
1837#Let's try and shutdown automatically on application exit...
Georg Brandl01e4d572010-02-06 22:27:51 +00001838import atexit
1839atexit.register(shutdown)
Georg Brandlf9734072008-12-07 15:30:06 +00001840
1841# Null handler
1842
1843class NullHandler(Handler):
1844 """
1845 This handler does nothing. It's intended to be used to avoid the
1846 "No handlers could be found for logger XXX" one-off warning. This is
1847 important for library code, which may contain code to log events. If a user
1848 of the library does not configure logging, the one-off warning might be
1849 produced; to avoid this, the library developer simply needs to instantiate
1850 a NullHandler and add it to the top-level logger of the library module or
1851 package.
1852 """
Vinay Sajip4fbe4b32010-09-26 11:04:10 +00001853 def handle(self, record):
Vinay Sajipe6c1eb92011-03-29 17:20:34 +01001854 """Stub."""
Vinay Sajip4fbe4b32010-09-26 11:04:10 +00001855
Georg Brandlf9734072008-12-07 15:30:06 +00001856 def emit(self, record):
Vinay Sajipe6c1eb92011-03-29 17:20:34 +01001857 """Stub."""
Georg Brandlf9734072008-12-07 15:30:06 +00001858
Vinay Sajip4fbe4b32010-09-26 11:04:10 +00001859 def createLock(self):
1860 self.lock = None
1861
Georg Brandlf9734072008-12-07 15:30:06 +00001862# Warnings integration
1863
1864_warnings_showwarning = None
1865
1866def _showwarning(message, category, filename, lineno, file=None, line=None):
1867 """
1868 Implementation of showwarnings which redirects to logging, which will first
1869 check to see if the file parameter is None. If a file is specified, it will
1870 delegate to the original warnings implementation of showwarning. Otherwise,
1871 it will call warnings.formatwarning and will log the resulting string to a
1872 warnings logger named "py.warnings" with level logging.WARNING.
1873 """
1874 if file is not None:
1875 if _warnings_showwarning is not None:
1876 _warnings_showwarning(message, category, filename, lineno, file, line)
1877 else:
1878 s = warnings.formatwarning(message, category, filename, lineno, line)
1879 logger = getLogger("py.warnings")
1880 if not logger.handlers:
1881 logger.addHandler(NullHandler())
1882 logger.warning("%s", s)
1883
1884def captureWarnings(capture):
1885 """
1886 If capture is true, redirect all warnings to the logging package.
1887 If capture is False, ensure that warnings are not redirected to logging
1888 but to their original destinations.
1889 """
1890 global _warnings_showwarning
1891 if capture:
1892 if _warnings_showwarning is None:
1893 _warnings_showwarning = warnings.showwarning
1894 warnings.showwarning = _showwarning
1895 else:
1896 if _warnings_showwarning is not None:
1897 warnings.showwarning = _warnings_showwarning
1898 _warnings_showwarning = None