Python-logging模块之配置字典

news2025/2/6 0:48:53

Python-logging模块之配置字典

目录

  1. 介绍
  2. 模版
  3. 功能详情
    • formatters日志格式
    • fitters过滤器
    • handlers日志处理器
    • loggers日志记录器
  4. 字典的加载
  5. 进阶操作
    • 无名loggers
    • 日志轮转

介绍

由于不少小伙伴在使用logging.basicConfig基本日志配置时经常遇到乱码问题,这其实是因为basicConfig作为logging基本配置功能是并不支持修改编码方式的,想要解决该问题只能修改源码,但是这种方式我们是非常不提倡的,而且有很多功能是基本配置模块不能实现的,因此本篇文章将会介绍一种全新的配置方法-----日志配置字典

模版

  • 我们可以将logging模块所需要的各种配置都写在配置字典中,然后我们通过调用该字典让logging模块来使用这里的配置项

  • 该字典模版不需要自己写,在需要使用的时候直接复制过去,你只要知道里面的各个功能该怎么使 用即可

# 日志配置字典
LOGGING_DIC = {
    'version': 1.0,
    'disable_existing_loggers': False,
    # 日志格式
    'formatters': {
        'standard': {
            'format': '%(asctime)s %(threadName)s:%(thread)d [%(name)s] %(levelname)s [%(pathname)s:%(lineno)d] %(message)s',
            'datefmt': '%Y-%m-%d %H:%M:%S',
        },
        'simple': {
            'format': '%(asctime)s [%(name)s] %(levelname)s  %(message)s',
            'datefmt': '%Y-%m-%d %H:%M:%S',
        },
        'test': {
            'format': '%(asctime)s %(message)s',
        }
    },
    'filters': {},
    # 日志处理器
    'handlers': {
        'console_debug_handler': {
            'level': 'DEBUG',  # 日志处理的级别限制
            'class': 'logging.StreamHandler',  # 输出到终端
            'formatter': 'simple'  # 日志格式
        },
        'file_info_handler': {
            'level': 'INFO',
            'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件,日志轮转
            'filename': 'abc.log',
            'maxBytes': 1024 * 1024 * 10,  # 日志大小 10M
            'backupCount': 1000,  # 日志文件保存数量限制
            'encoding': 'utf-8',
            'formatter': 'standard',
        },
        'file_debug_handler': {
            'level': 'DEBUG',
            'class': 'logging.FileHandler',  # 保存到文件
            'filename': 'test.log',  # 日志存放的路径
            'encoding': 'utf-8',  # 日志文件的编码
            'formatter': 'test',
        },
    },
    # 日志记录器
    'loggers': {
        'logger1': {  # 导入时logging.getLogger时使用的app_name
            'handlers': ['console_debug_handler'],  # 日志分配到哪个handlers中
            'level': 'DEBUG',  # 日志记录的级别限制
            'propagate': False,  # 默认为True,向上(更高级别的logger)传递,设置为False即可,否则会一份日志向上层层传递
        },
        'logger2': {
            'handlers': ['console_debug_handler', 'file_debug_handler'],
            'level': 'INFO',
            'propagate': False,
        },
        '': {
            'handlers': ['console_debug_handler', 'file_info_handler'],
            'level': 'INFO',
            'propagate': False,
        },
    }
}

功能详情

指定日志版本号,根据自身实际情况修改即可,一般不用管

'version': 1.0

是否禁用现有的日志记录器,默认False

'disable_existing_loggers': False,

formatters日志格式

formatters日志格式,下面分了三种格式,格式名自己取就可以

 'formatters': {
   	'standard': {...}
    'simple': {...}
    'test': {...}      
 }  
standard

standard标准格式,format即输出内容的格式,可以自行修改

datefmt日期格式,也可以自行修改

'standard': {
            'format': '%(asctime)s %(threadName)s:%(thread)d [%(name)s] %(levelname)s [%(pathname)s:%(lineno)d] %(message)s',
            'datefmt': '%Y-%m-%d %H:%M:%S',
        },
simple和test

simpletest相比于standard就是相对简洁一点,当然这三种格式都可以根据自己实际需求自行修改

'simple': {
            'format': '%(asctime)s [%(name)s] %(levelname)s  %(message)s',
            'datefmt': '%Y-%m-%d %H:%M:%S',
        },
'test': {
            'format': '%(asctime)s %(message)s',
        },

filters过滤器

