在包中记录

que*_*ode 0 python logging

我正在开发一个包,其他人将使用它来编写处理脚本.对于测试/调试/非疯狂的目的,我想在我的代码中包含一些日志记录语句,特别是使用logging_setup()我为另一个项目开发的实用程序函数来进行格式化/文件输出控制.

因为我不是在编写一个自包含的应用程序,而是一个意图被其他程序调用的库,我很困惑我应该使用我的logging_setup()实用程序来生成我想要的所需的日志记录结果.这让我想知道在我的软件包中使用日志系统是否是一个好主意.

我应该在哪里使用我的logging_setup()实用程序?

编辑:这是我上面提到的功能:

def logging_setup(cfg_path=definitions.LOG_CONFIG_PATH, lvl=logging.INFO):
    """Setup logging tool from YAML configuration file.

    This should only be run once. Formatted (or configured) logging can only be
    done from within functions/classes in other modules.
    """

    # create directory for log files if not already there
    try:
        os.makedirs(definitions.LOGS_PATH)
    except OSError as e:
        if e.errno != errno.EEXIST:
            raise

    # configure logging from yaml config file
    if os.path.exists(cfg_path):
        with open(cfg_path, 'rt') as f:
            config = yaml.safe_load(f.read())

        logging.config.dictConfig(config)

    else:
        logging.basicConfig(level=lvl)
Run Code Online (Sandbox Code Playgroud)

wim*_*wim 5

我应该在哪里使用我的logging_setup()实用程序?

在库代码中,您不应该在任何地方配置日志记录.您的库(应用程序分发服务器)的用户可以配置日志记录处理程序.

作为库的作者,您对运行时上下文一无所知,甚至根本不知道是否有可写的文件系统可用于创建日志文件.但要使用 logging,您无需关心配置 - 只需import logging在模块级别创建记录器,您就可以从库代码中记录事件.它不是库代码,以决定其中那些日志事件去-或者,如果他们去任何地方都没有.

如果您正在提供应用程序而您想要记录输出,那么将日志记录配置为应用程序在启动时所做的第一件事 - 通常在Python中这意味着logging.config.dictConfig在进入该main()功能后不久就会调用或类似(请确保记录配置不会发生在import时间).

  • 在我的另一个项目(一个独立的应用程序)中,我使用相同的函数来启动正确的日志记录配置(我想做的事情).我在考虑如何在这里使用相同的配置,但这个答案正是我所寻找的:描述编写库的良好实践.非常感激. (2认同)