一份 Python 日志配置,同时适用于开发和生产环境

2022-10-25 21:08:01 浏览数 (1)

在日志方面,我的做法是这样的,既打印到终端,又输出到文件,开发环境的级别是 DEBUG,生产环境是 INFO,我最常用的一份配置文件如下:log.py

代码语言:javascript复制
import logging
import os
import time

logger = logging.getLogger()

if not os.path.exists("logs"):
    os.mkdir("logs")
logger = logging.getLogger()
logger.setLevel(logging.INFO)
ch = logging.StreamHandler()
fh = logging.FileHandler(filename=f"logs/log_{time.strftime('%Y%m%d')}.txt")

formatter = logging.Formatter(
    "%(asctime)s - %(module)s - %(funcName)s - line:%(lineno)d - %(levelname)s - %(message)s"
)
formatter2 = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s")
fh.setFormatter(formatter)
ch.setFormatter(formatter2)
logger.addHandler(ch)  # 将日志输出至屏幕
logger.addHandler(fh)  # 将日志输出至文件

这样,在需要打印日志的地方,就可以从 log.py 中导入 logger 来使用:

代码语言:javascript复制
from log import logger
logger.info("info")
logger.debug("debug")

终端上打印的信息为:

代码语言:javascript复制
2022-09-21 06:24:26,036 - INFO - info
2022-09-21 06:24:26,037 - DEBUG - debug

日志文件中的信息比较详细,如下:

代码语言:javascript复制
❯ cat log_20220921.txt
2022-09-21 06:24:26,036 - demo3 - <module> - line:3 - INFO - info
2022-09-21 06:24:26,037 - demo3 - <module> - line:4 - DEBUG - debug

但是每当我需要为不同的环境设置不同的日志级别的时候,就需要修改

代码语言:javascript复制
logger.setLevel(logging.INFO)

不方便,需要改进。

添加配置文件,让同一套代码运行在不同的环境

如果要同一套代码既运行在开发环境,又运行在生产环境,那就需要借助于配置文件,我们把日志的级别写在配置文件中,测试环境的配置文件为 DEBUG,生产环境的级别是 INFO,然后让 log.py 取读取就可以了。

配置文件最方面的,要数 dotenv 这个工具,它是个第三方库,使用之前请先 pip install python-dotenv 安装一下,然后在项目目录中创建一个 .env 文件中,写入一下内容:

代码语言:javascript复制
DEBUG = true

然后就可以这样来访问 .env 中的环境变量了:

代码语言:javascript复制
from dotenv import load_dotenv
import os

load_dotenv()
print(os.getenv("DEBUG"))  # true

最后,我们来修改一下日志配置文件,让它同时适用于开发和生产环境:

代码语言:javascript复制
import logging
import os
import time
from dotenv import load_dotenv

load_dotenv()
logger = logging.getLogger()

if not os.path.exists("logs"):
    os.mkdir("logs")
logger = logging.getLogger()

if os.getenv("DEBUG") == "true":
    # 测试环境
    logger.setLevel(logging.DEBUG)
else:
    # 生产环境
    logger.setLevel(logging.INFO)

ch = logging.StreamHandler()
fh = logging.FileHandler(filename=f"logs/log_{time.strftime('%Y%m%d')}.txt")

formatter = logging.Formatter(
    "%(asctime)s - %(module)s - %(funcName)s - line:%(lineno)d - %(levelname)s - %(message)s"
)
formatter2 = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s")
fh.setFormatter(formatter)
ch.setFormatter(formatter2)
logger.addHandler(ch)  # 将日志输出至屏幕
logger.addHandler(fh)  # 将日志输出至文件

即使没有 .env 文件,上面的代码也可以正常运行,因此你可以引用到自己的项目中。

最后的话

本文分享了一份 Python 日志配置,可同时适用于开发和生产环境,如果有帮助,还请点赞、在看支持,欢迎留言讨论

0 人点赞