Python 记录器应该作为参数传递吗?

Ano*_*ard 6 python logging

我们正在开发的 Python 应用程序需要一个记录器。一位同事认为应该在每个使用它的类中创建和配置记录器。我的观点是,它应该在应用程序启动时创建和配置,并作为构造函数参数传递。

两种变体都有其优点,我们不确定最佳实践是什么。

joe*_*nte 0

也许这可以帮助您获得想法?当然,您可以做得更好,从配置文件或其他文件中读取设置,但这只是一个简单的例子。

用于配置日志记录的单独模块mylogmod.py::

import logging

FILENAME = "mylog.log" # Your logfile
LOGFORMAT = "%(message)s" # Your format
DEFAULT_LEVEL = "info" # Your default level, usually set to warning or error for production
LEVELS = {
    'debug':logging.DEBUG,
    'info':logging.INFO,
    'warning':logging.WARNING,
    'error':logging.ERROR,
    'critical':logging.CRITICAL}

def startlogging(filename=FILENAME, level=DEFAULT_LEVEL):
    logging.basicConfig(filename=filename, level=LEVELS[level], format=LOGFORMAT)
Run Code Online (Sandbox Code Playgroud)

main.py

import logging
from mylogmod import startlogging
from myclass import MyClass

startlogging()

logging.info("Program started...")
mc = MyClass()
Run Code Online (Sandbox Code Playgroud)

myclass.py带有自测试的模块中的类。您可以在单元测试中执行类似的操作:(注意,您不需要在单元测试中导入日志记录模块,只需功能startlogging就足够了。这样您可以将默认级别设置为警告或错误以及单元测试和自测试调试)

import logging

class MyClass(object):
    def __init__(self):
        logging.info("Initialze MyClass instance...")

if __name__ == "__main__":
    from mylogmod import startlogging
    startlogging(level="debug")
    logging.debug("Test MyClass...")
    #... rest of test code...
Run Code Online (Sandbox Code Playgroud)