gpt4 book ai didi

python - 从 Python 日志记录 YAML 配置文件中评估语句

转载 作者:太空宇宙 更新时间:2023-11-03 13:36:35 27 4
gpt4 key购买 nike

考虑以下 Python logging YAML 配置文件片段:

version: 1
formatters:
simple:
format: '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
handlers:
logfile:
class: logging.handlers.TimedRotatingFileHandler
level: DEBUG
filename: some_fancy_import_name.generate_filename_called_error
backupCount: 5
formatter: simple

我想以这种方式加载这个 YAML 配置文件:

with open('logging.yaml', 'r') as fd:
config = yaml.safe_load(fd.read())
logging.config.dictConfig(config)

特别注意 handler 应该写入日志的 filename。在普通的 Python 代码中,我希望 some_fancy_import_name.generate_filename_called_errorlog 生成字符串 'error.log'。总而言之,我想说这个日志记录处理程序应该写入当前目录中的文件 'error.log'

然而,事实并非如此。当我查看当前目录时,我看到一个名为 'some_fancy_import_name.generate_filename_called_errorlog' 的文件。

为什么要经历这些麻烦?

我希望以编程方式确定文件名。我已成功尝试以这种方式使用普通 Python 脚本配置日志记录:

# fancy import name
from os import environ as env

# Programmatically determine filename path
log_location = env.get('OPENSHIFT_LOG_DIR', '.')
log_filename = os.path.join(log_location, 'error')
handler = logging.handlers.TimedRotatingFileHandler(log_filename)

查看如何从环境变量中推断出 log_filename 路径。

我想将其转换为 YAML 配置文件。可能吗?

也许我可能需要深入了解 yaml.safe_load(fd.read()) 生成的 dict 并执行一些 eval() 东西?

最佳答案

您可以添加自定义构造函数并使用特殊标记标记值,以便在加载时执行您的构造函数:

import yaml

def eval_constructor(loader, node):
return eval(loader.construct_scalar(node))

yaml.add_constructor(u'!eval', eval_constructor)

some_value = '123'

config = yaml.load("""
version: 1
formatters:
simple:
format: '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
handlers:
logfile:
class: logging.handlers.TimedRotatingFileHandler
level: DEBUG
filename: !eval some_value
backupCount: 5
formatter: simple
""")

print config['handlers']['logfile']['filename']

这会打印 123,因为值 some_value 有标签 !eval,因此用 eval_constructor 加载>.

注意评估配置数据的安全隐患。任意Python代码写入YAML文件即可执行!

关于python - 从 Python 日志记录 YAML 配置文件中评估语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38571701/

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