gpt4 book ai didi

Python - 避免在函数之间传递记录器引用?

转载 作者:IT老高 更新时间:2023-10-28 20:34:29 25 4
gpt4 key购买 nike

我有一个使用内置 logging 的简单 Python 脚本。

我正在函数内部配置日志记录。基本结构是这样的:

#!/usr/bin/env python
import logging
import ...

def configure_logging():
logger = logging.getLogger("my logger")
logger.setLevel(logging.DEBUG)
# Format for our loglines
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
# Setup console logging
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
ch.setFormatter(formatter)
logger.addHandler(ch)
# Setup file logging as well
fh = logging.FileHandler(LOG_FILENAME)
fh.setLevel(logging.DEBUG)
fh.setFormatter(formatter)
logger.addHandler(fh)
return logger

def count_parrots():
...
logger.debug??

if __name__ == '__main__':
logger = configure_logging()
logger.debug("I'm a log file")
parrots = count_parrots()

我可以从 __main__ 内部调用 logger。但是,如何从 count_parrots() 函数内部调用 logger?像这样处理配置记录器的最 Pythonic 方式是什么?

最佳答案

您既可以使用根(默认)记录器,也可以使用模块级函数logging.debug,...或者在使用它的函数中获取记录器。实际上,getLogger 函数是一个类似工厂的函数,带有一个注册表(类似单例),即它总是为给定的记录器名称返回相同的实例。因此,您只需使用

即可在 count_parrots 中获取您的记录器
logger = logging.getLogger("my logger") 

在开头。但是,约定是为您的记录器使用带点的分层名称。见 http://docs.python.org/library/logging.html#logging.getLogger

编辑:

您可以使用装饰器将日志记录行为添加到您的各个函数中,例如:

def debug(loggername):
logger = logging.getLogger(loggername)
def log_(enter_message, exit_message=None):
def wrapper(f):
def wrapped(*args, **kargs):
logger.debug(enter_message)
r = f(*args, **kargs)
if exit_message:
logger.debug(exit_message)
return r
return wrapped
return wrapper
return log_

my_debug = debug('my.logger')

@my_debug('enter foo', 'exit foo')
def foo(a, b):
return a+b

您可以“硬编码”记录器名称并删除顶级闭包和 my_debug。

关于Python - 避免在函数之间传递记录器引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5974273/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com