Python登录Djang

2024-10-06 18:18:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在开发一个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记录器/处理程序实例化代码移动到它所使用的文件中(因为这对我来说实际上似乎是一个合适的位置),但是我也遇到了同样的问题。我在网上看到的大多数例子都只使用根日志,我更希望有多个日志。


Tags: 文件django实例代码pylogview处理程序
3条回答

很难评论你的具体情况。如果settings.py被执行两次,那么对于每个发送的日志,通常会得到两行。

我们遇到了同样的问题,所以我们在项目中设置了一个专门用于日志记录的模块。模块有一个“module singleton”模式,因此我们只执行一次有趣的代码。

看起来是这样的:

def init_logging():
    stdoutHandler = logging.StreamHandler( sys.stdout )
    stdoutHandler.setLevel( DEBUG )
    stdoutHandler.setFormatter( logging.Formatter( LOG_FORMAT_WITH_TIME ) )
    logging.getLogger( LOG_AREA1 ).addHandler( stdoutHandler )

logInitDone=False #global variable controlling the singleton.
if not logInitDone:
    logInitDone = True
    init_logging()

第一次导入log.py将正确配置日志记录。

从1.3版开始,Django使用标准的python日志记录,配置了LOGGING设置(这里记录了:1.3dev)。

Django日志记录引用:1.3dev

请允许我回答我自己的问题。这里的根本问题是settings.py被导入两次,甚至更多(请参见here)。(我还是不明白这是为什么。或许某位Django专家可以向我解释这一点。)这似乎也适用于其他一些模块。在这一点上,我不认为假设settings.py将被导入多少次是明智的。就这一点而言,一般来说,这样的假设是不安全的。我在settings.py以外的地方编写了这段代码,结果类似。

你必须在这附近编码。也就是说,在向日志添加其他处理程序之前,必须检查日志记录程序中是否存在现有处理程序。这有点难看,因为将多个处理程序(甚至是同一类型的处理程序)附加到一个记录器上是完全合理的。有一些解决办法。一个是检查logger对象的handlers属性。如果只需要一个处理程序和长度>;0,则不要添加它。就我个人而言,我不喜欢这个解决方案,因为它会被更多的处理程序弄得一团糟。

我更喜欢这样的东西(多亏了托马斯·盖特勒):

# 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 imports settings.py多次被更好地记录下来。我可以想象我的配置会以某种方式导致这个多重导入,但是我很难找出导致这个问题的原因和原因。也许我只是在他们的文档中找不到,但我认为这是你需要提醒用户的事情。

相关问题 更多 >