Относительно эти DictObj
, следующее работало бы на Вас? Пустой класс позволит Вам произвольно добавлять к или материал замены в контейнерном объекте.
class Container(object):
pass
>>> myContainer = Container()
>>> myContainer.spam = "in a can"
>>> myContainer.eggs = "in a shell"
, Если Вы хотите не бросить AttributeError, когда нет никакого атрибута, что Вы думаете о следующем? Лично, я предпочел бы использовать dict для ясности или использовать пункт попытки/кроме.
class QuietContainer(object):
def __getattr__(self, attribute):
try:
return object.__getattr__(self,attribute)
except AttributeError:
return None
>>> cont = QuietContainer()
>>> print cont.me
None
Право?
Способ log4net «выбирать» дополнения - фильтрация. В вашем сценарии вам понадобится способ настройки нескольких приложений, каждый из которых представляет четко определенный поток, и фильтры в каждом приложении, проходящие через сообщения только из соответствующего потока.
Поскольку идентификатор потока не является детерминированным, вы будете нужно что-то еще для фильтрации. Я предполагаю, что вы сами контролируете создание этих потоков, и предлагаю, чтобы каждый поток регистрировал идентификатор в свойстве в ThreadContext . Затем вы можете использовать PropertyFilter для фильтрации сообщений на основе идентификаторов.
Вот пример настройки конфигурации с двумя добавочными элементами, каждое добавляющее сообщение, в котором текущее значение свойства threadId совпадает с заданным идентификатором.
<appender name="x">
<filter type="log4net.Filter.Property">
<key value="threadId" />
<stringToMatch value="threadX" />
</filter>
<filter type="log4net.Filter.DenyAllFilter" />
...
</appender>
<appender name="y">
<filter type="log4net.Filter.Property">
<key value="threadId" />
<stringToMatch value="threadY" />
</filter>
<filter type="log4net.Filter.DenyAllFilter" />
...
</appender>
<root>
<appender-ref name="x" />
<appender-ref name="y" />
</root>