4

collective.logbookサイトのエラーを保存するために/ fix を使用しています。現在、ログブックはいくつかの例外で私のサイトで失敗します:

  File "/srv/plone/xxx/src/collective.logbook/collective/logbook/events.py", line 101, in hand
    transaction.commit()
  File "/srv/plone/buildout-cache/eggs/transaction-1.1.1-py2.6.egg/transaction/_manager.py", line 8
    return self.get().commit()
  File "/srv/plone/buildout-cache/eggs/transaction-1.1.1-py2.6.egg/transaction/_transaction.py", li
    self._commitResources()
  File "/srv/plone/buildout-cache/eggs/transaction-1.1.1-py2.6.egg/transaction/_transaction.py", li
    rm.commit(self)
  File "/srv/plone/buildout-cache/eggs/ZODB3-3.10.5-py2.6-linux-x86_64.egg/ZODB/Connection.py", lin
    self._commit(transaction)
  File "/srv/plone/buildout-cache/eggs/ZODB3-3.10.5-py2.6-linux-x86_64.egg/ZODB/Connection.py", lin
    self._store_objects(ObjectWriter(obj), transaction)
  File "/srv/plone/buildout-cache/eggs/ZODB3-3.10.5-py2.6-linux-x86_64.egg/ZODB/Connection.py", lin
    p = writer.serialize(obj)  # This calls __getstate__ of obj
  File "/srv/plone/buildout-cache/eggs/ZODB3-3.10.5-py2.6-linux-x86_64.egg/ZODB/serialize.py", line
    return self._dump(meta, obj.__getstate__())
  File "/srv/plone/buildout-cache/eggs/ZODB3-3.10.5-py2.6-linux-x86_64.egg/ZODB/serialize.py", line
    self._p.dump(state)
TypeError: Can't pickle objects in acquisition wrappers.

これは明らかに、logbook が取得したオブジェクトを参照するエラーの記録を書き込もうとするためです。解決策は、これらの種類のオブジェクトからエラーを取り除くことだと思います。

しかし、何が悪いオブジェクトなのか、どのようにトランザクション マネージャーにたどり着くのか、この問題の原因となっている Python オブジェクト参照は何かを特定するにはどうすればよいでしょうか? または、この問題をデバッグするのに役立つものはありますか?

4

1 に答える 1

3

これを確実に再現できる場合は、printステートメントまたはpdb.set_trace()ZODB接続_registerメソッド(卵ZODB/connection.pyの内部)に入れることができます。ZODB

def _register(self, obj=None):
    # ... skipped lines ...

    if obj is not None:
        self._registered_objects.append(obj)
        # Insert print statement here.

これで、オブジェクトが変更済みとしてマークされたり、新しいオブジェクトとして接続に追加されたりすると、コンソールに出力されます。これは、デバッグプロセスに役立ちます。幸運を!

于 2012-09-11T09:57:21.863 に答える