评估 Python 日志记录 YAML 配置文件中的语句

2024-02-29

考虑以下 Python 代码片段loggingYAML 配置文件:

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)

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

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

为什么要经历所有这些麻烦?

我想filename以编程方式确定。我已成功尝试使用普通 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 配置文件。是否可以?

也许我可能需要挖掘dict由。。。生产yaml.safe_load(fd.read())并做一些eval() stuff?


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

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.

请注意以下安全隐患eval荷兰国际集团的配置数据。任意Python代码可以通过将其写入YAML文件来执行!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

评估 Python 日志记录 YAML 配置文件中的语句 的相关文章

随机推荐