mirror of
https://github.com/python/cpython.git
synced 2025-08-04 00:48:58 +00:00
logging: Added QueueHandler.
This commit is contained in:
parent
febeb00e41
commit
121a1c4e11
3 changed files with 238 additions and 19 deletions
|
@ -1134,3 +1134,55 @@ class MemoryHandler(BufferingHandler):
|
|||
self.flush()
|
||||
self.target = None
|
||||
BufferingHandler.close(self)
|
||||
|
||||
|
||||
class QueueHandler(logging.Handler):
|
||||
"""
|
||||
This handler sends events to a queue. Typically, it would be used together
|
||||
with a multiprocessing Queue to centralise logging to file in one process
|
||||
(in a multi-process application), so as to avoid file write contention
|
||||
between processes.
|
||||
|
||||
This code is new in Python 3.2, but this class can be copy pasted into
|
||||
user code for use with earlier Python versions.
|
||||
"""
|
||||
|
||||
def __init__(self, queue):
|
||||
"""
|
||||
Initialise an instance, using the passed queue.
|
||||
"""
|
||||
logging.Handler.__init__(self)
|
||||
self.queue = queue
|
||||
|
||||
def enqueue(self, record):
|
||||
"""
|
||||
Enqueue a record.
|
||||
|
||||
The base implementation uses put_nowait. You may want to override
|
||||
this method if you want to use blocking, timeouts or custom queue
|
||||
implementations.
|
||||
"""
|
||||
self.queue.put_nowait(record)
|
||||
|
||||
def emit(self, record):
|
||||
"""
|
||||
Emit a record.
|
||||
|
||||
Writes the LogRecord to the queue, preparing it for pickling first.
|
||||
"""
|
||||
try:
|
||||
# The format operation gets traceback text into record.exc_text
|
||||
# (if there's exception data), and also puts the message into
|
||||
# record.message. We can then use this to replace the original
|
||||
# msg + args, as these might be unpickleable. We also zap the
|
||||
# exc_info attribute, as it's no longer needed and, if not None,
|
||||
# will typically not be pickleable.
|
||||
self.format(record)
|
||||
record.msg = record.message
|
||||
record.args = None
|
||||
record.exc_info = None
|
||||
self.enqueue(record)
|
||||
except (KeyboardInterrupt, SystemExit):
|
||||
raise
|
||||
except:
|
||||
self.handleError(record)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue