在Python项目中自定义日志工具

news2025/1/17 21:40:59

在Python项目中自定义日志工具

日志记录是软件开发中的一个关键部分,它可以帮助开发人员调试代码、监控运行状况以及记录重要事件。在Python中,logging 模块提供了强大的日志记录功能。本文将介绍如何创建一个日志工具,使其能够同时将日志输出到文件和控制台,并确保日志文件在项目目录的 log 文件夹中。我们还将解决在PyCharm中查看日志文件乱码的问题。

在这里插入图片描述

在这里插入图片描述

一、创建日志工厂模块

首先,我们创建一个日志工厂模块 log_factory.py。这个模块将定义一个 get_logger 函数,该函数允许用户自定义日志文件的名称,并确保日志文件保存在项目目录的 log 文件夹内。

import logging
import os

def get_logger(name, log_file='my_log.log', log_level=logging.DEBUG, encoding='utf-8'):
    # 定义日志格式
    LOG_FORMAT = "[%(levelname)s] [%(asctime)s] [%(module)s.%(funcName)s] [line:%(lineno)d]: %(message)s"
    
    # 获取项目目录路径
    project_dir = os.path.dirname(os.path.abspath(__file__))
    
    # 创建log文件夹路径
    log_dir = os.path.join(project_dir, 'log')
    
    # 如果log文件夹不存在,则创建它
    if not os.path.exists(log_dir):
        os.makedirs(log_dir)
    
    # 完整的日志文件路径
    log_file_path = os.path.join(log_dir, log_file)

    # 创建一个日志记录器
    logger = logging.getLogger(name)
    logger.setLevel(log_level)  # 设置日志记录器的级别

    # 检查是否已有处理器,避免重复添加处理器
    if not logger.handlers:
        # 创建一个日志格式器
        formatter = logging.Formatter(LOG_FORMAT)

        # 创建文件处理器,指定编码格式
        file_handler = logging.FileHandler(log_file_path, encoding=encoding)
        file_handler.setLevel(log_level)  # 设置文件处理器的级别
        file_handler.setFormatter(formatter)  # 将格式器添加到文件处理器

        # 创建控制台处理器
        console_handler = logging.StreamHandler()
        console_handler.setLevel(log_level)  # 设置控制台处理器的级别
        console_handler.setFormatter(formatter)  # 将格式器添加到控制台处理器

        # 将文件处理器和控制台处理器添加到日志记录器
        logger.addHandler(file_handler)
        logger.addHandler(console_handler)

    return logger

在这个模块中,我们定义了日志格式、创建了日志目录并设置了文件和控制台处理器。我们还确保文件处理器使用UTF-8编码格式,以避免在查看日志时出现乱码。

二、使用日志工厂

在需要记录日志的地方,我们可以简单地导入并使用这个日志工厂。例如,在 main.py 中:

from log_factory import get_logger

# 获取日志记录器,自定义日志文件名
logger = get_logger('my_app_logger', log_file='custom_log.log')

# 示例日志消息
logger.debug("这是一个调试消息")
logger.info("这是一个信息消息")
logger.warning("这是一个警告消息")
logger.error("这是一个错误消息")
logger.critical("这是一个严重错误消息")

通过这种方式,日志文件将被创建在项目目录的 log 文件夹内。如果 log 文件夹不存在,代码会自动创建它。

三、解决PyCharm中日志文件乱码问题

在PyCharm中查看日志文件时,如果出现乱码问题,通常是由于日志文件的编码格式与PyCharm解析文件时的编码格式不一致引起的。我们可以按照以下步骤解决这个问题:

1. 设置日志文件编码

log_factory.py 中,我们已经指定了文件处理器的编码格式为 UTF-8:

file_handler = logging.FileHandler(log_file_path, encoding='utf-8')

2. 在PyCharm中设置文件编码

确保PyCharm中的文件编码设置与日志文件的编码格式一致:

  • 打开日志文件。
  • 在PyCharm窗口的右下角,点击当前文件编码(例如 UTF-8)。
  • 在弹出的菜单中,选择 UTF-8

3. 设置默认编码(可选)

你还可以设置PyCharm的默认文件编码,以确保所有打开的文件都使用相同的编码格式:

  • 进入 File -> Settings(Windows/Linux)或 PyCharm -> Preferences(Mac)。
  • 导航到 Editor -> File Encodings
  • 设置 Global EncodingProject EncodingUTF-8

通过以上步骤,你应该能够在PyCharm中正确显示日志文件而不会出现乱码问题。

结论

通过本文的介绍,你学会了如何创建一个高效的日志工具,将日志同时输出到文件和控制台,并确保日志文件保存在项目目录的 log 文件夹中。我们还解决了在PyCharm中查看日志文件乱码的问题。希望这些内容对你的项目开发有所帮助!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1838532.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【会议征稿,IEEE出版】第四届电气工程与机电一体化技术国际学术会议(ICEEMT 2024,7月5-7)

第四届电气工程与机电一体化技术国际学术会议(ICEEMT 2024)定于2024年7月5-7日在浙江省杭州市隆重举行 。会议主要围绕“电气工程”、“机电一体化” 等研究领域展开讨论,旨在为电气工程、机电一体化等领域的专家学者、工程技术人员、技术研发…

leetcode (top100)接雨水

题目: 题解: 可以把每个宽度看作一个桶,每个桶能接的水等于这个桶左右两个方向最高桶的最小高度再减去这个桶本身的高度。把每个桶能接的水相加即可。 难点在于如何快速找到当前桶的左右两个方向的最高桶的高度,可以先遍历一遍…

Java学习【深入解读File类:从基础到高级的完整指南】

Java学习【深入解读File类:从基础到高级的完整指南】 ⭐File的概述和构造方法⭐File常见的成员方法🌙构造方法🌙length()🌙getAbsoluteFile()和getPath()🌙getName()和lastModified() ⭐文件的创建和删除⭐获取并遍历 …

电脑操作系统有哪些?一文了解全部!

在当今数字化飞速发展的时代,电脑操作系统作为计算机硬件与软件之间的桥梁,扮演着至关重要的角色。它不仅管理着计算机的各项资源,还为用户提供了一个直观、友好的界面,使得用户可以轻松地进行各种操作和任务。那么,电…

【八股系列】介绍React高阶组件,适用于什么场景?

文章目录 1. HOC的工作原理2. 返回的新组件3. 适用场景4. 注意事项5. 示例代码 React高阶组件( Higher-Order Components,简称HOC)是 React中一种高级的 复用组件逻辑的技术。 HOC自身不是 React API的一部分,而是基于 Reac…

Zyxel NAS设备 setCookie 未授权命令注入漏洞复现(CVE-2024-29973)

0x01 产品简介 Zyxel-NAS 是指由 Zyxel Communications Corporation(合勤科技股份有限公司)开发和生产的网络附加存储(Network Attached Storage,简称 NAS)设备。NAS 是一种专门用于存储和共享文件的设备,它通过网络连接到计算机、服务器或其他设备,提供集中式的文件存…

linux最大线程数限制及打开最大文件数

1.root用户下执行 ulimit -a 然后查看 max user processes 这个值通常是系统最大线程数的一半 max user processes:当前用户同时打开的进程(包括线程)的最大个数为 2.普通用户下 ulimit -a 出现的max user processes的值 默认是 /etc/security/limits.d/20-nproc.co…

范式(下)-BC范式(BCNF)、关系模式的规范化

一、关系模式STC 假设有一个关系模式STC,包含有学号Sno、教师编号Tno、课程编号Cno、选课成绩G四个属性 即STC(Sno,Tno,Cno,G) 数据间的关系为 每个学生可选修多门课程,每门课程可以被多名学生选修每个老师只能讲授…

虹科免拆诊断案例 | 15款马自达3偶发高速CAN网络故障

CAN总线大家都不陌生,遇到这类故障,我们第一反应可能是用万用表测一下电压,看看存不存在短路、断路等问题。不过,使用万用表测得的电压值只是CAN总线上的平均电压,是一个大概的数值,并不能反映真实的CAN总线…

用户组相关的一些命令

1./etc/passwd>列出了系统里的所有用户 2./etc/shadow>保存了用户的密码信息 空表示密码为空 *表示账号被在锁定 !表示未设置密码 !!表示这个密码已经过期 $1表示MD5加密, $2表示用Blowfish加密, $5表示用SHA-256加密, $6表示SHA-512加…

关于微信小程序(必看)

前言 为规范开发者的用户个人信息处理行为,保障用户的合法权益,自2023年9月15日起,对于涉及处理用户个人信息的小程序开发者,微信要求,仅当开发者主动向平台同步用户已阅读并同意了小程序的隐私保护指引等信息处理规则…

FANUC喷涂机器人P-350iA电机过热维修解决方案

发那科喷涂机器人作为自动化喷涂生产线的重要组成部分,其性能稳定性和可靠性对于生产效率和产品质量具有重要影响。然而,在实际使用过程中,FANUC喷涂机器人P-350iA电机过热故障问题往往成为影响其正常运行的主要因素之一。 FANUC机器人M-100…

数据库实战(一)(关系数据库设计)

🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀数据库 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目录 前言 练习题 题型一:判断关系…

登录爆破神器:Hydra 保姆级教程

前言 Hydra 是一个广泛使用的网络登录破解工具,支持多种协议(如 HTTP、FTP、SSH、Telnet 等),用于执行暴力破解攻击。它由 Van Hauser 和 The Hackers Choice (THC) 团队开发,设计用于快速和高效地尝试大量用户名和密…

信息技术课如何禁止学生玩游戏

在信息技术课上禁止学生玩游戏是一个常见的挑战,但可以通过一系列策略和工具来有效地实现。以下是一些建议: 明确课堂规则和纪律: (1)在课程开始时,明确告知学生课堂规则和纪律,包括禁止玩游戏的规定。 (2)强调遵守…

创建一个electron桌面备忘录

Sound Of Silence 1.创建electron项目命令: npm create quick-start/electron my-new-project 2选择:√ Select a framework: vue √ Add TypeScript? ... No √ Add Electron updater plugin? ... Yes √ Enable Electron download mirror proxy? .…

记一次生产事故,来来回回搞了一个月

🍅我是小宋,关注我,带你轻松过面试 读源码。提升简历亮点(14个demo) 🌏号:tutou123com。拉你进专属群。 记一次生产事故,来来回回搞了一个月 背景 我们的主要业务是台湾省的一个小…

工业自动化中OBC充电机测试负载箱的应用

在工业自动化中,OBC充电机是电动汽车和混合动力汽车的重要组成部分。它的主要功能是为电动汽车的电池组提供电能,保证车辆的正常运行。为了保证OBC充电机的性能和安全性,通常需要对其进行严格的测试。在这个过程中,负载箱是一种非…

【SQL server速成之路】函数

(3)LEFT函数 LEFT ( character_expression , integer_expression ) 功能:返回从字符串character_expression左边开始,由integer_expression指定个数的字符。参数character_expression:为字符型表达式,integ…

C#的Switch语句2(如何快速中断函数执行)

文章目录 switch语法结构case具体的值枚举值字符串const关键字 如果没有匹配的值default语句不一定要在最后与C的差异-case穿透(Fall-through) 下一篇文章 switch语法结构 基础的语法结构,在上一篇文章已经写了,具体请看&#xf…