首页 > 编程语言 >Python日志logging模块

Python日志logging模块

时间:2024-03-02 09:22:23浏览次数:16  
标签:logger2 logger1 logging 输出 Python 日志 message

Python日志logging模块

logging模块架构

日志级别

默认的级别是 “WARNING“,意味着只会追踪该级别及以上的事件。

级别 何时使用
DEBUG 细节信息,仅当诊断问题时适用。
INFO 确认程序按预期运行
WARNING 表明有已经或即将发生的意外(例如:磁盘空间不足)。程序仍按预期进行
ERROR 由于严重的问题,程序的某些功能已经不能正常执行
CRITICAL 严重的错误,表明程序已不能继续执行

涉及到的类

logging采用了模块化设计,主要包含四种组件:

Logger:记录器,提供应用程序代码能直接使用的接口。(类似于笔,使用不同的笔记录不同的日志,例如一个项目里有很多功能模块,每个模块可以设置不同的Logger去记录,然后设置每只笔的不同格式)

Handler:处理器,将记录器产生的日志发送到目的地。(输出到文件或者控制台或者邮件等,一个记录器可以对应多个处理器。)

Filter:过滤器,提供更好的粒度控制,决定哪些日志会被输出。

Formatter:格式化器,设置日志内容的组成结构和消息字段。

img

Logger

有默认的 root logger 和额外声明的 logger。

  1. 提供应用程序的调用接口
logger = logging.getLogger(__name__)
# logger是单例的,也就是__name__不变,获取到的logger都是同一个

2.决定日志记录的级别

logger.setLevel()

3.将日志内容传递到相关联的handlers中

logger.addHandler()
logger.removeHandler()

Handler

将日志写入到不同的位置:

  • StreamHandler #流输出,默认是控制台 stderr

    sh = logging.StreamHandler(stream=None)
    
  • FileHandler #文件记录

    fh = logging.FileHandler(filename,mode='a',encoding=None,delay=False)
    
  • BaseRotatingHandler #标准的分割文件日志

  • RotatingFileHandler #按文件大小记录日志

  • TimeRotatingFileHandler #按时间记录日志

Filter

Filters 可被 HandlersLoggers 用来实现比按层级提供更复杂的过滤操作。我没用过。

Formatter

设置当前Handler对象使用的消息格式。

使用

基本使用

import logging

# 根日志器默认日志级别为WARNING,这里将其重置,以保证debug、info级别的日志也能输出
logging.basicConfig(level=logging.DEBUG #设置日志输出格式
                    ,filename="demo.log" #log日志输出的文件位置和文件名
                    ,filemode="w" #文件的写入格式,w为重新写入文件,默认是追加
                    ,format="%(asctime)s - %(name)s - %(levelname)-9s - %(filename)-8s : %(lineno)s line - %(message)s" #日志输出的格式
                    # -8表示占位符,让输出左对齐,输出长度都为8位
                    ,datefmt="%Y-%m-%d %H:%M:%S" #时间输出的格式
                    )

logging.debug("This is a %s message.",logging.getLevelName(logging.DEBUG))
logging.info("This is an %s message.",logging.getLevelName(logging.INFO))
logging.warning("This is a %s message.",logging.getLevelName(logging.WARNING))
logging.error("This is an %s message.",logging.getLevelName(logging.ERROR))
logging.critical("This is a %s message.",logging.getLevelName(logging.CRITICAL))

logging.log(logging.INFO,"This ia a message from logging.log().") # 也可以这样用

或者为每个记录器自己设置:

import logging
#记录器
logger1 = logging.getLogger("logger1")
logger1.setLevel(logging.DEBUG)

logger2 = logging.getLogger("logger2")
logger2.setLevel(logging.INFO)


#处理器
#1.标准输出
sh1 = logging.StreamHandler()
sh1.setLevel(logging.WARNING)

sh2 = logging.StreamHandler()


# 2.文件输出
# 没有设置输出级别,将用logger1的输出级别(并且输出级别在设置的时候级别不能比Logger的低!!!),设置了就使用自己的输出级别
fh1 = logging.FileHandler(filename="fh.log",mode='w')

fh2 = logging.FileHandler(filename="fh.log",mode='a')
fh2.setLevel(logging.WARNING)

# 格式器
fmt1 = logging.Formatter(fmt="%(asctime)s - %(levelname)-9s - %(filename)-8s : %(lineno)s line - %(message)s")
fmt2 = logging.Formatter(fmt="%(asctime)s - %(name)s - %(levelname)-9s - %(filename)-8s : %(lineno)s line - %(message)s"
                        ,datefmt="%Y/%m/%d %H:%M:%S")

#给处理器设置格式
sh1.setFormatter(fmt1)
fh1.setFormatter(fmt2)

sh2.setFormatter(fmt2)
fh2.setFormatter(fmt1)

#记录器设置处理器
logger1.addHandler(sh1)
logger1.addHandler(fh1)

logger2.addHandler(sh2)
logger2.addHandler(fh2)

