python实现自定义日志,支持同时输出到屏幕和文件

devtools/2024/9/24 7:30:16/

目录


日志相信大家都不陌生,不管是开发还是测试运维,多多少少应该都接触过日志。当然啦,软件出问题后,日志是定位问题最有效的手段之一,这就要求有一个好的日志格式,今天分享的就是用python实现自己的日志

自定义日志

如下是一个用python实现的日志
Logger.py

python">import loggingclass Logger(object):level_relations = {'debug': logging.DEBUG,'info': logging.INFO,'warn': logging.WARNING,'error': logging.ERROR,'fatal': logging.FATAL}def __init__(self, filename, level='info', fmt='[%(asctime)s - %(levelname)s] - %(message)s'):self.logger = logging.getLogger()self.logger.setLevel(self.level_relations[level])# 设置日志输出格式formatter = logging.Formatter(fmt)# 写入日志文件fh = logging.FileHandler(filename)fh.setFormatter(formatter)# 输出到屏幕screen = logging.StreamHandler()screen.setFormatter(formatter)# add handler to loggerself.logger.addHandler(fh)self.logger.addHandler(screen)

日志级别

debug级别最低,从debug到fatal,日志级别越来越高,fatal级别最高。当设置日志级别为其中某个(如INFO)时,比它级别低的日志(DEBUG)不会输出。
在这里插入图片描述
在这里插入图片描述

使用自定义日志

1)直接使用

直接将日志类放在python源文件中,如:

python">import loggingclass Logger(object):level_relations = {'debug': logging.DEBUG,'info': logging.INFO,'warn': logging.WARNING,'error': logging.ERROR,'fatal': logging.FATAL}def __init__(self, filename, level='info', fmt='[%(asctime)s - %(levelname)s] - %(message)s'):self.logger = logging.getLogger()self.logger.setLevel(self.level_relations[level])# 设置日志输出格式formatter = logging.Formatter(fmt)# 写入日志文件fh = logging.FileHandler(filename)fh.setFormatter(formatter)# 输出到屏幕screen = logging.StreamHandler()screen.setFormatter(formatter)# add handler to loggerself.logger.addHandler(fh)self.logger.addHandler(screen)if __name__ == '__main__':log = Logger('test.log', level='info')log.logger.info('Test for log')

在这里插入图片描述

2)日志类作为模块使用

推荐使用这种方式,将日志和其他部分的代码分开,降低耦合性。

你可能使用如下的目录结构,将日志类单独放在log目录下,在其他地方如main.py中使用
在这里插入图片描述
注意,log目录下除了日志类,还多了一个__init__.py,如果没有该文件,使用import导入Logger模块时,会报错日志模块无法调用。

python中,__init__py标识了一个目录是python中的包(package),这意味着你可以使用import语句来导入这个目录中的模块或包。‌
该文件中的内容也非常简单
在这里插入图片描述
至此,已经可以在外部使用log目录下的日志类。

单独写一个main.py:

python"># main.py
from log import Loggerif __name__ == '__main__':log = Logger('test.log', level='info')log.logger.info('Test for log')

此时,你也可以把日志模块(log目录)拷贝到Linux下使用,
在这里插入图片描述


http://www.ppmy.cn/devtools/98270.html

相关文章

以简单的例子从头开始建spring boot web多模块项目(二)-mybatis简单集成

继续使用以简单的例子从头开始建spring boot web多模块项目&#xff08;一&#xff09;中的项目进行mybatis集成。 1、pom.xml文件中&#xff0c;增加相关的依赖包的引入&#xff0c;分别是mybatis-spring-boot-starter、lombok、mysql-connector-java 如下&#xff1a; <d…

设计模式六大原则中的里氏替换原则

设计模式六大原则中的里氏替换原则&#xff08;Liskov Substitution Principle, LSP&#xff09;是面向对象设计中一个至关重要的原则&#xff0c;它定义了继承的基本原则和约束&#xff0c;确保子类能够透明地替换父类&#xff0c;而不会破坏系统的正确性和稳定性。以下是对里…

九泰智库 | 医械周刊- Vol.51

⚖️ 法规动态 白内障人工晶体类医用耗材集采落地&#xff0c;平均降幅60% 湖北省自7月10日起实施人工晶体类医用耗材集中带量采购政策&#xff0c;中选产品平均降幅达60%&#xff0c;显著减轻了患者经济负担。此举是国家组织医用耗材采购的一部分&#xff0c;旨在通过集中采购…

【wenet实战】搭建网页版语音识别项目

在Windows克隆项目&#xff0c;处理软连接失败问题 本地搜索开发者模式&#xff0c;点击打开按钮。命令行执行 git config --global core.symlinks true克隆项目到本地 git clone gitgithub.com:wenet-e2e/wenet.git然后就发现软连接生效了&#xff0c;这适合本地自行编译的方…

Docker私人学习笔记

俗话说“好记性不如烂笔头”&#xff0c;编程的海洋如此的浩大&#xff0c;养成做笔记的习惯是成功的一步&#xff01; 此笔记主要是antlr4.13版本的笔记&#xff0c;并且笔记都是博主自己一字一字编写和记录&#xff0c;有错误的地方欢迎大家指正。 一、基础概念&#xff1a;…

【单片机】51单片机中的`data`与`code`关键字详解

文章目录 51单片机中的`data`与`code`关键字详解一、51单片机内存结构概述二、`data`关键字的作用与使用三、`code`关键字的作用与使用四、`data`与`code`的比较与优化建议五、总结`code` 关键字的作用:`const` 关键字的作用:相似性:差异性:51单片机中的data与code关键字详…

二十二、状态模式

文章目录 1 基本介绍2 案例2.1 Season 接口2.2 Spring 类2.3 Summer 类2.4 Autumn 类2.5 Winter 类2.6 Person 类2.7 Client 类2.8 Client 类的运行结果2.9 总结 3 各角色之间的关系3.1 角色3.1.1 State ( 状态 )3.1.2 ConcreteState ( 具体的状态 )3.1.3 Context ( 上下文 )3.…

机器学习:一元线性回归模型

目录 前言 一、讲在前面 1.data.csv&#xff1a; 2.完整代码&#xff1a; 3.运行结果&#xff1a; 二、实现步骤 1.导入库 2.导入数据 3.绘制散点图&#xff08;这步可以省略&#xff09; 4.求特征和标签的相关系数 5.建立并训练线性回归模型 6.检验模型 7.获取线…