我还没有找到一种使用Django设置Python日志(log)的方法,我对此很满意.我的要求相当简单:

  • 不同事件的不同日志(log)处理程序-也就是说,我希望能够记录到不同的文件
  • 轻松访问我的模块中的记录器.该模块应该能够轻松找到其记录器.
  • 应该很容易应用于命令行模块.系统的某些部分是独立的命令行或守护进程.日志(log)记录应该可以很容易地与这些模块一起使用.

我当前的设置是使用一个logging.conf文件,并在我从其中登录的每个模块中设置日志(log)记录.感觉不太对劲.

您有喜欢的日志(log)记录设置吗?请详细说明:如何设置配置(使用logging.conf还是在代码中设置),在何处/何时启动记录器,以及如何在模块中访问它们,等等.

推荐答案

到目前为止,我找到的最好的方法是在settings.py中初始化日志(log)设置,而不是在其他地方.您可以使用配置文件,也可以循序渐进地以编程方式完成-这只取决于您的要求.关键是,我通常会将我想要的处理程序添加到根记录器中,使用级别,有时还会记录.筛选以将我想要的事件添加到适当的文件、控制台、syslog等.当然,您也可以将处理程序添加到任何其他记录器,但根据我的经验,通常不需要这样做.

在每个模块中,我使用

logger = logging.getLogger(__name__)

并使用它来记录模块中的事件(如果我想进一步区分的话),使用一个记录器,该记录器是上面创建的记录器的子级.

如果我的应用程序可能要在没有配置settings.py中的日志(log)的站点中使用,我会在某个地方定义一个NullHandler,如下所示:

#someutils.py

class NullHandler(logging.Handler):
    def emit(self, record):
        pass

null_handler = NullHandler()

并确保将其实例添加到我的应用程序中使用日志(log)记录的模块中创建的所有记录器.(注意:NullHandler已经包含在Python3.1的日志(log)记录包中,并将包含在Python2.7中.)因此:

logger = logging.getLogger(__name__)
logger.addHandler(someutils.null_handler)

这样做是为了确保您的模块在没有在settings.py中配置日志(log)记录的站点中运行良好,并且不会收到任何令人讨厌的"No Handler can be find for logger X.Y.Z"消息(这是关于可能配置错误的日志(log)记录的警告).

这样做符合您声明的要求:

  • 您可以像当前一样,为不同的事件设置不同的日志(log)处理程序.
  • 轻松访问模块中的记录器-使用getLogger(__name__).
  • 很容易应用于命令行模块——它们还可以导入settings.py个.

Update:请注意,从1.3版开始,Django现在包含了support for logging个.

Django相关问答推荐

把Django测试和testcafe结合起来?

Django Admin中显示的DateField下面的小提示是什么?

Django-Values()并按月分组

来自日历的 Django 动态 url

遍历django模板中的外键相关表

使用 Python/Django 上传大文件

使用 args 和选项编写自定义管理命令 - 所需字段说明

一个简单的Django和CSS示例

Ruby on Rails 会影响网页的外观吗?

django中的脏字段

OrderingFilter 没有属性filter_queryset

Django:从视图中添加 non_field_error?

在 Django 1.8 或更高版本中填充时出现Models aren't loaded yet"错误

如何覆盖 django 管理员翻译?

在 Django 中使用 LiveServerTestCase 时使用代码登录

Django Rest Framework 序列化程序中的循环依赖

为什么我的 Django 单元测试不知道安装了 MessageMiddleware?

ModelForm 上的 Django 和字段集

如何 suppress Django 中的弃用警告?

运行单元测试时禁用 Django South?