2012-03-25 61 views
9

Python的记录模块允许模块或类定义它们自己的记录器。不同的记录器可以有不同的处理器。其中一些可能会选择登录到一个文件,而有些则选择登录到stdout。如何配置应用程序中的所有记录器

现在我的应用程序使用了几个这些模块,每个模块都有自己的记录器,它们有各种处理程序。我可以统一日志记录行为,以便所有日志都转到我指定的日志文件中吗?换句话说,有没有办法从一个地方同时.config()所有记录器的处理程序?

回答

10

您应该查看Python Logging HOWTO以了解它是如何工作的。

总之,所有模块通常都会获取G_LOG = logging.getLogger('package.name')格式的记录器并将消息发送到记录器:G_LOG.info('some message'), G_LOG.exception('something bad happened')。模块通常不应该配置任何东西。

使用该模块可以转动记录上以及基于所述记录器名称配置处理程序中的应用:

  • 听所有的消息,或
  • 听仅高于某一阈值的消息,或
  • 只有从记录器名称以 package开始
  • 听消息或
  • 仅从记录器的名字开始woth package.name听消息等

最简单的方法是通过logging.basicConfig在应用程序开头的某处配置记录:

logging.basicConfig(level=logging.DEBUG, 
        format='%(asctime)s %(levelname)-8s %(message)s', 
        datefmt='%Y-%m-%d %H:%M:%S', 
        filename=log_file, filemode='a') 

这样,你会写所有模块到log_file所有日志信息。

如果您需要更详细的日志策略(把来自不同记录器记录到不同的文件,或发送踪迹到一个单独的文件),这是更好地定义日志记录配置文件,并使用logging.config.dictConfiglogging.config.fileConfig配置日志记录。

P.S.我通常创建两个记录器作为模块变量:

G_LOG = logging.getLogger(__name__) 
ST_LOG = logging.getLogger('stacktrace.' + __name__) 

G_LOG我只发送一行消息。到ST_LOG我使用ST_LOG.exception复制重要消息,它隐含地有exc_info=True,并写入当前异常的堆栈跟踪。

在我加载配置了两个记录器(和两个文件处理程序它们)的配置的应用程序的启动:一个其接收开始消息来与stacktrace并且具有propagate=0(即堆栈跟踪消息是不可见的在顶部)以及处理其余消息的根记录器。我不会在这里放置我的完整的日志配置文件,因为它是一个有用的家庭工作,以了解它是如何工作的。

+1

我喜欢你在这里的堆栈跟踪的想法,但我讨厌你的“我不会把我的完整的日志配置文件”的位置。我已经做了近10年的python开发,并且由于文档有多糟糕,仍然做得非常糟糕。我每年花几个工作日来尝试寻找更好的东西。我通常会放弃并解决我过去做过的事情。 – 2016-12-27 22:11:43

+0

@BrunoBronosky,你可能是对的。是个好主意。 – newtover 2016-12-27 23:34:01

相关问题