Commit 6260d9f2 authored by Vinay Sajip's avatar Vinay Sajip Committed by GitHub

bpo-30520: Implemented pickling for loggers. (#1956)

Implemented pickling for loggers.
parent b87c0dfe
...@@ -323,6 +323,8 @@ is the module's name in the Python package namespace. ...@@ -323,6 +323,8 @@ is the module's name in the Python package namespace.
.. versionadded:: 3.2 .. versionadded:: 3.2
.. versionchanged:: 3.7
Loggers can now be picked and unpickled.
.. _levels: .. _levels:
......
# 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 # Permission to use, copy, modify, and distribute this software and its
# documentation for any purpose and without fee is hereby granted, # documentation for any purpose and without fee is hereby granted,
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
Logging package for Python. Based on PEP 282 and comments thereto in Logging package for Python. Based on PEP 282 and comments thereto in
comp.lang.python. 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! To use, simply 'import logging' and log away!
""" """
...@@ -1570,6 +1570,14 @@ class Logger(Filterer): ...@@ -1570,6 +1570,14 @@ class Logger(Filterer):
level = getLevelName(self.getEffectiveLevel()) level = getLevelName(self.getEffectiveLevel())
return '<%s %s (%s)>' % (self.__class__.__name__, self.name, level) 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): class RootLogger(Logger):
""" """
...@@ -1583,6 +1591,9 @@ class RootLogger(Logger): ...@@ -1583,6 +1591,9 @@ class RootLogger(Logger):
""" """
Logger.__init__(self, "root", level) Logger.__init__(self, "root", level)
def __reduce__(self):
return getLogger, ()
_loggerClass = Logger _loggerClass = Logger
class LoggerAdapter(object): class LoggerAdapter(object):
......
...@@ -4086,6 +4086,14 @@ class LoggerTest(BaseTest): ...@@ -4086,6 +4086,14 @@ class LoggerTest(BaseTest):
self.assertRaises(TypeError, logging.getLogger, any) self.assertRaises(TypeError, logging.getLogger, any)
self.assertRaises(TypeError, logging.getLogger, b'foo') 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): class BaseFileTest(BaseTest):
"Base class for handler tests that write log files" "Base class for handler tests that write log files"
......
...@@ -345,6 +345,8 @@ Extension Modules ...@@ -345,6 +345,8 @@ Extension Modules
Library Library
------- -------
- bpo-30520: Loggers are now pickleable.
- bpo-30557: faulthandler now correctly filters and displays exception codes - bpo-30557: faulthandler now correctly filters and displays exception codes
on Windows on Windows
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment