Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >一份 Python 日志配置,同时适用于开发和生产环境

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

作者头像
somenzz
发布于 2022-10-25 13:08:01
发布于 2022-10-25 13:08:01
36900
代码可运行
举报
文章被收录于专栏:Python七号Python七号
运行总次数:0
代码可运行

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
from log import logger
logger.info("info")
logger.debug("debug")

终端上打印的信息为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
2022-09-21 06:24:26,036 - INFO - info
2022-09-21 06:24:26,037 - DEBUG - debug

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
❯ 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
代码运行次数:0
运行
AI代码解释
复制
logger.setLevel(logging.INFO)

不方便,需要改进。

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

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DEBUG = true

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from dotenv import load_dotenv
import os

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【数理逻辑】谓词逻辑的等值演算与推理演算 ( 个体词 | 谓词 | 量词 | 谓词逻辑公式 | 两个基本公式 | 命题符号化技巧 | 命题符号化示例 ) ★★
① 个体 来源 : 一阶谓词逻辑 中 , 将 原子命题 分成 主语 和 谓语 , 这里便有了 个体词 与 谓词 的 概念 ;
韩曙亮
2023/03/28
1.4K0
【数理逻辑】谓词逻辑 ( 一阶谓词逻辑公式 | 示例 )
上一篇博客 : 【数理逻辑】谓词逻辑 ( 个体词 | 个体域 | 谓词 | 全称量词 | 存在量词 | 谓词公式 | 习题 )
韩曙亮
2023/03/28
9940
【数理逻辑】谓词逻辑 ( 谓词逻辑基本等值式 | 消除量词等值式 | 量词否定等值式 | 量词辖域收缩扩张等值式 | 量词分配等值式 )
文章目录 一、 消除量词 等值式 二、 量词否定 等值式 三、 量词辖域收缩扩张 等值式 四、 量词分配 等值式 一、 消除量词 等值式 ---- 消除量词等值式 : 有限个体域 D = \{a_1 , a_2 , \cdots , a_n\} , 消除量词 的 等值式 : 有限个体域 消除 全称量词 : \forall x A(x) \Leftrightarrow A(a_1) \land A(a_2) \land \cdots \land A(a_n) 有限个体域 消除 存在量词 : \exist
韩曙亮
2023/03/28
1.5K0
【数理逻辑】谓词逻辑 ( 个体词 | 个体域 | 谓词 | 全称量词 | 存在量词 | 谓词公式 | 习题 )
命题是陈述句 , 其中陈述句由 主语 , 谓语 , 宾语 组成 , 主语宾语就是个体 , 谓语就是谓词 ;
韩曙亮
2023/03/27
2.3K0
谓词逻辑
如: 小明是个小学生 其中,小明 就是个体词, 是个小学生 就是谓词, 说明了客体的性质。 再如: 6 大于 5 其中 6 与 5 为个体词,大于 为谓词,说明了客体间的关系。
yhlin
2023/02/27
1.2K0
【数理逻辑】命题逻辑的等值演算与推理演算 ( 命题逻辑 | 等值演算 | 主合取 ( 析取 ) 范式 | 推理演算 ) ★★
联结词 : 上一篇博客 【数理逻辑】谓词逻辑 ( 个体词 | 个体域 | 谓词 | 全称量词 | 存在量词 | 谓词公式 | 习题 ) 三. 联结词 章节讲解了联结词 ;
韩曙亮
2023/03/28
1.2K0
谓词逻辑归结原理
归结法的基本原理是采用反证法(也称反演推理法)将待证明的表达式(定理)转换成为逻辑公式(谓词公式),然后再进行归结,归结能够顺利完成,证明原公式(定理)是正确的。
yhlin
2023/02/27
2.3K0
谓词逻辑归结原理
【数理逻辑】谓词逻辑 ( 判断一阶谓词逻辑公式真假 | 解释 | 示例 | 谓词逻辑公式类型 | 永真式 | 永假式 | 可满足式 | 等值式 )
语法 : 上面两节讲解的是 谓词逻辑 的公式 , 如何 根据陈述句描述写出公式 , 是 语法 范畴 ;
韩曙亮
2023/03/28
1.4K0
离散数学与组合数学-08谓词逻辑
IT从业者张某某
2023/10/16
2660
离散数学与组合数学-08谓词逻辑
离散数学谓词逻辑答案_离散数学逻辑符号
在研究命题逻辑中,原子命题是命题演算中最基本的单位,不再对原子命题进行分解,这样会产生两大缺点:
全栈程序员站长
2022/09/20
1.6K0
离散数学谓词逻辑答案_离散数学逻辑符号
【数理逻辑】命题逻辑 ( 命题与联结词回顾 | 命题公式 | 联结词优先级 | 真值表 可满足式 矛盾式 重言式 )
基于上一篇博客 【数理逻辑】谓词逻辑 ( 个体词 | 个体域 | 谓词 | 全称量词 | 存在量词 | 谓词公式 | 习题 ) ;
韩曙亮
2023/03/28
7270
【数理逻辑】命题逻辑 ( 命题逻辑推理正确性判定 | 形式结构是永真式 - 等值演算 | 从前提推演结论 - 逻辑推理 )
方法一 : 写出推理的 形式结构 , 查看该推理的形式结构是不是 永真式 ; 如果是永真式 , 那么该推理是正确的 ;
韩曙亮
2023/03/28
7980
离散数学-考纲版-02-谓词
离散数学与组合数学-08谓词逻辑 离散数学与组合数学-数理逻辑-02谓词演算及其形式系统 离散数学公式 !符号 代码 含义
IT从业者张某某
2023/10/16
3060
离散数学-考纲版-02-谓词
人工智能之经典逻辑推理
人工智能课程复习笔记专题  人工智能绪论   人工智能之知识表示   人工智能之搜索方法  人工智能之经典逻辑推理  人工智能之专家系统  人工智能之不确定推理方法   人工智能之机器学习
用户7886150
2021/01/29
2.2K0
离散数学与组合数学-数理逻辑-02谓词演算及其形式系统-01个体谓词和量词
等小写字母或字符串表示,称为常元(constants) 个体变元(variables):不确定的个体常用字母
IT从业者张某某
2023/10/16
4760
用Python实现命题逻辑归结推理系统--人工智能
考察 命题逻辑归结推理代码没写GUI,因为不喜欢这玩意,直接在终端中进行人机交互。使用代码之前,请根据自身情况对字符编码、文件路径进行修改代码没有使用什么算法进行优化,姑且这样吧
用户7886150
2021/01/29
2.3K0
【数理逻辑】命题逻辑 ( 等值演算 | 幂等律 | 交换律 | 结合律 | 分配律 | 德摩根律 | 吸收率 | 零律 | 同一律 | 排中律 | 矛盾律 | 双重否定率 | 蕴涵等值式 ... )
基于上一篇博客 【数理逻辑】命题逻辑 ( 命题与联结词回顾 | 命题公式 | 联结词优先级 | 真值表 可满足式 矛盾式 重言式 ) ;
韩曙亮
2023/03/28
1.4K0
人工智能--归结演绎推理的逻辑基础
如果谓词公式P对非空个体域D上的任一解释都取得真值T(F),则称P在D上是永真(永假)的。
用户7886150
2021/01/29
4830
离散数学与组合数学-数理逻辑-02谓词演算及其形式系统
等小写字母或字符串表示,称为常元(constants) 个体变元(variables):不确定的个体常用字母
IT从业者张某某
2023/10/16
3390
离散数学与组合数学-数理逻辑-02谓词演算及其形式系统
人工智能导论:第二章 逻辑与推理
“如果p那么q(p⟶q)”定义的是一种蕴涵关系(即充分条件),也就是命题q 包含着命题p ( p是q的子集)。p不成立相当于p是一个空集,空集可被其他所有集合所包含,因此当p不成立时,“如果p那么q”永远为真,真值表对于为 True。
Here_SDUT
2022/09/19
3.4K0
人工智能导论:第二章 逻辑与推理
推荐阅读
【数理逻辑】谓词逻辑的等值演算与推理演算 ( 个体词 | 谓词 | 量词 | 谓词逻辑公式 | 两个基本公式 | 命题符号化技巧 | 命题符号化示例 ) ★★
1.4K0
【数理逻辑】谓词逻辑 ( 一阶谓词逻辑公式 | 示例 )
9940
【数理逻辑】谓词逻辑 ( 谓词逻辑基本等值式 | 消除量词等值式 | 量词否定等值式 | 量词辖域收缩扩张等值式 | 量词分配等值式 )
1.5K0
【数理逻辑】谓词逻辑 ( 个体词 | 个体域 | 谓词 | 全称量词 | 存在量词 | 谓词公式 | 习题 )
2.3K0
谓词逻辑
1.2K0
【数理逻辑】命题逻辑的等值演算与推理演算 ( 命题逻辑 | 等值演算 | 主合取 ( 析取 ) 范式 | 推理演算 ) ★★
1.2K0
谓词逻辑归结原理
2.3K0
【数理逻辑】谓词逻辑 ( 判断一阶谓词逻辑公式真假 | 解释 | 示例 | 谓词逻辑公式类型 | 永真式 | 永假式 | 可满足式 | 等值式 )
1.4K0
离散数学与组合数学-08谓词逻辑
2660
离散数学谓词逻辑答案_离散数学逻辑符号
1.6K0
【数理逻辑】命题逻辑 ( 命题与联结词回顾 | 命题公式 | 联结词优先级 | 真值表 可满足式 矛盾式 重言式 )
7270
【数理逻辑】命题逻辑 ( 命题逻辑推理正确性判定 | 形式结构是永真式 - 等值演算 | 从前提推演结论 - 逻辑推理 )
7980
离散数学-考纲版-02-谓词
3060
人工智能之经典逻辑推理
2.2K0
离散数学与组合数学-数理逻辑-02谓词演算及其形式系统-01个体谓词和量词
4760
用Python实现命题逻辑归结推理系统--人工智能
2.3K0
【数理逻辑】命题逻辑 ( 等值演算 | 幂等律 | 交换律 | 结合律 | 分配律 | 德摩根律 | 吸收率 | 零律 | 同一律 | 排中律 | 矛盾律 | 双重否定率 | 蕴涵等值式 ... )
1.4K0
人工智能--归结演绎推理的逻辑基础
4830
离散数学与组合数学-数理逻辑-02谓词演算及其形式系统
3390
人工智能导论:第二章 逻辑与推理
3.4K0
相关推荐
【数理逻辑】谓词逻辑的等值演算与推理演算 ( 个体词 | 谓词 | 量词 | 谓词逻辑公式 | 两个基本公式 | 命题符号化技巧 | 命题符号化示例 ) ★★
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验