Python如何在一个地方定义日志记录?

How to define logging in one place in Python?

我是新人Python,我想在python中的一个地方定义以下日志代码,以便它可以在其他python文件中使用(class 或非 class)。在 Java 的情况下,我们使用 log4j 或 slf4j 作为 jar 文件的一部分,我们简单地定义为 Logger logger = Logger.getLogger("class name"),我想要完全像这样实现,以便我可以在任何 python module/s。目前我在所有 classes.

中定义配置
import logging
logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s [%(levelname)s] %(message)s",
    handlers=[
        logging.FileHandler("debug.log"),
        logging.StreamHandler()
    ]
)

我也经历过这个 SO link Using logging in multiple modules

还请为具有更多 python 个文件的大中型项目推荐最推荐的方法。

让您的日志记录处理程序随处可用的一个选项是将其设为 built-in identifier:

a.py:

import logging
import builtins
logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s %(filename)s [%(levelname)s] %(message)s",
    handlers=[
        logging.FileHandler("/tmp/debug.log"),
        logging.StreamHandler()
    ]
)

builtins.logger = logging.getLogger(__name__)
logger.info("module a!")
import b

b.py:

logger.info(msg='This is from module b.py')

def foo():
    logger.info('Log message from b.foo()')

foo()

输出:

2020-02-14 20:18:17,549 a.py [INFO] module a!
2020-02-14 20:18:17,550 b.py [INFO] This is from module b.py
2020-02-14 20:18:17,550 b.py [INFO] Log message from b.foo()

根据这个 link https://fangpenlin.com/posts/2012/08/26/good-logging-practice-in-python/,作者提到了一个更好的做法。可能有更好的推荐方法。 您必须按照以下方式进行操作。

  1. 定义 logging.json 文件,如 link 中所述。
  2. 定义一个名为 LogSetup.py 的 python 文件并在代码下方添加。
def setup_logging(default_path='logging.json', default_level=logging.DEBUG, env_key='LOG_CFG'):
    """Setup logging configuration"""
    path = default_path
    value = os.getenv(env_key, None)
    if value:
        path = value
    if os.path.exists(path):
        with open(path, 'rt') as f:
            config = json.load(f)
        logging.config.dictConfig(config)
    else:
        logging.basicConfig(level=default_level)
  1. 在main方法中像这样调用上面的文件LogSetup.setup_logging()。 我在下面提供了代码片段。

logger = logging.getLogger(name)

if __name__ == '__main__':
    LogSetup.setup_logging()
    logger.debug("This is a debug message ...")

我觉得不错,其他人可能会推荐更好的方法。