From 0c0f9602c14aee26a8b5d588bb19d107be7674a7 Mon Sep 17 00:00:00 2001 From: Vinay Sajip Date: Wed, 21 Jan 2009 00:26:02 +0000 Subject: [PATCH] Issue 5013: Fixed bug in FileHandler when delay was set - added fix for RotatingFileHandler and changed header comment slightly. --- Lib/logging/__init__.py | 16 ++++++++-------- Lib/logging/handlers.py | 15 +++++++++------ Misc/NEWS | 23 +++++++++++++---------- 3 files changed, 30 insertions(+), 24 deletions(-) diff --git a/Lib/logging/__init__.py b/Lib/logging/__init__.py index 499c9543f06a..423b1be7cb58 100644 --- a/Lib/logging/__init__.py +++ b/Lib/logging/__init__.py @@ -1,4 +1,4 @@ -# Copyright 2001-2008 by Vinay Sajip. All Rights Reserved. +# Copyright 2001-2009 by Vinay Sajip. All Rights Reserved. # # Permission to use, copy, modify, and distribute this software and its # documentation for any purpose and without fee is hereby granted, @@ -18,7 +18,7 @@ Logging package for Python. Based on PEP 282 and comments thereto in comp.lang.python, and influenced by Apache's log4j system. -Copyright (C) 2001-2008 Vinay Sajip. All Rights Reserved. +Copyright (C) 2001-2009 Vinay Sajip. All Rights Reserved. To use, simply 'import logging' and log away! """ @@ -43,7 +43,7 @@ except ImportError: __author__ = "Vinay Sajip " __status__ = "production" __version__ = "0.5.0.5" -__date__ = "24 January 2008" +__date__ = "20 January 2009" #--------------------------------------------------------------------------- # Miscellaneous module data @@ -726,7 +726,6 @@ class StreamHandler(Handler): if strm is None: strm = sys.stderr self.stream = strm - self.formatter = None def flush(self): """ @@ -781,10 +780,12 @@ class FileHandler(StreamHandler): self.mode = mode self.encoding = encoding if delay: + #We don't open the stream, but we still need to call the + #Handler constructor to set level, formatter, lock etc. + Handler.__init__(self) self.stream = None else: - stream = self._open() - StreamHandler.__init__(self, stream) + StreamHandler.__init__(self, self._open()) def close(self): """ @@ -816,8 +817,7 @@ class FileHandler(StreamHandler): constructor, open it before calling the superclass's emit. """ if self.stream is None: - stream = self._open() - StreamHandler.__init__(self, stream) + self.stream = self._open() StreamHandler.emit(self, record) #--------------------------------------------------------------------------- diff --git a/Lib/logging/handlers.py b/Lib/logging/handlers.py index 19fb959fb26a..f060311b74d2 100644 --- a/Lib/logging/handlers.py +++ b/Lib/logging/handlers.py @@ -1,4 +1,4 @@ -# Copyright 2001-2007 by Vinay Sajip. All Rights Reserved. +# Copyright 2001-2009 by Vinay Sajip. All Rights Reserved. # # Permission to use, copy, modify, and distribute this software and its # documentation for any purpose and without fee is hereby granted, @@ -19,9 +19,9 @@ Additional handlers for the logging package for Python. The core package is based on PEP 282 and comments thereto in comp.lang.python, and influenced by Apache's log4j system. -Copyright (C) 2001-2008 Vinay Sajip. All Rights Reserved. +Copyright (C) 2001-2009 Vinay Sajip. All Rights Reserved. -To use, simply 'import logging' and log away! +To use, simply 'import logging.handlers' and log away! """ import logging, socket, os, pickle, struct, time, re @@ -112,8 +112,8 @@ class RotatingFileHandler(BaseRotatingHandler): """ Do a rollover, as described in __init__(). """ - - self.stream.close() + if self.stream: + self.stream.close() if self.backupCount > 0: for i in range(self.backupCount - 1, 0, -1): sfn = "%s.%d" % (self.baseFilename, i) @@ -138,6 +138,8 @@ class RotatingFileHandler(BaseRotatingHandler): Basically, see if the supplied record would cause the file to exceed the size limit we have. """ + if self.stream is None: # delay was set... + self.stream = self._open() if self.maxBytes > 0: # are we rolling over? msg = "%s\n" % self.format(record) self.stream.seek(0, 2) #due to non-posix-compliant Windows feature @@ -302,7 +304,8 @@ class TimedRotatingFileHandler(BaseRotatingHandler): then we have to get a list of matching filenames, sort them and remove the one with the oldest suffix. """ - self.stream.close() + if self.stream: + self.stream.close() # get the time that this sequence started at and make it a TimeTuple t = self.rolloverAt - self.interval if self.utc: diff --git a/Misc/NEWS b/Misc/NEWS index 8b2194eb495e..443cffb16dff 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -31,7 +31,7 @@ Core and Builtins function no longer attempt to call the __long__ slot to convert an object to an integer. Only the __int__ and __trunc__ slots are examined. -- Issue #4604: Some objects of the I/O library could still be used after +- Issue #4604: Some objects of the I/O library could still be used after having been closed (for instance, a read() call could return some previously buffered data). Patch by Dmitry Vasiliev. @@ -98,6 +98,9 @@ Core and Builtins Library ------- +- Issue #5013: Fixed a bug in FileHandler which occurred when the delay + parameter was set. + - Issue #4842: Always append a trailing 'L' when pickling longs using pickle protocol 0. When reading, the 'L' is optional. @@ -116,8 +119,8 @@ Library - Issue #3638: Remove functions from _tkinter module level that depend on TkappObject to work with multiple threads. -- Issue #4718: Adapt the wsgiref package so that it actually works with - Python 3.x, in accordance with the `official amendments of the spec +- Issue #4718: Adapt the wsgiref package so that it actually works with + Python 3.x, in accordance with the `official amendments of the spec `_. - Fractions.from_float() no longer loses precision for integers too big to @@ -132,10 +135,10 @@ Library - Issue #4795: inspect.isgeneratorfunction() returns False instead of None when the function is not a generator. -- Issue #4702: Throwing a DistutilsPlatformError instead of IOError in case - no MSVC compiler is found under Windows. Original patch by Philip Jenvey. +- Issue #4702: Throwing a DistutilsPlatformError instead of IOError in case + no MSVC compiler is found under Windows. Original patch by Philip Jenvey. -- Issue #4646: distutils was choking on empty options arg in the setup +- Issue #4646: distutils was choking on empty options arg in the setup function. Original patch by Thomas Heller. - Issue #3767: Convert Tk object to string in tkColorChooser. @@ -410,7 +413,7 @@ Core and Builtins - Issue #1210: Fixed imaplib and its documentation. -- Issue #4233: Changed semantic of ``_fileio.FileIO``'s ``close()`` +- Issue #4233: Changed semantic of ``_fileio.FileIO``'s ``close()`` method on file objects with closefd=False. The file descriptor is still kept open but the file object behaves like a closed file. The ``FileIO`` object also got a new readonly attribute ``closefd``. @@ -554,13 +557,13 @@ Core and Builtins cyclic garbage collection. - Issue #3668: Fix a memory leak with the "s*" argument parser in - PyArg_ParseTuple and friends, which occurred when the argument for "s*" + PyArg_ParseTuple and friends, which occurred when the argument for "s*" was correctly parsed but parsing of subsequent arguments failed. - Issue #3611: An exception __context__ could be cleared in a complex pattern involving a __del__ method re-raising an exception. -- Issue #2534: speed up isinstance() and issubclass() by 50-70%, so as to +- Issue #2534: speed up isinstance() and issubclass() by 50-70%, so as to match Python 2.5 speed despite the __instancecheck__ / __subclasscheck__ mechanism. In the process, fix a bug where isinstance() and issubclass(), when given a tuple of classes as second argument, were looking up @@ -638,7 +641,7 @@ Library - The deprecation warnings for the camelCase threading API names were removed. -- Issue #3110: multiprocessing fails to compiel on solaris 10 due to missing +- Issue #3110: multiprocessing fails to compiel on solaris 10 due to missing SEM_VALUE_MAX. Extension Modules -- 2.47.3