Python日志模块封装

一、先上结论
对
Python logging模块进行二次封装
# -*- coding:utf-8 -*-
# 作者:IT小学生蔡坨坨
# 博客:caituotuo.top
# 时间:2022/3/16 20:10
# 功能:日志模块封装
import os
import time
import logging
from logging import handlers
from utils.get_path_info import GetPathInfo
class GetLogger(object):
""" 日志封装类 """
@classmethod
def get_logger(cls):
# logger = logging.getLogger(__name__) # 不会打印 HTTP General 信息
log = logging.getLogger()
level_relations = {
'NOTSET': logging.NOTSET,
'DEBUG': logging.DEBUG,
'INFO': logging.INFO,
'WARNING': logging.WARNING,
'ERROR': logging.ERROR,
'CRITICAL': logging.CRITICAL
} # 日志级别关系映射
# 创建日志存放的目录
project_path = GetPathInfo().get_project_path() # get_project_path()获取项目根目录
logs_dir = project_path + "logs"
if os.path.exists(logs_dir) and os.path.isdir(logs_dir):
pass
else:
os.mkdir(logs_dir)
# 日志文件以日期命名
log_file_name = '%s.log' % time.strftime("%Y-%m-%d", time.localtime())
log_file_path = os.path.join(logs_dir, log_file_name)
rotating_file_handler = handlers.TimedRotatingFileHandler(filename=log_file_path,
when='D', # 按天分隔,一天一个文件
interval=30,
encoding='utf-8')
# 日志输出格式
fmt = "%(asctime)s %(levelname)s %(pathname)s %(lineno)d %(message)s"
formatter = logging.Formatter(fmt)
rotating_file_handler.setFormatter(formatter)
# 加上判断,避免重复打印日志
if not log.handlers:
# 控制台输出
console = logging.StreamHandler()
console.setLevel(level_relations["NOTSET"])
console.setFormatter(formatter)
# 写入日志文件
log.addHandler(rotating_file_handler)
log.addHandler(console)
log.setLevel(level_relations['DEBUG'])
return log
if __name__ == '__main__':
logger = GetLogger().get_logger()
logger.debug('调试')
logger.info('信息')
logger.warning('警告')
logger.error('报错')
logger.critical('严重')
二、logging.Formatter自定义日志格式
1. For example
fmt = "%(name)s %(asctime)s %(created)f %(relativeCreated)d %(msecs)d %(levelname)s %(levelno)s %(pathname)s %(filename)s %(module)s %(funcName)s %(lineno)d %(process)d %(thread)d %(threadName)s %(message)s"
formatter = logging.Formatter(fmt)
结果:
root 2022-03-20 03:00:05,449 1647716405.449377 28 449 DEBUG 10 F:/Desktop/qys_priv_open/utils/get_logger.py get_logger.py get_logger <module> 68 7420 3244 MainThread 调试
2. 常用的格式字符串
| 格式字符串 | 作用 | 例如 |
|---|---|---|
| %(name)s | Logger的名称 | root |
%(asctime)s |
打印日志的时间,字符串形式(datetime.datetime.now()的返回值) | 2022-03-20 02:30:12,776(逗号后面是毫秒) |
| %(created)f | 日志打印的时间,用Unix标准地表示时间的浮点数(time.time()的返回值) | 1647715277.792532 |
| %(relativeCreated)d | 输出日志信息的耗时,从Looger创建开始计时,以毫秒为单位 | 35 |
| %(msecs)d | 打印日志的时间的毫秒部分 | 449 |
%(levelname)s |
日志级别,文本形式 | “DEBUG”、“INFO”、“WARNING”、“ERROR”、“CRITICAL” |
| %(levelno)s | 日志级别,数字形式 | DEBUG=10、INFO=20、WARNING=30、ERROR=40、CRITICAL=50 |
%(pathname)s |
调用日志输出函数的模块的完整路径名 | F:/Desktop/qys_priv_open/utils/get_logger.py |
| %(filename)s | 调用日志输入函数的模块的文件名 | get_logger.py |
| %(module)s | 调用日志输出函数的模块名 | get_logger |
| %(funcName)s | 调用日志输出函数的函数名 | <module> |
%(lineno)d |
调用日志输出函数的语句所在的代码行 | 69 |
| %(process)d | 进程ID | 7840 |
| %(thread)d | 线程ID | 6004 |
| %(threadName)s | 线程名 | MainThread |
%(message)s |
输出的日志信息 | 这是一条测试日志 |
原文链接:https://caituotuo.top/11abedfb.html
微信公众号:IT小学生蔡坨坨
Python日志模块封装的更多相关文章
- python日志模块logging
python日志模块logging 1. 基础用法 python提供了一个标准的日志接口,就是logging模块.日志级别有DEBUG.INFO.WARNING.ERROR.CRITICAL五种( ...
- python日志模块的使用
学习一下python的日志模块logging,可以参考如下博客,写得很详细 https://www.cnblogs.com/yyds/p/6901864.html https://www.cnblog ...
- Python日志模块的管理(二)
日志模块可以通过封装一个类,也可以通过配置文件取管理 新建1个log.ini文件 [loggers] keys=root [handlers] keys=fileHandler,streamHandl ...
- python日志模块
许多应用程序中都会有日志模块,用于记录系统在运行过程中的一些关键信息,以便于对系 统的运行状况进行跟踪.在.NET平台中,有非常著名的第三方开源日志组件log4net,c++中,有人们熟悉的log4c ...
- Python 日志模块实例
python 打印对象的所有属性值: def prn_obj(obj): print '\n'.join(['%s:%s' % item for item in obj.__dict__.it ...
- Python日志模块logging用法
1.日志级别 日志一共分成5个等级,从低到高分别是:DEBUG INFO WARNING ERROR CRITICAL. DEBUG:详细的信息,通常只出现在诊断问题上 INFO:确认一切按预期运行 ...
- python日志模块logging学习
介绍 Python本身带有logging模块,其默认支持直接输出到控制台(屏幕),或者通过配置输出到文件中.同时支持TCP.HTTP.GET/POST.SMTP.Socket等协议,将日志信息发送到网 ...
- python日志模块笔记
前言 在应用中记录日志是程序开发的重要一环,也是调试的重要工具.但却很容易让人忽略.之前用flask写的一个服务就因为没有处理好日志的问题导致线上的错误难以察觉,修复错误的定位也很困难.最近恰好有时间 ...
- Python 日志模块详解
前言 我们知道查看日志是开发人员日常获取信息.排查异常.发现问题的最好途径,日志记录中通常会标记有异常产生的原因.发生时间.具体错误行数等信息,这极大的节省了我们的排查时间,无形中提高了编码效率.所以 ...
- Python 日志模块 logging通过配置文件方式使用
vim logger_config.ini[loggers]keys=root,infoLogger,errorlogger [logger_root]level=DEBUGhandlers=info ...
随机推荐
- U盘安装win7提示缺少所需的CD/DVD驱动器设备驱动程序
问题: 最近使用U盘启动盘安装win7,系统弹出提示框: 解决方法: U盘别插在usb3.0的口(蓝色),换成一个usb2.0的口就可以了
- Java并发编程实例--9.使用本地线程变量
并发程序一个重要方面就是共享数据. 这一点在继承了Thread类或实现了Runnable接口的对象中有着特殊的重要性. 如果你创建了一个实现了Runnable接口的类对象并且用这个对象开启了N个线程对 ...
- cf的几道小题
1.E - Fridge 教训:做题的时候,没有想清楚问题,把问题复杂化了 #include <bits/stdc++.h> #define int long long using nam ...
- Feign入门介绍
Feign入门介绍 基本概述 除Feign之外,在Java中经常使用的HTTP客户端组件主要有3个,如下: (1)HttpURLConnection,JDK自带 (2)Apache HttpClien ...
- day04---系统重要文件
系统重要的文件 /etc的重要文件 1./etc/sysconfig/network-scripts/ifcfg-eth0 [root@localhost ~]# cat /etc/sysconfig ...
- SOTIF很快将会取代ISO 26262?为您详细解读SOTIF标准ISO/PAS 21448
SOTIF很快将会取代ISO 26262?为您详细解读SOTIF标准ISO/PAS 21448 根据MES模赛思对其全球客户的问卷调查表明, 尽管有相当一部分的参与者(35%)认为SOTIF在功能安全 ...
- SwitUI初次体验
序言 开年的第一篇文章,今天分享的是SwiftUI,SwiftUI出来好几年,之前一直没学习,所以现在才开始:如果大家还留在 iOS 开发,这们语言也是一个趋势: 目前待业中.... 不得不说已逝的2 ...
- PMP考试计算题汇总
第6章 项目时间管理 本节术语较多.涉及的工具&技术也不少. 主要包括活动定义.活动排序.活动资源估算.活动历时估算.进度制定.进度控制6个子过程. 1.1活动定义:就是对WBS的进一步分解. ...
- React同级组件传值
在React中同级组件本身是没有任何关联的,要想有联系只能通过共同的父组件传值,一个子组件将数据传递到父组件中,父组件接收值再传入另一个子组件中 <!DOCTYPE html> ...
- 【Filament】基于物理的光照(PBR)
1 前言 自定义Blinn Phong光照模型中实现了基础的自定义光照,与现实的光照还是有些差别,本文将实现更逼真的光照效果,即基于物理的光照(PBR). 读者如果对 Filament 不太熟 ...