【问题标题】:Python proper logging with filehandlersPython 使用文件处理程序正确记录日志
【发布时间】:2011-07-16 11:29:02
【问题描述】:

我在我的 django 应用程序中使用 python 日志记录。如果需要,连接到后端 api 的类会使用文件处理程序初始化此记录器。每次进行 api 调用时都会实例化该类。我已经尝试确保不会每次都添加额外的处理程序,但是

lsof | grep my.log 

在我的日志文件中显示越来越多的处理程序,一段时间后我的服务器由于此打开文件限制而失败。

 self.logger = logging.getLogger("FPA")

        try:
            if self.logger.handlers[0].__class__.__name__=="FileHandler":
                pass
        except Exception, e:
            print 'new filehandler added'+str(e)
            ch = logging.FileHandler(FPA_LOG_TARGET)
            formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s - %(pathname)s @ line %(lineno)d")
            ch.setFormatter(formatter)
            self.logger.setLevel(logging.DEBUG)
            self.logger.addHandler(ch)

我意识到这可能不是最好的方法,但到目前为止我还没有在我的实现中发现错误。

【问题讨论】:

  • 你的问题到底是什么?
  • print 'new filehandler added'+str(e) 在您的日志语句中打印出什么内容?
  • 我的问题是我做错了什么?
  • print 'new filehandler added'+str(e) 表示索引超出范围,所以即使我已经初始化了记录器,我的类的下一个实例也不会看到任何处理程序。
  • 您需要为此提供更多上下文。它看起来完全像错误的方法,但我们不知道这发生在您的代码中的哪个位置?视图功能?设置.py?网址.py?此外,您为什么不断添加新的文件处理程序?为什么不在 logging.ini 文件中声明一次?

标签: python django logging filehandler


【解决方案1】:

if 半天没分析,貌似是并发问题。

每个进程/线程都保留自己的已打开日志文件的文件句柄列表。

如何解决?对于多线程代码,请确保有一个保存所有句柄的全局字典。对于多进程 - 恐怕我没有答案......每个进程都保留自己的文件句柄,也许将其映射到内存(内存映射文件可能是一个选项),但我不确定这是一个很好的解决方案 - see this remark

但主要问题是你为什么需要做这样的事情。

首先,您可以使用logging.conf 文件来初始化所有记录器/处理程序/格式化程序,并在需要时(例如,特定记录器很广泛,您想将其记录到单独的文件中)添加另一个具有不同文件名的记录器。如果您通过添加应用程序的主要__init__.py,为每个 django 应用程序添加一个记录器,这是非常明智的:

import logging
log = logging.getLogger(__name__)

然后在应用程序的其余代码(视图、模型等)中导入log

要使用logging.conf,请在您的 settings.py 中添加以下行:

import os
import logging
DIRNAME = os.path.abspath(os.path.dirname(__file__))
logging.config.fileConfig(os.path.join(DIRNAME, 'logging.conf'))

是的,它是手动的,但您不需要更改代码,只需一个配置文件。

另一种方法(如果您真的希望每个记录器类型有一个文件)是有一个单独的进程来保持文件打开,接受来自应用程序的连接。日志模块文档有一个nice example of this method

最后,但并非最不重要的是,已经有一些不错的解决方案可能会有所帮助。一,相当不错,就是使用django-sentry。该模块可以记录您的所有异常、404(带有额外的中间件 - 包括)并捕获所有日志记录(通过包含的日志记录处理程序)。

提供的 UI 将使您能够搜索所有记录的消息,按严重性和记录源过滤它们。但这不仅限于这些 - 您可以简单地添加自己的模块。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-27
    • 1970-01-01
    • 2019-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多