gpt4 book ai didi

使用包文件中的 dict 进行 Python 日志记录

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

我有一个配置文件,我可以这样恢复:

path = os.path.dirname(os.path.realpath(__file__)) + '/repository/logging.json'
with open(path, 'r') as file:
logging_config = json.load(file)

dictConfig(logging_config)

它有效,但我关心的是打包项目。采取的最佳实践是什么?使用这样的相对路径是否正确,或者我应该创建一个模块并导入它而不是加载 json 文件?

感谢您的帮助!

最佳答案

我的应用 - 两级配置示例

具有两级配置文件的项目示例:

  • 级别 1:从源/应用程序文件夹 (virtualenv) 读取配置
  • LEVEL 2:从用户HOME读取配置

Python 项目结构

根据引用Packaging and Distributing Projects(现代)Python 项目应具有以下结构。在包目录中,我添加一个 __main__.py 作为主入口点,并添加一个 my_app.ini 用于配置。

这是结构::

my_app
+-- MANIFEST.in
+-- README.rst
+-- setup.py
+-- setup.cfg
src/
\-- my_app/
+-- __init__.py
+-- __main__.py
\-- my_app.ini

项目配置

您必须在 setup.py 中添加 package_data 条目,以将“my_app.ini”包含在您的源代码分发中。

例如,这是一个小的setup.py::

from distutils.core import setup

from setuptools import find_packages

setup(
name='my_app',
version='0.1.0',
url="http://url/to/your/project",
author="My NAME",
author_email="my@email.com",
packages=find_packages("src"),
package_dir={'': 'src'},
package_data={
'my_app': ['my_app.ini'],
},
)

为了向后兼容 Python 2.6,您还需要一个 MANIFEST.in 文件。

例如,我们可以包含所有 *.ini 文件::

include src/my_app/*.ini

要检查您的配置,请运行以下命令::

python setup.py sdist

日志记录的默认配置

my_app.ini 存储日志记录的默认配置。

[formatters]
keys=default

[formatter_default]
format=%(asctime)s:%(levelname)s:%(message)s
class=logging.Formatter

[handlers]
keys=console

[handler_console]
class=logging.StreamHandler
formatter=default
args=tuple()

[loggers]
keys=root

[logger_root]
level=DEBUG
formatter=default
handlers=console

它只有一个记录器(root 记录器),带有默认处理程序和格式化程序。

主要应用

__main__.py 是应用程序的入口点。

这是__main__.py的源代码::

# -*- coding: utf-8 -*-
import logging.config
import os.path

import sys

WIN = sys.platform.startswith('win')


def _posixify(name):
return '-'.join(name.split()).lower()


def get_app_dir(app_name, roaming=True, force_posix=False):
if WIN:
key = roaming and 'APPDATA' or 'LOCALAPPDATA'
folder = os.environ.get(key)
if folder is None:
folder = os.path.expanduser('~')
return os.path.join(folder, app_name)
if force_posix:
return os.path.join(os.path.expanduser('~/.' + _posixify(app_name)))
if sys.platform == 'darwin':
return os.path.join(os.path.expanduser(
'~/Library/Application Support'), app_name)
return os.path.join(
os.environ.get('XDG_CONFIG_HOME', os.path.expanduser('~/.config')),
_posixify(app_name))


def run_my_app():
# LEVEL 1: read the configuration from the sources/application's folder (virtualenv)
ini1_path = os.path.join(os.path.dirname(__file__), "my_app.ini")
logging.config.fileConfig(ini1_path)
logging.info("Starting...")

# LEVEL 2: read the configuration from the user HOME
ini2_path = get_app_dir("MyApp")
logging.debug('Reading configuration from "{ini2_path}...'.format(ini2_path=ini2_path))
try:
logging.config.fileConfig(ini2_path)
except KeyError:
logging.warning('Bad logging configuration in "{ini2_path}...'.format(ini2_path=ini2_path))

logging.info("Running...")


if __name__ == '__main__':
run_my_app()

您可以在 setup.py 中添加此入口点,如下所示::

entry_points={
'console_scripts': [
'my_cmd = my_app.__main__:run_my_app',
],
},

要测试入口点,您可以使用 pip::

安装它
pip install -e .

然后您可以测试您的应用程序::

my_cmd

2016-07-16 15:47:35,613:INFO:Starting...
2016-07-16 15:47:35,613:DEBUG:Reading configuration from "/Users/my_name/Library/Application Support/MyApp...
2016-07-16 15:47:35,613:WARNING:Bad logging configuration in "/Users/my_name/Library/Application Support/MyApp...
2016-07-16 15:47:35,613:INFO:Running...

注意:my_cmd 是在 Mac OSX 中启动的

就是她。

编辑:GitHub 上的项目

参见Ini Cfg Demo

关于使用包文件中的 dict 进行 Python 日志记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38409802/

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