filters是过滤器,模版中并没有定义实际参数,如果有需求可以根据以下示例修改:

  • '()': 表示指定使用的过滤器类。在这个例子中,过滤器类是 my_module.MyFilter
  • 'parameter': 是过滤器的参数,可以根据实际需求进行设置。在这个例子中,参数值被设置为 'value'
'filters': {
     'myfilter': {
            '()': 'my_module.MyFilter',
            'parameter': 'value'
        }
},

handlers日志处理器

handlersloggers配合使用,handlers是日志处理器,loggers日志记录器负责生产不同级别的日志,然后将日志传给handlers进行处理

'handlers': {...}
'loggers': {...}

日志是输出到控制台,亦或是写入的a文件还是b文件这都是由handlers决定的,我们也可以设置不同的handler做不同的处理,如下:

'handlers': {
    'console_debug_handler': {...},
    'file_info_handler': {...},
    'file_debug_handler': {...},
    'file_deal_handler': {...},
    'file_operate_handler': {...}
},
console_debug_handler

console_debug_handler见名知意,输出到控制台(console)的debug级别的日志处理器

'console_debug_handler': {
    'level': 'DEBUG',  # 日志处理的级别限制,10同理
    'class': 'logging.StreamHandler',  # 输出到终端
    'formatter': 'simple'  # 日志格式
},
file_info_handler

file_info_handler见名知意,写入文件的info级别的日志处理器