#打印日志代码
logger1.debug("This is  DEBUG of logger1 !!")
logger1.info("This is  INFO of logger1 !!")
logger1.warning("This is  WARNING of logger1 !!")
logger1.error("This is  ERROR of logger1 !!")
logger1.critical("This is  CRITICAL of logger1 !!")

logger2.debug("This is  DEBUG of logger2 !!")
logger2.info("This is  INFO of logger2 !!")
logger2.warning("This is  WARNING of logger2 !!")
logger2.error("This is  ERROR of logger2 !!")
logger2.critical("This is  CRITICAL of logger2 !!")

高级使用

上述的方法都写的很死板,在小工程或者单个文件还可以,但是当项目大了,我们就必须使用配置文件的方式配置logging的信息,从而来灵活使用,主要有两种方式去配置,一种是分section的conf文件,一种是JSON字典文件。

import logging.config

logging.config.fileConfig("/path/to/configfile") # 读取conf格式的配置文件
logging.config.dictConfig("/path/to/configfile") # 读取字典格式的配置文件

标签:logger2,logger1,logging,输出,Python,日志,message
From: https://www.cnblogs.com/3to4/p/18048305

相关文章

  • Centos 上安装python3
    1、yum方式安装: 查看yum的python可安装包yumsearchpython安装指定的python版本yuminstallpython3.x86_64-y安装完成:查看安装包的信息:rpm-qa|greppython3 2、编辑安装:下载地址:https://www.python.org/ftp/python/3.11.8/Python-3.11.8.tgz解压......
  • 第二十八:日志服务管理
    一、系统日志介绍在现实生活中,记录日志非常重要﹐比如:银行转账时会有转账记录﹔飞机飞行过程中的黑盒子(飞行数据记录器)记录着飞机的飞行过程.那么将系统和应用发生的事件记录至日志中,也很意义,常可以助于排错和分析使用日志记录的内容包括:历史事件:时间,地点,人物,事件......
  • Python贝叶斯回归分析住房负担能力数据集|附代码数据
    原文链接:http://tecdat.cn/?p=11664最近我们被客户要求撰写关于贝叶斯回归的研究报告,包括一些图形和统计输出。我想研究如何使用pymc3在贝叶斯框架内进行线性回归。根据从数据中学到的知识进行推断 贝叶斯规则是什么? 本质上,我们必须将已经知道的知识与世界上的事实相结合。......
  • Python安装与环境配置
    1.浏览器输入官方网站打开2.根据自己的电脑选择合适的版本,进行下载软件安装。3.选择下载好的版本,鼠标右键选择以管理员身份运行4.勾选AddPythontoPATH,点击Customizeinstallation请尽量勾选AddPython3.8toPATH,这样可以将Python命令工具所在目录添加到系统的环境变量中5.......
  • 我的闲鱼Python爬虫接单总结和经验,最高600元一单
    最近,我在闲鱼上利用Python爬虫技术接了一些任务,想必你一定好奇,通过这样的方式,到底能不能挣钱,能挣多少钱?今天我就来分享一下我的经验和总结。一、接单经历之前Vue的作者尤大在微博上说被动收入是最能带来自由的东西,这个时代的程序员其实在创造被动收入上有天然优势,然而大......
  • Python安装与环境配置
    一、Python安装下载Python安装包,可以从Python官网(https://www.python.org/)下载Python安装包。根据操作系统选择相应的版本,如Windows、Linux或MacOS等。安装Python,安装过程相对简单,只需按照安装向导的提示进行即可。在安装过程中,可以选择将Python添加到系统环境变量中,这样可以在......
  • Python变量的缓存机制
    当然,我会帮你整理这些Python代码并转化为Markdown格式的笔记。以下是你的Markdown笔记:Python变量的缓存机制在Python3.6版本中,对于某些类型的变量,如果它们的值相同,那么它们在内存中的地址(即它们的id)也可能相同。这种现象称为变量的缓存机制。1.整型对于整型而言,-5到正无穷......
  • (笔记)Linux下glog日志库的详细使用方法
     Glog是一个开源的C++日志库,它提供了非常方便的日志记录功能。下面是使用Glog的详细步骤: 一、安装Glog库您可以从Glog的官方网站(https://github.com/google/glog)下载Glog的源代码,然后进行编译和安装。在Linux系统下,您可以使用以下命令安装Glog库:sudoapt-getinstalllibg......
  • 浮木云学习日志(9)---模块统计设计
    ​在SaaS系统中,统计模块是非常重要的一个功能。对于C端产品,可能会展示用户个人使用数据,比如Keep中的锻炼时长统计。虽然这些数据只是供用户了解自己的使用情况,并非必需。然而,在B端的SaaS系统中,由于用户众多且业务复杂,公司管理层需要查看全公司数据和员工绩效情况。因此,SaaS系统必......
  • python列表、集合、字典转换要点以及查找速度区别,如何在大规模数据中实现快速查找
    1.list与set的区别与优缺点:循环速度:list最适合做固定长度的遍历,而且有顺序。set是无序的,list转换为set会乱序,若用set给list去重,转化为list时须用原list的index排序:new_list.sort(key=old_list.index)。所以这种循环尽量用list查询速度:set>list,set查询的key都是ha......