我正在开发一个Django应用程序,并尝试使用Python的日志模块来记录错误/跟踪。理想的情况下,我想有不同的记录器配置为不同的地区的网站。到目前为止,我已经完成了所有的工作,但有一件事让我抓狂。
我将根日志记录器设置为sys.stderr,并将另一个日志记录器配置为写入文件。这在my settings.py文件中:
sviewlog = logging.getLogger('MyApp.views.scans')
view_log_handler = logging.FileHandler('C:\\MyApp\\logs\\scan_log.log')
view_log_handler.setLevel(logging.INFO)
view_log_handler.setFormatter(logging.Formatter('%(asctime)s %(name)-12s %(levelname)-8s %(message)s'))
sviewlog.addHandler(view_log_handler)
看起来很简单。但问题是:无论我向sviewlog写入什么,都会被写入日志文件两次。根记录器只打印一次。就像addHandler()被调用了两次。当我把我的代码通过调试器时,这正是我所看到的。settings.py中的代码将执行两次,因此将创建两个文件处理程序并将其添加到同一个记录器实例中。但为什么呢?我该怎么解决这个问题呢?
有人能告诉我这里发生了什么事吗?我试过将sviewlog记录器/处理程序实例化代码移动到它所使用的文件中(因为这对我来说实际上似乎是一个合适的位置),但是我也遇到了同样的问题。我在网上看到的大多数例子都只使用根日志,我更希望有多个日志。
很难评论你的具体情况。如果settings.py被执行两次,那么对于每个发送的日志,通常会得到两行。
我们遇到了同样的问题,所以我们在项目中设置了一个专门用于日志记录的模块。模块有一个“module singleton”模式,因此我们只执行一次有趣的代码。
看起来是这样的:
第一次导入log.py将正确配置日志记录。
从1.3版开始,Django使用标准的python日志记录,配置了
LOGGING
设置(这里记录了:1.3,dev)。Django日志记录引用:1.3,dev。
请允许我回答我自己的问题。这里的根本问题是settings.py被导入两次,甚至更多(请参见here)。(我还是不明白这是为什么。或许某位Django专家可以向我解释这一点。)这似乎也适用于其他一些模块。在这一点上,我不认为假设settings.py将被导入多少次是明智的。就这一点而言,一般来说,这样的假设是不安全的。我在settings.py以外的地方编写了这段代码,结果类似。
你必须在这附近编码。也就是说,在向日志添加其他处理程序之前,必须检查日志记录程序中是否存在现有处理程序。这有点难看,因为将多个处理程序(甚至是同一类型的处理程序)附加到一个记录器上是完全合理的。有一些解决办法。一个是检查logger对象的handlers属性。如果只需要一个处理程序和长度>;0,则不要添加它。就我个人而言,我不喜欢这个解决方案,因为它会被更多的处理程序弄得一团糟。
我更喜欢这样的东西(多亏了托马斯·盖特勒):
我必须说,我希望Django imports settings.py多次被更好地记录下来。我可以想象我的配置会以某种方式导致这个多重导入,但是我很难找出导致这个问题的原因和原因。也许我只是在他们的文档中找不到,但我认为这是你需要提醒用户的事情。
相关问题 更多 >
编程相关推荐