请允许我回答我自己的问题。这里的根本问题是settings.py会被导入两次,甚至更多(请参阅此处)。(我仍然不明白为什么会这样。也许有些Django专家可以向我解释。)这似乎在其他一些模块中也是正确的。在这一点上,我认为对settings.py将被导入多少次做出假设是不明智的。因此,这种假设通常并不安全。我在settings.py以外的其他地方有此代码,并且结果相似。
您必须对此进行编码。也就是说,您必须在添加其他处理程序之前检查记录器中是否存在现有处理程序。这有点丑陋,因为将多个处理程序(即使是同一类型)附加到一个记录器是完全合理的。有几种解决方案。一种是检查记录器对象的handlers属性。如果您只想使用一个处理程序并且长度> 0,则不要添加它。我个人不喜欢这种解决方案,因为它会使更多的处理程序变得混乱。
我喜欢这样的东西(感谢Thomas Guettler):
# file logconfig.py
if not hasattr(logging, "set_up_done"):
logging.set_up_done=False
def set_up(myhome):
if logging.set_up_done:
return
# set up your logging here
# ...
logging.set_up_done=True
我必须说,我希望Django多次导入settings.py的事实得到了更好的记录。而且我想我的配置会以某种方式导致多次导入,但是我很难找出导致问题的原因和原因。也许我只是在他们的文档中找不到,但是我认为这是需要警告用户的事情。