From e7a15bb808f2118920fed0b5949f821940cf7416 Mon Sep 17 00:00:00 2001 From: Christian Heimes Date: Thu, 24 Jan 2008 16:21:45 +0000 Subject: Merged revisions 60234-60244 via svnmerge from svn+ssh://pythondev@svn.python.org/python/trunk ........ r60234 | gregory.p.smith | 2008-01-24 10:38:26 +0100 (Thu, 24 Jan 2008) | 4 lines Fix issue1789: The tutorial contained a misuse of the struct module. (also remove an unneeded import struct from test_largefile) ........ r60237 | vinay.sajip | 2008-01-24 13:37:08 +0100 (Thu, 24 Jan 2008) | 1 line Added optional delay argument to FileHandler and subclasses. ........ r60238 | vinay.sajip | 2008-01-24 13:37:33 +0100 (Thu, 24 Jan 2008) | 1 line Added optional delay argument to FileHandler and subclasses. ........ r60239 | vinay.sajip | 2008-01-24 13:38:30 +0100 (Thu, 24 Jan 2008) | 1 line Added documentation for optional delay argument to FileHandler and subclasses. ........ r60240 | vinay.sajip | 2008-01-24 13:43:33 +0100 (Thu, 24 Jan 2008) | 1 line Updated for optional delay argument to FileHandler and subclasses. ........ r60243 | guido.van.rossum | 2008-01-24 16:53:22 +0100 (Thu, 24 Jan 2008) | 2 lines Fi debug turd -- a call accidentally left out. ........ --- Doc/library/logging.rst | 26 ++++++++++++++++++-------- Doc/tutorial/stdlib2.rst | 8 +++++--- Lib/logging/__init__.py | 25 ++++++++++++++++++++----- Lib/logging/handlers.py | 25 ++++++++++++++----------- Lib/test/test_descr.py | 2 +- Lib/test/test_largefile.py | 2 +- 6 files changed, 59 insertions(+), 29 deletions(-) diff --git a/Doc/library/logging.rst b/Doc/library/logging.rst index ce574d0..98e2862 100644 --- a/Doc/library/logging.rst +++ b/Doc/library/logging.rst @@ -1517,12 +1517,13 @@ sends logging output to a disk file. It inherits the output functionality from :class:`StreamHandler`. -.. class:: FileHandler(filename[, mode[, encoding]]) +.. class:: FileHandler(filename[, mode[, encoding[, delay]]]) Returns a new instance of the :class:`FileHandler` class. The specified file is opened and used as the stream for logging. If *mode* is not specified, :const:`'a'` is used. If *encoding* is not *None*, it is used to open the file - with that encoding. By default, the file grows indefinitely. + with that encoding. If *delay* is true, then file opening is deferred until the + first call to :meth:`emit`. By default, the file grows indefinitely. .. method:: FileHandler.close() @@ -1556,12 +1557,13 @@ exclusive locks - and so there is no need for such a handler. Furthermore, this value. -.. class:: WatchedFileHandler(filename[,mode[, encoding]]) +.. class:: WatchedFileHandler(filename[,mode[, encoding[, delay]]]) Returns a new instance of the :class:`WatchedFileHandler` class. The specified file is opened and used as the stream for logging. If *mode* is not specified, :const:`'a'` is used. If *encoding* is not *None*, it is used to open the file - with that encoding. By default, the file grows indefinitely. + with that encoding. If *delay* is true, then file opening is deferred until the + first call to :meth:`emit`. By default, the file grows indefinitely. .. method:: WatchedFileHandler.emit(record) @@ -1578,11 +1580,13 @@ The :class:`RotatingFileHandler` class, located in the :mod:`logging.handlers` module, supports rotation of disk log files. -.. class:: RotatingFileHandler(filename[, mode[, maxBytes[, backupCount]]]) +.. class:: RotatingFileHandler(filename[, mode[, maxBytes[, backupCount[, encoding[, delay]]]]]) Returns a new instance of the :class:`RotatingFileHandler` class. The specified file is opened and used as the stream for logging. If *mode* is not specified, - ``'a'`` is used. By default, the file grows indefinitely. + ``'a'`` is used. If *encoding* is not *None*, it is used to open the file + with that encoding. If *delay* is true, then file opening is deferred until the + first call to :meth:`emit`. By default, the file grows indefinitely. You can use the *maxBytes* and *backupCount* values to allow the file to :dfn:`rollover` at a predetermined size. When the size is about to be exceeded, @@ -1616,7 +1620,7 @@ The :class:`TimedRotatingFileHandler` class, located in the timed intervals. -.. class:: TimedRotatingFileHandler(filename [,when [,interval [,backupCount]]]) +.. class:: TimedRotatingFileHandler(filename [,when [,interval [,backupCount[, encoding[, delay]]]]]) Returns a new instance of the :class:`TimedRotatingFileHandler` class. The specified file is opened and used as the stream for logging. On rotating it also @@ -2053,7 +2057,13 @@ Currently, the useful mapping keys in a :class:`LogRecord` are: record is computed using *msg* % *args*. If the formatting string contains ``'(asctime)'``, :meth:`formatTime` is called to format the event time. If there is exception information, it is formatted using :meth:`formatException` and - appended to the message. + appended to the message. Note that the formatted exception information is cached + in attribute *exc_text*. This is useful because the exception information can + be pickled and sent across the wire, but you should be careful if you have more + than one :class:`Formatter` subclass which customizes the formatting of exception + information. In this case, you will have to clear the cached value after a + formatter has done its formatting, so that the next formatter to handle the event + doesn't use the cached value but recalculates it afresh. .. method:: Formatter.formatTime(record[, datefmt]) diff --git a/Doc/tutorial/stdlib2.rst b/Doc/tutorial/stdlib2.rst index 4e8d37e..bab0114 100644 --- a/Doc/tutorial/stdlib2.rst +++ b/Doc/tutorial/stdlib2.rst @@ -134,8 +134,10 @@ Working with Binary Data Record Layouts The :mod:`struct` module provides :func:`pack` and :func:`unpack` functions for working with variable length binary record formats. The following example shows -how to loop through header information in a ZIP file (with pack codes ``"H"`` -and ``"L"`` representing two and four byte unsigned numbers respectively):: +how to loop through header information in a ZIP file without using the +:mod:`zipfile` module. Pack codes ``"H"`` and ``"I"`` represent two and four +byte unsigned numbers respectively. The ``"<"`` indicates that they are +standard size and in little-endian byte order:: import struct @@ -143,7 +145,7 @@ and ``"L"`` representing two and four byte unsigned numbers respectively):: start = 0 for i in range(3): # show the first 3 file headers start += 14 - fields = struct.unpack('LLLHH', data[start:start+16]) + fields = struct.unpack(' 0: mode = 'a' # doesn't make sense otherwise! - BaseRotatingHandler.__init__(self, filename, mode, encoding) + BaseRotatingHandler.__init__(self, filename, mode, encoding, delay) self.maxBytes = maxBytes self.backupCount = backupCount @@ -154,8 +154,8 @@ class TimedRotatingFileHandler(BaseRotatingHandler): If backupCount is > 0, when rollover is done, no more than backupCount files are kept - the oldest ones are deleted. """ - def __init__(self, filename, when='h', interval=1, backupCount=0, encoding=None): - BaseRotatingHandler.__init__(self, filename, 'a', encoding) + def __init__(self, filename, when='h', interval=1, backupCount=0, encoding=None, delay=0): + BaseRotatingHandler.__init__(self, filename, 'a', encoding, delay) self.when = when.upper() self.backupCount = backupCount # Calculate the real rollover interval, which is just the number of @@ -300,10 +300,13 @@ class WatchedFileHandler(logging.FileHandler): This handler is based on a suggestion and patch by Chad J. Schroeder. """ - def __init__(self, filename, mode='a', encoding=None): - logging.FileHandler.__init__(self, filename, mode, encoding) - stat = os.stat(self.baseFilename) - self.dev, self.ino = stat[ST_DEV], stat[ST_INO] + def __init__(self, filename, mode='a', encoding=None, delay=0): + logging.FileHandler.__init__(self, filename, mode, encoding, delay) + if not os.path.exists(self.baseFilename): + self.dev, self.ino = -1, -1 + else: + stat = os.stat(self.baseFilename) + self.dev, self.ino = stat[ST_DEV], stat[ST_INO] def emit(self, record): """ @@ -319,7 +322,7 @@ class WatchedFileHandler(logging.FileHandler): else: stat = os.stat(self.baseFilename) changed = (stat[ST_DEV] != self.dev) or (stat[ST_INO] != self.ino) - if changed: + if changed and self.stream is not None: self.stream.flush() self.stream.close() self.stream = self._open() diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py index 7ef702b..028be3d 100644 --- a/Lib/test/test_descr.py +++ b/Lib/test/test_descr.py @@ -4249,7 +4249,7 @@ def test_borrowed_ref_4_segfault(): builtins.__import__ = orig_import def test_main(): - #XXXweakref_segfault() # Must be first, somehow + weakref_segfault() # Must be first, somehow wrapper_segfault() # NB This one is slow do_this_first() class_docstrings() diff --git a/Lib/test/test_largefile.py b/Lib/test/test_largefile.py index a54a833..6d2e27d 100644 --- a/Lib/test/test_largefile.py +++ b/Lib/test/test_largefile.py @@ -6,7 +6,7 @@ #---------------------------------------------------------------------- from test import test_support -import os, struct, stat, sys +import os, stat, sys try: import signal -- cgit v0.12