diff options
author | Vinay Sajip <vinay_sajip@yahoo.co.uk> | 2017-06-06 15:34:29 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-06-06 15:34:29 (GMT) |
commit | 6260d9f2039976372e0896d517b3c06e606eb169 (patch) | |
tree | 5222777b12a41ead8367261d1c80c22eefca012d | |
parent | b87c0dfe902009e926edfb4ea5c7b26dcbdca2fe (diff) | |
download | cpython-6260d9f2039976372e0896d517b3c06e606eb169.zip cpython-6260d9f2039976372e0896d517b3c06e606eb169.tar.gz cpython-6260d9f2039976372e0896d517b3c06e606eb169.tar.bz2 |
bpo-30520: Implemented pickling for loggers. (#1956)
Implemented pickling for loggers.
-rw-r--r-- | Doc/library/logging.rst | 2 | ||||
-rw-r--r-- | Lib/logging/__init__.py | 15 | ||||
-rw-r--r-- | Lib/test/test_logging.py | 8 | ||||
-rw-r--r-- | Misc/NEWS | 4 |
4 files changed, 26 insertions, 3 deletions
diff --git a/Doc/library/logging.rst b/Doc/library/logging.rst index 63059ac..1b27241 100644 --- a/Doc/library/logging.rst +++ b/Doc/library/logging.rst @@ -323,6 +323,8 @@ is the module's name in the Python package namespace. .. versionadded:: 3.2 + .. versionchanged:: 3.7 + Loggers can now be picked and unpickled. .. _levels: diff --git a/Lib/logging/__init__.py b/Lib/logging/__init__.py index 4920383..64e24ee 100644 --- a/Lib/logging/__init__.py +++ b/Lib/logging/__init__.py @@ -1,4 +1,4 @@ -# Copyright 2001-2016 by Vinay Sajip. All Rights Reserved. +# Copyright 2001-2017 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. -Copyright (C) 2001-2016 Vinay Sajip. All Rights Reserved. +Copyright (C) 2001-2017 Vinay Sajip. All Rights Reserved. To use, simply 'import logging' and log away! """ @@ -1570,6 +1570,14 @@ class Logger(Filterer): level = getLevelName(self.getEffectiveLevel()) return '<%s %s (%s)>' % (self.__class__.__name__, self.name, level) + def __reduce__(self): + # In general, only the root logger will not be accessible via its name. + # However, the root logger's class has its own __reduce__ method. + if getLogger(self.name) is not self: + import pickle + raise pickle.PicklingError('logger cannot be pickled') + return getLogger, (self.name,) + class RootLogger(Logger): """ @@ -1583,6 +1591,9 @@ class RootLogger(Logger): """ Logger.__init__(self, "root", level) + def __reduce__(self): + return getLogger, () + _loggerClass = Logger class LoggerAdapter(object): diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py index ed25d3e..880f4e8 100644 --- a/Lib/test/test_logging.py +++ b/Lib/test/test_logging.py @@ -4086,6 +4086,14 @@ class LoggerTest(BaseTest): self.assertRaises(TypeError, logging.getLogger, any) self.assertRaises(TypeError, logging.getLogger, b'foo') + def test_pickling(self): + for proto in range(pickle.HIGHEST_PROTOCOL + 1): + for name in ('', 'root', 'foo', 'foo.bar', 'baz.bar'): + logger = logging.getLogger(name) + s = pickle.dumps(logger, proto) + unpickled = pickle.loads(s) + self.assertIs(unpickled, logger) + class BaseFileTest(BaseTest): "Base class for handler tests that write log files" @@ -345,6 +345,8 @@ Extension Modules Library ------- +- bpo-30520: Loggers are now pickleable. + - bpo-30557: faulthandler now correctly filters and displays exception codes on Windows @@ -353,7 +355,7 @@ Library - bpo-30245: Fix possible overflow when organize struct.pack_into error message. Patch by Yuan Liu. - + - bpo-30378: Fix the problem that logging.handlers.SysLogHandler cannot handle IPv6 addresses. |