前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一份 Python 日志配置,同时适用于开发和生产环境

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

作者头像
somenzz
发布2022-10-25 21:08:01
3140
发布2022-10-25 21:08:01
举报
文章被收录于专栏:Python七号

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-09-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python七号 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 添加配置文件,让同一套代码运行在不同的环境
  • 最后的话
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档