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

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

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

在这里插入图片描述

在这里插入图片描述

一、创建日志工厂模块

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

import logging
import osdef 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.mzph.cn/bicheng/29907.shtml

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

相关文章

通义灵码使用笔记

通义灵码使用笔记 通义灵码使用指南代码智能生成⾏级/函数级实时续写自然语言生成代码生成单元测试、代码优化建议、代码注释、代码解释选中代码后,一键触发功能 通义灵码使用指南 通义灵码是一种智能编码助手,可以在你进行编码工作时,为你提…

【ajax基础02】URL详解

目录 一:什么是URL 二:URL组成 协议 ​编辑 域名(在url中必须写) 资源路径 三:URL查询参数 定义: 语法格式: 如何利用axios实现特定数据查询: 语法格式: 案例&#xff1a…

springboot-自动配置

一、自动配置的原理 Spring Boot 的自动配置基于以下几个核心概念: 条件注解 (Conditional Annotations):Conditional 系列注解用于根据特定条件判断是否加载某个配置类或 Bean。 自动配置类 (Auto-configuration Classes):这些类通过 META-…

【耐水好】强耐水UV胶水它的粘接强度和普通UV胶水比如何呢

【耐水好】强耐水UV胶水它的粘接强度和普通UV胶水比如何呢 强耐水UV胶水的粘接强度与普通UV胶水相比,具有显著的优势。以下是详细的比较和归纳: 固化方式: 两者都是通过紫外线(UV)照射进行固化,但强耐水UV…

2024年全球架构师峰会(ArchSummit深圳站)

前言 ArchSummit全球架构师峰会是极客邦科技旗下InfoQ中国团队推出的重点面向高端技术管理者、架构师的技术会议,54%参会者拥有8年以上工作经验。 ArchSummit聚焦业界强大的技术成果,秉承“实践第一、案例为主”的原则,展示先进技术在行业中的…

程序员学CFA——经济学(三)

经济学(三) 总产出、价格水平和经济增长总产出、总收入和总支出总产出、总收入和总支出的概念及联系国内生产总值国内生产总值(GDP)的定义GDP的衡量方法GDP的相关概念GDP的核算方法 总需求、总供给和市场均衡总需求总需求及其假设…

React.FC`<ChildComponentProps>`解释

代码场景 ParentComponent.tsx import React, { useState } from react; import ChildComponent from ./ChildComponent;function ParentComponent() {const [childData, setChildData] useState<string>();const handleChildData (data: string) > { // 可以直接…

MyBatis的缓存功能总结

MyBatis的缓存功能总结 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 1. 缓存概述 MyBatis的缓存功能是为了提高数据库访问效率而设计的。通过缓存&#xff…

Netty中Reactor线程的运行逻辑

Netty中的Reactor线程主要干三件事情&#xff1a; 轮询注册在Reactor上的所有Channel感兴趣的IO就绪事件。 处理Channel上的IO就绪事件。 执行Netty中的异步任务。 正是这三个部分组成了Reactor的运行框架&#xff0c;那么我们现在来看下这个运行框架具体是怎么运转的~~ 这…

【八股系列】怎么处理项目中的异常捕获行为?(js)

文章目录 1. 基本的try-catch-finally结构2. 全局异常处理3. 自定义错误类4. 使用Promise的catch5. 异步函数中的try-catch6. 记录日志7. 用户友好的错误提示 在 JavaScript项目中&#xff0c;合理地处理异常捕获对于提高程序的健壮性和用户体验至关重要。以下是一些关键实践和…

设计模式-结构型-06-桥接模式

1、传统方式解决手机操作问题 现在对不同手机类型的不同品牌实现操作编程&#xff08;比如&#xff1a;开机、关机、上网&#xff0c;打电话等&#xff09;&#xff0c;如图&#xff1a; UML 类图 问题分析 扩展性问题&#xff08;类爆炸&#xff09;&#xff1a;如果我们再…

shell脚本内使用ifconfig命令

脚本在定时任务中没有取出ip&#xff0c;说明ifconfig命令没有执行成功&#xff0c;就是没有找到ifconfig&#xff0c;与PATH环境变量有关&#xff0c;PATH环境变量在/etc/profile文件中设置&#xff0c;而定时任务却是以nologin方式调用脚本&#xff0c;不会加载/etc/profile,…

探讨 MyBatis 特殊 SQL 执行技巧与注意事项

在线工具站 推荐一个程序员在线工具站&#xff1a;程序员常用工具&#xff08;http://cxytools.com&#xff09;&#xff0c;有时间戳、JSON格式化、文本对比、HASH生成、UUID生成等常用工具&#xff0c;效率加倍嘎嘎好用。 程序员资料站 推荐一个程序员编程资料站&#xff1a;…

Zygote进程的理解

Zygote进程是安卓系统的一个重要进程&#xff0c;由init进程创建而来&#xff1b;另外系统里的重要进程&#xff08;system_server等&#xff09;都是由zygote进程fork的&#xff0c;所有的app进程也是由zygote进程fork的。 一、C 里的fork函数 fork是Linux里面创建子进程的函…

电池荷电状态估计SOC?电池管理系统

一、背景 电池荷电状态&#xff08;SOC, State of Charge&#xff09;估计是电池管理系统&#xff08;BMS, Battery Management System&#xff09;的关键功能之一&#xff0c;对于确保电池的安全高效运行至关重要&#xff0c;特别是在电动车、储能系统以及便携式电子设备等领…

LCL滤波器并网逆变器双闭环控制系统仿真

并网逆变器通常采用L滤波器&#xff0c;虽然结构和控制简单&#xff0c;但是随着功率级别的增加&#xff0c;体积重量增大等问题也日益突出。为了解决这个问题&#xff0c;人们开始使用LCL滤波器&#xff0c;这种滤波器在功率较大的场合表现出色。 无源滤波器&#xff0c;又称…

Android使用data uri启动activity或service

设定AndroidManifest.xml 在AndroidManifest.xml文件中&#xff0c;我们可以设定activity或service的data。 <!-- activity定义方式 --> <activityandroid:name".page.main.MainActivity"><intent-filter><action android:name"an…

神经网络模型---ResNet

一、ResNet 1.导入包 import tensorflow as tf from tensorflow.keras import layers, models, datasets, optimizersoptimizers是用于更新模型参数以最小化损失函数的算法 2.加载数据集、归一化、转为独热编码的内容一致 3.增加颜色通道 train_images train_images[...,…

QML语法

文章目录 QML属性 QML QML是一种描述用户界面的声明式语言。它将用户界面分解成一些更小的元素&#xff0c;这 些元素能够结合成一个组件。QML语言描述了用户界面元素的形状和行为。用户界 面能够使用JavaScript来提供修饰&#xff0c;或者增加更加复杂的逻辑。从这个角度来看…

Linux 系统图像化编程GTK入门

环境前期准备 演示环境&#xff1a;Windows 11 Ubuntu 22.04.4 VS Code 前提条件&#xff1a;1、Windows 11 子系统Ubuntu 22.04.4 已经安装图形化界面&#xff0c;如果没有安装请参考文章&#xff1a; windows11子系统Ubuntu 22.04.4子安装图形化界面 2、Ubuntu 22.04.4…