Как предотвратить перезапись объекта журнала

Я использую сторонний lib, но, кажется, lib импортирует ведение журнала и изменяет configs (logging.basicConfig, logging.dictConfig, etc), который испортил мою консоль и ведение журнала файлов, я ищу способ предотвратить изменение моего ведения журнала.

Я попытался скопировать объект регистрации и переназначить его обратно, как только это будет сделано, но copy.deepcopyне позволит мне клонировать исходный объект-говоря это cant can't pickle _cffi_backend.CTypeDescr objects:

    logging_obj = copy.deepcopy(logging)
  File "/usr/local/Cellar/python/2.7.12_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/copy.py", line 190, in deepcopy
    y = _reconstruct(x, rv, 1, memo)
  File "/usr/local/Cellar/python/2.7.12_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/copy.py", line 334, in _reconstruct
    state = deepcopy(state, memo)
  File "/usr/local/Cellar/python/2.7.12_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/copy.py", line 163, in deepcopy
    y = copier(x, memo)
  File "/usr/local/Cellar/python/2.7.12_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/copy.py", line 257, in _deepcopy_dict
    y[deepcopy(key, memo)] = deepcopy(value, memo)
  File "/usr/local/Cellar/python/2.7.12_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/copy.py", line 190, in deepcopy
    y = _reconstruct(x, rv, 1, memo)
  File "/usr/local/Cellar/python/2.7.12_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/copy.py", line 334, in _reconstruct
    state = deepcopy(state, memo)
  File "/usr/local/Cellar/python/2.7.12_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/copy.py", line 163, in deepcopy
    y = copier(x, memo)
  File "/usr/local/Cellar/python/2.7.12_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/copy.py", line 257, in _deepcopy_dict
    y[deepcopy(key, memo)] = deepcopy(value, memo)
  File "/usr/local/Cellar/python/2.7.12_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/copy.py", line 190, in deepcopy
    y = _reconstruct(x, rv, 1, memo)
  File "/usr/local/Cellar/python/2.7.12_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/copy.py", line 334, in _reconstruct
    state = deepcopy(state, memo)
  File "/usr/local/Cellar/python/2.7.12_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/copy.py", line 163, in deepcopy
    y = copier(x, memo)
  File "/usr/local/Cellar/python/2.7.12_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/copy.py", line 257, in _deepcopy_dict
    y[deepcopy(key, memo)] = deepcopy(value, memo)
TypeError: can't pickle _cffi_backend.CTypeDescr objects

поэтому я попытался проверить его содержимое (но только преобразовал в str и сравнил), и я обнаружил_handlerList, что он был изменен, но все еще не будет работать после того, как я переназначу его обратно:

handler_list = copy.deepcopy(logging.__dict__['_handlerList'])
obj = {}
for k in logging.__dict__:
    obj[k] = str(logging.__dict__[k])
# some 3rd party lib calls
self.logger.info("containers: {}".format(containers))
logging.__dict__['_handlerList'] = handler_list
# print out different obj, will print nothing after assign handler_list back (above line)
for k in logging.__dict__:
    if not str(logging.__dict__[k]) == obj[k]:
        print k
        print "=="*100
        print logging.__dict__[k]
        print "--"*50
        print obj[k]
        print "=="*100

Надеюсь, кто-то мог бы помочь мне, я даже не знаю, правильно ли я это делаю (вероятно, нет…but I don’t know how and couldn’t find how), 3rd party lib was actually built for cli usages, but i’m trying to import and treat it as a lib.

И у меня всегда есть трудное время понимания ведения журнала python, это будет действительно здорово, если кто-то может также предложить некоторые статьи ведения журнала.

Заранее большое спасибо.

1 ответ

  1. После некоторой отладки, оказывается, что мой регистратор был таинственно отключен, до 3-го вызова lib, мой logger.__dict__:

    {
        'name': 'log/controller.log',
        'parent': < logging.RootLogger object at 0x10cb3d190 > ,
        'handlers': [ < logging.handlers.RotatingFileHandler object at 0x10de5d4d0 > , < logging.StreamHandler object at 0x10de5da90 > ],
        'level': 20,
        'custom': < function custom at 0x10de6a668 > ,
        'disabled': 0,
        'manager': < logging.Manager object at 0x10cb3d250 > ,
        'propagate': False,
        'result': < function result at 0x10de6a6e0 > ,
        'filters': []
    }
    

    после вызова disabled стал True:

    {
        'name': 'log/controller.log',
        'parent': < logging.RootLogger object at 0x10cb3d190 > ,
        'handlers': [ < logging.handlers.RotatingFileHandler object at 0x10de5d4d0 > , < logging.StreamHandler object at 0x10de5da90 > ],
        'level': 20,
        'custom': < function custom at 0x10de6a668 > ,
        'disabled': True,
        'manager': < logging.Manager object at 0x10cb3d250 > ,
        'propagate': False,
        'result': < function result at 0x10de6a6e0 > ,
        'filters': []
    }
    

    после установки функции (logger.disabled = 0) мой регистратор снова начал печать и вход в файлы.

    Надеюсь, это поможет кому-то столкнуться с той же проблемой.