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/,作者提到了一个更好的做法。可能有更好的推荐方法。
您必须按照以下方式进行操作。
- 定义
logging.json
文件,如 link 中所述。
- 定义一个名为
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)
- 在main方法中像这样调用上面的文件
LogSetup.setup_logging()
。
我在下面提供了代码片段。
logger = logging.getLogger(name)
if __name__ == '__main__':
LogSetup.setup_logging()
logger.debug("This is a debug message ...")
我觉得不错,其他人可能会推荐更好的方法。
我是新人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/,作者提到了一个更好的做法。可能有更好的推荐方法。 您必须按照以下方式进行操作。
- 定义
logging.json
文件,如 link 中所述。 - 定义一个名为
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)
- 在main方法中像这样调用上面的文件
LogSetup.setup_logging()
。 我在下面提供了代码片段。
logger = logging.getLogger(name)
if __name__ == '__main__':
LogSetup.setup_logging()
logger.debug("This is a debug message ...")
我觉得不错,其他人可能会推荐更好的方法。