From f58c61a2e0c313074729da6715d30d58e1503e69 Mon Sep 17 00:00:00 2001 From: Jactus Date: Thu, 29 Apr 2021 16:54:51 +0800 Subject: [PATCH 1/4] Fix logger pickling error --- qlib/log.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/qlib/log.py b/qlib/log.py index 5888b38413a..1d604e0c060 100644 --- a/qlib/log.py +++ b/qlib/log.py @@ -17,6 +17,7 @@ def __new__(cls, name, bases, dict): wrapper_dict = logging.Logger.__dict__.copy() wrapper_dict.update(dict) wrapper_dict["__doc__"] = logging.Logger.__doc__ + del wrapper_dict["__reduce__"] # make Logger object can be pickled return type.__new__(cls, name, bases, wrapper_dict) @@ -29,6 +30,15 @@ def __init__(self, module_name): self.module_name = module_name self.level = 0 + def __getstate__(self): + return vars(self) + + def __setstate__(self, state): + vars(self).update(state) + + def __reduce__(self): + return (QlibLogger, (self.module_name,)) + @property def logger(self): logger = logging.getLogger(self.module_name) From ca92cb980ca9a49d9c41f98e5f2c2c6941a8a1ae Mon Sep 17 00:00:00 2001 From: Jactus Date: Thu, 29 Apr 2021 22:40:52 +0800 Subject: [PATCH 2/4] Update meta logger --- qlib/log.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/qlib/log.py b/qlib/log.py index 1d604e0c060..19331f5d5b0 100644 --- a/qlib/log.py +++ b/qlib/log.py @@ -15,10 +15,11 @@ class MetaLogger(type): def __new__(cls, name, bases, dict): wrapper_dict = logging.Logger.__dict__.copy() - wrapper_dict.update(dict) - wrapper_dict["__doc__"] = logging.Logger.__doc__ - del wrapper_dict["__reduce__"] # make Logger object can be pickled - return type.__new__(cls, name, bases, wrapper_dict) + for key in wrapper_dict: + if key not in dict and key != "__reduce__": + dict[key] = wrapper_dict[key] + dict["__doc__"] = logging.Logger.__doc__ + return type.__new__(cls, name, bases, dict) class QlibLogger(metaclass=MetaLogger): From 51b649ec395f4a80e96dd88b51ebdd8d2a192db2 Mon Sep 17 00:00:00 2001 From: Jactus Date: Fri, 30 Apr 2021 13:13:05 +0800 Subject: [PATCH 3/4] Update QlibLogger --- qlib/log.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/qlib/log.py b/qlib/log.py index 19331f5d5b0..d095d571acd 100644 --- a/qlib/log.py +++ b/qlib/log.py @@ -31,12 +31,6 @@ def __init__(self, module_name): self.module_name = module_name self.level = 0 - def __getstate__(self): - return vars(self) - - def __setstate__(self, state): - vars(self).update(state) - def __reduce__(self): return (QlibLogger, (self.module_name,)) @@ -50,6 +44,9 @@ def setLevel(self, level): self.level = level def __getattr__(self, name): + # During unpickling, python will call __getattr__. Use this line to avoid maximum recursion error. + if name in {"__setstate__"}: + raise AttributeError return self.logger.__getattribute__(name) From 5eb9dfff166b79cdd2e00bc0ff7430f266db46b0 Mon Sep 17 00:00:00 2001 From: Jactus Date: Fri, 30 Apr 2021 15:28:37 +0800 Subject: [PATCH 4/4] Remove redundant --- qlib/log.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/qlib/log.py b/qlib/log.py index d095d571acd..e714bc15a24 100644 --- a/qlib/log.py +++ b/qlib/log.py @@ -18,7 +18,6 @@ def __new__(cls, name, bases, dict): for key in wrapper_dict: if key not in dict and key != "__reduce__": dict[key] = wrapper_dict[key] - dict["__doc__"] = logging.Logger.__doc__ return type.__new__(cls, name, bases, dict) @@ -31,9 +30,6 @@ def __init__(self, module_name): self.module_name = module_name self.level = 0 - def __reduce__(self): - return (QlibLogger, (self.module_name,)) - @property def logger(self): logger = logging.getLogger(self.module_name)