7

我试图通过添加上下文过滤器来更改日志记录格式。我的格式是这样的

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'">

谁能告诉我这里出了什么问题??以及如何纠正?

4

3 回答 3

5

好吧,例外是告诉您thread._local返回的对象threading.local()没有value您可以分配的属性valdir(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)

这实际上将创建属性并为其分配值。

实例属性通常不是通过简单地分配来创建的,就像非实例变量是......

于 2013-12-17T19:38:46.983 回答
0
  1. 卸载系统中的 Keras 版本

    pip uninstall keras
    
  2. 安装 keras 版本 2.2.5

    pip install keras==2.2.5
    

它对我有用。

于 2020-04-15T11:56:10.130 回答
0

threading local 的属性是每个线程的。如果您在一个线程上创建 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
于 2018-12-03T22:29:01.783 回答