summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVinay Sajip <vinay_sajip@yahoo.co.uk>2017-06-06 15:34:29 (GMT)
committerGitHub <noreply@github.com>2017-06-06 15:34:29 (GMT)
commit6260d9f2039976372e0896d517b3c06e606eb169 (patch)
tree5222777b12a41ead8367261d1c80c22eefca012d
parentb87c0dfe902009e926edfb4ea5c7b26dcbdca2fe (diff)
downloadcpython-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.rst2
-rw-r--r--Lib/logging/__init__.py15
-rw-r--r--Lib/test/test_logging.py8
-rw-r--r--Misc/NEWS4
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"
diff --git a/Misc/NEWS b/Misc/NEWS
index 1b5794b..4b0879b 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -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.