2013-12-17 5 views
3

Я пытался изменить формат ведения журнала, добавив фильтр контекста. Мой формат такой:'thread._local' объект не имеет атрибута

FORMAT = "%(asctime)s %(VAL)s %(message)s" 

Это класс, который я использую для установки VAL в формате.

class TEST: 
    def __init__(self, val): 
    self.test_var=threading.local() 
    self.test_var.value=val 
    def filter(self,record): 
    record.VAL=self.test_var.value 
    return True 
    def setValue(self,val) 
    self.test_var.value=CMDID 

Он отлично работает в однопоточной среде, но для определенной многопоточной среды я получаю ошибку

<Fault 1: "exceptions.AttributeError:'thread._local' object has no attribute 'value'"> 

Может кто-нибудь сказать мне, что здесь не так ?? и как исправить?

ответ

2

Ну, исключение говорит вам, что thread._local объект, возвращаемый из threading.local() не имеет атрибут value, который можно назначить val к. Вы можете подтвердить это, добавив dir(self.test_var) после строки self.test_var=threading.local(). Это возвращает это для меня:

['__class__', '__delattr__', '__dict__', '__doc__', '__getattribute__', '__hash__', 
'__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', 
'__str__'] 

Действительно, help(threading.local()) покажет вам методы и атрибуты, которые существуют - value среди них нет.

Если вы пытаетесь добавить новый атрибут, то, возможно, вы хотите:

self.test_var.__setattr__('value',val) 

Это будет на самом деле создать атрибут и присвоить ей значение.

Атрибуты экземпляра обычно не создаются просто назначением им, например, переменными без экземпляра являются ...

+0

блестящий. большое спасибо –

Смежные вопросы