到目前为止,我找到的最好的方法是在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个.