在日志方面,我的做法是这样的,既打印到终端,又输出到文件,开发环境的级别是 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 文件中,写入一下内容:
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 日志配置,可同时适用于开发和生产环境,如果有帮助,还请点赞、在看支持,欢迎留言讨论。