'file_info_handler': {
    'level': 'INFO',
    'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件,日志轮转
    'filename': 'log.log', 	 # 日志存放路径
    'maxBytes': 800,  		 # 日志大小 10M
    'backupCount': 3,  		 # 日志文件保存数量限制
    'encoding': 'utf-8', 	 # 日志文件编码
    'formatter': 'standard', # 日志格式
file_debug_handler
'file_debug_handler': {
    'level': 'DEBUG',
    'class': 'logging.FileHandler',  # 保存到文件
    'filename': 'test.log',  		 # 日志存放路径
    'encoding': 'utf-8',    		 # 日志文件编码
    'formatter': 'test', 			 # 日志格式
},

loggers日志记录器

  • 刚刚的handlers仅仅是负责处理日志,真正产生日志的是loggers,比如logger1中handlers参数就是指定将日志交给哪个处理器处理

  • level中的日志级别和handlers中并不冲突,因为前者限制的是产生的日志,而后者则会再次根据自己的限制进行过滤

'loggers': {
    'logger1': {  # 导入时logging.getLogger时使用的app_name
        'handlers': ['console_debug_handler'],  # 日志分配到哪个handlers中
        'level': 'DEBUG',  # 日志记录的级别限制
        'propagate': False,  # 默认为True,向上(更高级别的logger)传递,设置为False即可,否则会一份日志向上层层传递
    },
  • logger2则是将日志丢给了两个不同的handlers,这样就可以即输出到终端,也写入到日志
'logger2': {
    'handlers': ['console_debug_handler', 'file_debug_handler'],
    'level': 'INFO',
    'propagate': False,
},

字典的加载

import logging

需要注意的是logging本身是一个包,而logging下面有一个子包叫作config,而我们不能直接logging.config这样会报错

正确的导入方式是:

import logging.config

接下来我们就可以使用logging模块了,首先将配置字典载入模块中

# 使用配置字典
logging.config.dictConfig(LOGGING_DIC)  # 自动加载字典中的配置

获取日志记录器

log1 = logging.getLogger('logger1')

接下来就可以对日志进行各种操作了

import logging.config

logging.config.dictConfig(LOGGING_DIC)
log1 = logging.getLogger('logger1')

info = "张三今天取款1000元"
log1.debug(info)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

进阶操作

无名loggers

当你想要调用同一个handlers并且需要实现的功能相同时,为了避免代码冗余,只需要创建一个无名的loggers即可

例如:

'': {
    'handlers': ['console_debug_handler', 'file_info_handler'],
    'level': 'INFO',
    'propagate': False,
},

这个loggers并没有命名,你可以在调用getLogger时使用任意名称,当logging模块在检索字典时没有找到其对应的loggers时会自动调用无名loggers并且命名为你所输入的参数

比如我想创建一个’用户取款’的loggers,但是可以看到我的字典中并没有该模块,而此时我依然可以执行程序image-20231226164520828

image-20231226170630518

并且自动调用无名loggers

image-20231226164551773

日志轮转

由于谁也不知道记录的日志会在什么时候突然有用,因此我们为了在不删除日志的前提下避免占用过多内存,引入新的概念-----日志轮转

'file_info_handler': {
    'level': 'INFO',
    'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件,日志轮转
    'filename': 'info_level.log',
    'maxBytes': 1024 * 1024 * 10,  # 日志大小 10M
    'backupCount': 1000,  # 日志文件保存数量限制
    'encoding': 'utf-8',
    'formatter': 'standard',
},
  • 日志轮转模块的意思就是当info_level.log文件大小超过10MB时自动将其改名为info_level1.loginfo_level2.log

  • 当创建的文件数量超过backupCount设定的值时就会自动删除之前的文件

'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件,日志轮转
'maxBytes': 1024 * 1024 * 10,  # 日志大小 10M
'backupCount': 1000,  # 日志文件保存数量限制

雷区

tter’: ‘standard’,
},


- 日志轮转模块的意思就是当`info_level.log`文件大小超过10MB时自动将其改名为`info_level1.log`、`info_level2.log`...

- 当创建的文件数量超过`backupCount`设定的值时就会自动删除之前的文件

```python
'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件,日志轮转
'maxBytes': 1024 * 1024 * 10,  # 日志大小 10M
'backupCount': 1000,  # 日志文件保存数量限制

雷区

设置日志轮转的文件千万不要和其他handlers创建的文件重名,否则会报错

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

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

相关文章

Flamingo与亚马逊云科技合作,进一步优化海外客户的访问体验

据中国海关统计,2023年上半年,我国跨境电商进出口规模约1.1万亿元,比上年同期(下同)增长16.6%,增速加快13.7个百分点。其中,出口约8254亿元,增长20.6%,占同期我国出口总值…

分支限界法求解01背包(优先队列)【java】

实验内容:运用分支限界法解决0-1背包问题 实验目的:分支限界法按广度优先策略遍历问题的解空间树,在遍历过程中,对已经处理的每一个结点根据限界函数估算目标函数的可能取值,从中选取使目标函数取得极值的结点优先进行广度忧先搜…

xxl-job报错:xxl-job registry fail:The access token is wrong

1、报错信息 .ExecutorRegistryThread : >>>>>>>>>>> xxl-job registry fail, registryParam:RegistryParam{registryGroupEXECUTOR, registryKeyxxl-job-executor-sample, registryValuehttp://192.168.133.1:9999/}, registryResult:Re…

支持二开可定制化的企业电子招标采购系统源码

随着企业的快速发展,招采管理逐渐成为企业运营中的重要环节。为了满足公司对内部招采管理提升的要求,建立一个公平、公开、公正的采购环境至关重要。在这个背景下,我们开发了一款电子招标采购软件,以最大限度地控制采购成本&#…

Pandas 数据处理入门

Python的Pandas库是数据科学家和分析师的神器。在本文中,我们将详细探讨如何利用Pandas进行有效的数据处理,包括数据结构的理解、数据的导入、探索和基本处理。 认识Pandas 简要介绍Pandas的重要性安装和导入Pandas库 import pandas as pdPandas数据结…

简单实现通过代码启动 appium server

一、前置说明 总体目录:《从 0-1 搭建企业级 APP 自动化测试框架》上节回顾:在 os_util 工具类和方法的实现 中,实现了启动应用程序和查杀进程的一些基本方法。本节目标:简单实现通过代码启动 appium server,代替手动…

【低照度图像增强系列(2)】Retinex(SSR/MSR/MSRCR)算法详解与代码实现

前言 ☀️ 在低照度场景下进行目标检测任务,常存在图像RGB特征信息少、提取特征困难、目标识别和定位精度低等问题,给检测带来一定的难度。 🌻使用图像增强模块对原始图像进行画质提升,恢复各类图像信息,再使用目标检…

云仓酒庄的品牌雷盛红酒LEESON分享干红是纯葡萄酿造的吗?

干红是一种葡萄酒的简称,全称是干型红葡萄酒。葡萄酒按含残糖量分为干型、半干型、半甜型和甜型。无论什么型的酒,只要是葡萄酒,那就是葡萄酿造的。 云仓酒庄的品牌雷盛红酒LEESON分享干红是葡萄酒的一种,而葡萄酒却不止干红一种…

[问题随记]-如何修改网页中input type=file按钮名字

在使用HTML编辑网页的时候经常会出现如下问题&#xff0c;使用<input typefile>的类型控件上传文件按钮的时候&#xff0c;无法对按钮的名字进行修改&#xff0c;如下为解决方案 <input typefile nameBseleFile style"display:none" onchange"iTest.va…

【代码随想录】刷题笔记Day39

前言 下午答疑课过于无聊了&#xff0c;后台在跑代码也写不了作业&#xff0c;再刷点题吧~难得一天两篇 56. 合并区间 - 力扣&#xff08;LeetCode&#xff09; 和之前重叠区间是同个类型&#xff0c;和res里的元素比较&#xff0c;重叠就更新res里最后元素的最右边界 class…

JavaScript 中的双等号(==)和三等号(===)有何不同?何时使用它们?

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;JavaScript篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来JavaScript篇专栏内容:JavaScript-等号区别 目录 和 区别&#xff0c;分别在什么情况使用 一、等于操作符…

Vue与低代码开发:简化前端开发的强力组合

在当下瞬息万变的软件开发领域&#xff0c;前端开发的速率与效益显得尤为关键。为适应市场的不断变迁&#xff0c;开发者们致力于寻求更为快捷、高效的开发模式。因此&#xff0c;Vue框架与低代码开发平台受到了开发者们的高度关注。本文旨在探讨Vue框架与低代码开发的融合&…

如何在水经微图中加载调用长光卫星影像

我们在这里&#xff0c;再来分享长光卫星影像在水经微图中的加载方法。 如何获取地图服务地址 如果你还没有在长光的官网注册&#xff0c;请通过以下地址注册。 https://www.jl1mall.com/rskit/?agentCompanySJZ&agentfangfang 因为&#xff0c;只有注册之后才能获取到…

嵌入式——I2C原理代码结合(干货)看图易懂

学习目标 理解I2C通讯原理理解I2C通讯过程中的信号理解软件I2C实现过程理解硬件I2C的工作内容学习内容 I2C通讯规则 I2C总线包括两根信号线:SDA(串行数据线)和SCL(串行时钟线)。这两根信号线共用一个总线,因此在总线上可以连接多个设备。在I2C总线上,每个设备都有一个唯…

【数据结构】查找与排序

要查询信息&#xff0c;涉及两个问题&#xff1a; 在哪里查&#xff1f;——查找表 怎么查&#xff1f;——查找方法 一.查找 1.查找表的定义&#xff1a; 查找表是由同类型的数据元素构成的集合 2.对查找表的基本操作&#xff1a; 1&#xff09;查询某个数据元素是否在查…

【原创分享】DDR拓扑结构的详细解析

在进行多片DDR设计的时候&#xff0c;通常DDR会存在拓扑结构&#xff0c;下面我们将详细介绍一下各种拓扑结构的区别以以及应用场景。 首先我们先介绍一下&#xff0c;当只存在一片DDR的时候通常是采用点对点的连接方式&#xff0c;点对点的布线方式优点是结构简单&#xff0c…

git之UGit可视化工具使用

一、下载安装UGit 链接&#xff1a;https://pan.baidu.com/s/1KGJvWkFL91neI6vAxjGAag?pwdsyq1 提取码&#xff1a;syq1 二 、使用SSH进行远程仓库连接 1.生成SSH密钥 由于我们的本地 git仓库和 gitee仓库之间的传输是通过SSH加密的&#xff0c;所以我们需要配置SSH公钥。才…

瓷片图绘制教程,R语言ggplot2绘图笔记

瓷片图像地板砖一样&#xff0c;由许多个小格子组成&#xff0c;不用的颜色深浅可以用来表示不同的值&#xff0c;横轴和纵轴可以用来展示不同的位置&#xff0c;二维码图、马赛克图、热图等都有异曲同工之妙。 今天分享一个在R语言中利用ggplot2包绘制瓷片图的方法&#xff0c…

处理器类型简介

转载自&#xff1a;https://www.cnblogs.com/zamely/p/4334979.html 多核处理器也称片上多核处理器&#xff08;Chip Multi-Processor&#xff0c;CMP&#xff09;。 1.多核处理器的流行 多核出现前&#xff0c;商业化处理器都致力于单核处理器的发展&#xff0c;其性能已经…

轻量封装WebGPU渲染系统示例<54>- 表现GLB模型之拱形门

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/material/src/voxgpu/sample/GLBMaterialTest.ts 当前示例运行效果: 此示例基于此渲染系统实现&#xff0c;当前示例TypeScript源码如下: export class GLBMaterialTest {private mRscene new …