跨文件定义全局变量(python2.7)

该项目展示了如何在Python中实现跨文件的全局变量管理,使用`GlobalVar`类存储配置信息。同时,它演示了日志模块`logging`的使用,通过`set_logger`函数配置日志输出,并利用全局变量`LOG_DIR`指定日志保存路径。此外,还使用`ConfigParser`读取配置文件`env.ini`,并在测试文件中获取并使用这些配置信息。
摘要由CSDN通过智能技术生成

项目目录结构

在这里插入图片描述

跨文件全局变量
  • lib/glo.py
#!/usr/bin/env python2.7
class GlobalVar:
    global_conf_dict = {}


def set_global_conf_dict(key, value):
    GlobalVar.global_conf_dict[key] = value


def get_global_conf_dict(key, value=None):
    try:
        return GlobalVar.global_conf_dict[key]
    except KeyError:
        return value

  • settings.py
import os
from lib import glo


def set_conf():
    base_dir = os.path.dirname(os.path.abspath(__file__))
    conf_dir = os.path.join(base_dir, "conf")
    log_dir = os.path.join(base_dir, "logs")
    # set global var
    glo.set_global_conf_dict("base_dir", base_dir)
    glo.set_global_conf_dict("CONF_DIR", os.path.join(base_dir, "conf"))
    glo.set_global_conf_dict("ENV_CONF", os.path.join(conf_dir, "env.ini"))
    glo.set_global_conf_dict("LOG_DIR", log_dir)

日志定义模块logging
  • lib/logger_format.py
# coding=utf-8
import os
import logging
from logging import handlers
from lib import glo
import settings

settings.set_conf()


def set_logger(file_name):
    logger = logging.getLogger(__name__)
    logger.setLevel(logging.DEBUG)
    log_file_info = file_name + ".INFO"
    log_file_error = file_name + ".ERROR"
    # 获取LOG_DIR全局变量
    log_dir = glo.get_global_conf_dict("LOG_DIR")
    file_name_info = os.path.join(log_dir, log_file_info)
    file_name_error = os.path.join(log_dir, log_file_error)
    # 定义格式
    formatter_info = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s")
    formatter_error = logging.Formatter("%(asctime)s - %(filename)s:%(lineno)d - %(levelname)s - %(message)s")
    # 按日志等级定义日志回滚和控制台显示
    # 判断handler,解决logger封装成函数/方法,如果多次调用,日志重复输出问题
    if not logger.handlers:
        fh_info = handlers.RotatingFileHandler(filename=file_name_info, maxBytes=10 * 1024, backupCount=3)
        fh_error = handlers.RotatingFileHandler(filename=file_name_error, maxBytes=10 * 1024, backupCount=3)
        ch = logging.StreamHandler()
        # 定义日志等级
        ch.setLevel(logging.WARNING)
        fh_info.setLevel(logging.INFO)
        fh_error.setLevel(logging.ERROR)
        # 加载日志格式
        fh_info.setFormatter(formatter_info)
        fh_error.setFormatter(formatter_info)
        ch.setFormatter(formatter_error)
        # 添加到Handler
        logger.addHandler(fh_info)
        logger.addHandler(fh_error)
        logger.addHandler(ch)

    return logger

配置文件读取模块ConfigParser
  • lib/get_conf.py
# coding=utf-8
import settings
from lib import glo
from ConfigParser import ConfigParser

# 载入conf设置
settings.set_conf()
# 读取conf设置
env_conf = glo.get_global_conf_dict("ENV_CONF")


def get_conf(test_name):
    cfg = ConfigParser()
    cfg.read(env_conf)
    sec = cfg.sections()
    kv = {}
    if test_name in sec:
        items = cfg.items(test_name)
        for i in items:
            kv[i[0]] = i[1]

    return kv

demo其它相关文件
  • 配置文件 conf/env.ini
[mysql]
user=root
password=123456
port=3306

[http]
host=192.168.1.1
port=8080
  • 测试文件 tests/test_mysql.py
# coding=utf-8
from lib.logger_format import set_logger
from lib.get_conf import get_conf

logger = set_logger("test_mysql.log")

if __name__ == '__main__':
    mysql = get_conf("mysql")
    user = mysql.get("user")
    passwd = mysql.get("password")
    port = mysql.get("port")

    logger.info("test_info %s", user)
    logger.warn("test warn %s" % passwd)
    logger.error("test_error %s", port)

  • 测试文件 tests/test_http.py
# coding=utf-8
from lib.logger_format import set_logger
from lib.get_conf import get_conf

logger = set_logger("test_http.log")

if __name__ == '__main__':
    http = get_conf("http")
    host = http.get("host", "127.0.0.1")
    port = http.get("port", "80")
    logger.warn("test_warn %s", host)
    logger.error("test_error %s", port)

  • 日志文件目录 logs/

日志文件(lib/logger_format.py 定义自动生成):

logs/test_http.log.ERROR
logs/test_http.log.INFO
logs/test_mysql.log.ERROR
logs/test_mysql.log.INFO

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值