我试图通过添加上下文过滤器来更改日志记录格式。我的格式是这样的
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'">
谁能告诉我这里有什么问题?以及如何纠正?
答案 0 :(得分: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)
不在其中。
如果您尝试添加新属性,那么您可能需要:
{{1}}
这实际上会创建属性并为其赋值。
实例属性通常不是通过分配给它们来创建的,就像非实例变量一样......
答案 1 :(得分:0)
局部线程的属性是每个线程的。如果在一个线程上创建TEST对象,在另一个线程上运行筛选器,则会出现此错误。
我不太清楚你要做什么。如果确定要线程本地存储,则可以在访问之前使用hasattr
来检查属性。
尝试一下:
def filter(self,record):
if not hasattr(self.test_var, 'value'):
self.test_var.value = 'some default var'
record.VAL=self.test_var.value
return True
答案 2 :(得分:0)
在系统中卸载Keras版本
pip uninstall keras
安装keras版本2.2.5
pip install keras==2.2.5
对我有用。