From 519cb8772a9745b1c7d8218cabcd2f96ceda4d62 Mon Sep 17 00:00:00 2001 From: l0rb Date: Wed, 6 Nov 2019 22:21:40 +0100 Subject: bpo-38716: stop rotating handlers from setting inherited namer and rotator to None (GH-17072) --- Lib/logging/handlers.py | 5 +++-- Lib/test/test_logging.py | 19 +++++++++++++++++++ .../Library/2019-11-06-15-58-07.bpo-38716.R3uMLT.rst | 1 + 3 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2019-11-06-15-58-07.bpo-38716.R3uMLT.rst diff --git a/Lib/logging/handlers.py b/Lib/logging/handlers.py index 5641fee..c1aec98 100644 --- a/Lib/logging/handlers.py +++ b/Lib/logging/handlers.py @@ -48,6 +48,9 @@ class BaseRotatingHandler(logging.FileHandler): Not meant to be instantiated directly. Instead, use RotatingFileHandler or TimedRotatingFileHandler. """ + namer = None + rotator = None + def __init__(self, filename, mode, encoding=None, delay=False, errors=None): """ Use the specified filename for streamed logging @@ -58,8 +61,6 @@ class BaseRotatingHandler(logging.FileHandler): self.mode = mode self.encoding = encoding self.errors = errors - self.namer = None - self.rotator = None def emit(self, record): """ diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py index 53b5bfc..6de8803 100644 --- a/Lib/test/test_logging.py +++ b/Lib/test/test_logging.py @@ -5030,6 +5030,25 @@ class RotatingFileHandlerTest(BaseFileTest): self.assertFalse(os.path.exists(namer(self.fn + ".3"))) rh.close() + def test_namer_rotator_inheritance(self): + class HandlerWithNamerAndRotator(logging.handlers.RotatingFileHandler): + def namer(self, name): + return name + ".test" + + def rotator(self, source, dest): + if os.path.exists(source): + os.rename(source, dest + ".rotated") + + rh = HandlerWithNamerAndRotator( + self.fn, backupCount=2, maxBytes=1) + self.assertEqual(rh.namer(self.fn), self.fn + ".test") + rh.emit(self.next_rec()) + self.assertLogFile(self.fn) + rh.emit(self.next_rec()) + self.assertLogFile(rh.namer(self.fn + ".1") + ".rotated") + self.assertFalse(os.path.exists(rh.namer(self.fn + ".1"))) + rh.close() + @support.requires_zlib def test_rotator(self): def namer(name): diff --git a/Misc/NEWS.d/next/Library/2019-11-06-15-58-07.bpo-38716.R3uMLT.rst b/Misc/NEWS.d/next/Library/2019-11-06-15-58-07.bpo-38716.R3uMLT.rst new file mode 100644 index 0000000..906eb6b --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-11-06-15-58-07.bpo-38716.R3uMLT.rst @@ -0,0 +1 @@ +logging: change RotatingHandler namer and rotator to class-level attributes. This stops __init__ from setting them to None in the case where a subclass defines them with eponymous methods. -- cgit v0.12