百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

python内置模块logging,日志模块

off999 2024-11-23 20:49 20 浏览 0 评论

一、简介

概要:logging 是python 用于记录日志的标准模块

Logging 模块提供了两种日志记录方式:

  1. 一种方式是使用 Logging 提供的模块级别的函数
  2. 另一种方式是使用 Logging 日志系统的四大组件记录

二、使用

import logging

三、日志级别

日志级别等级排序:critical > error > warning > info > debug,级别越高打印的日志越少,默认级别 warning

级别

级别数值(int)

使用时机

DEBUG

10

详细信息

INFO

20

正常运行过程中产生的一些信息

WARNING

30

警告信息,虽然程序正常运行,但有可能发生错误

ERROR

40

运行出错,程序已经不能执行一些功能了

CRITICAL

50

严重错误,程序已经不能正常运行

  1. logging.debug('Python debug') 打印全部的日志
  2. logging.info('Python info') 正常运行过程中产生的一些信息
  3. logging.warning('Python warning') 警告信息
  4. logging.error('Python Error') 错误信息
  5. logging.critical('Python critical') 严重错误信息
  6. logging.basicConfig() 设置 root 的日志级别,和日志输出格式
/**
*level = logging.DEBUG 日志等级
*format='%(levelname)s:%(message)s' 消息格式
*datefmt='%m/%d/%Y %I:%M:%S %p' 日志时间格式
*filename='test.log' 记录日志到文件
*filemode='w' 文件模式
*/
logging.basicConfig(level,format,datefmt,filename,filemode)

# 显示消息时间
logging.basicConfig(format='%(asctime)s %(message)s')
logging.warning('is when this event was logged.')
logging.basicConfig(format='%(asctime)s %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p')
logging.warning('is when this event was logged.')

# 更改显示消息的格式
logging.basicConfig(format='%(levelname)s:%(message)s',level=logging.DEBUG)
logging.debug('Python message format Debug')
logging.info('Python message format Info')
logging.warning('Python message format Warning')
  1. format参数

属性

格式

描述

asctime

%(asctime)s

日志产生的时间,默认格式为msecs2003-07-0816:49:45,896

msecs

%(msecs)d

日志生成时间的亳秒部分

created

%(created)f

time.tme生成的日志创建时间戳

message

%(message)s

具体的日志信息

filename

%(filename)s

生成日志的程序名

name

%(name)s

日志调用者 (日志记录器的名称)

funcname

%(funcName)s

调用日志的函数名

levelname

%(levelname)s

日志级別( DEBUG,INFO, WARNING, 'ERRORCRITICAL)

levene

%( leveling)s

日志级别对应的数值

lineno

%(lineno)d

日志所针对的代码行号(如果可用的话)

module

%( module)s

生成日志的模块名

pathname

%( pathname)s

生成日志的文件的完整路径

process

% (process)d

生成日志的进程D(如果可用)

processname

%(processname)s

进程名(如果可用)

thread

%(thread)d

生成日志的线程D(如果可用)

relativeCreated

%(relativeCreated)d

输出日志信息时的,自Logger创建以 来的毫秒数

threadname

%( threadname)s

线程名(如果可用)

四、四大组件

  1. 日志器- Logger:logging.getLogger(logger_name),返回Logger 对象
  • logger.setLevel(logging.ERROR) 设置处理器的日志级别
  • logger.addHandler(handler_name) 增加一个处理器
  • logger.removeHandler(handler_name) 删除一个处理器
  • logger.addHandler((filter) 给处理器统一设置过滤器
  • logger.removeFilter((filter) 移除过滤器
import logging

logger = logging.getLogger()

logger.setLevel(logging.DEBUG)

logger.info('Python info') #不会打印,因为logger.setLevel设置的是处理器日志级别
logger.warning('Python warning')
logger.error('Python Error')
logger.critical('Python critical')
  1. 处理器- Handler:处理器 将记录器产生的日志发送至指定的目的地,如:日志输出的位置,比如输出到本地文件,控制台,或者发送至Email
  • logging.StreamHandler(stream=None) 用于把日志信息输出控制台
import logging

logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
stream_handler = logging.StreamHandler()
logger.addHandler(stream_handler)

logger.debug('Python debug')
logger.info('Python info')
logger.warning('Python warning')
logger.error('Python Error')
logger.critical('Python critical')
  • logging.FileHandler(fineName=None) 用于把日志信息输出成文件
import logging

logger = logging.getLogger()
logger.setLevel(logging.WARNING)
file_handler= logging.FileHandler('test.log')
logger.addHandler(file_handler)

logger.debug('Python debug')
logger.info('Python info')
logger.warning('Python warning')
logger.error('Python Error')
logger.critical('Python critical')
  • logging.NullHandler(stream=None) 没有配置其他日志处理程序时使用,避免出现“无处理程序”的警告或错误,它会忽略所有传递给它的日志记录事件,因此不会将日志记录到任何地方
  • handler.setLevel(logging.WARN) 指定日志级别
  • handler.setFormatter(format) 设置日志格式
  • handler.addFilter((filter) 增加一个过滤器,可以增加多个
  • handler.removeFilter(filter) 删除一个过滤器
  1. 过滤器- Filter:过滤日志
  • logging.Filter(name='') name=日志器name
import logging

logger = logging.getLogger('logger')
logger.setLevel(logging.DEBUG)

filter = logging.Filter(name='logger')
filter1 = logging.Filter(name='logger1')

stream_handler = logging.StreamHandler()
logger.addHandler(stream_handler)
stream_handler.addFilter(filter)

file_handler = logging.FileHandler('test.log')
logger.addHandler(file_handler)
file_handler.addFilter(filter1) #test.log 中不会有日志信息

logger.debug('Python debug')
logger.info('Python info')
logger.warning('Python warning')
logger.error('Python Error')
logger.critical('Python critical')
  1. 格式器- Formatter:格式器:指定最终输出中日志记录的格式
  • logging.Formatter(fmt=None, datefmt=None) fmt日志格式同basicConfig中的format,datefmt日期格式打印日期时此参数生效
import logging

logger = logging.getLogger()
logger.setLevel(logging.DEBUG)

stream_handler_format = logging.Formatter('%(levelname)s %(asctime)s %(message)s',datefmt='%Y/%m/%d %H:%M:%S')
stream_handler = logging.StreamHandler()
logger.addHandler(stream_handler)
stream_handler.setFormatter(stream_handler_format )

file_handler_format = logging.Formatter('%(levelname)s %(message)s',datefmt='%Y/%m/%d %H:%M:%S')
file_handler = logging.FileHandler('test.log') # file_handler_format中虽然设置了日期格式,日志格式中并没有打印日期,所以datefmt不会生效
logger.addHandler(file_handler)
file_handler.setFormatter(file_handler_format)

logger.debug('Python debug')
logger.info('Python info')
logger.warning('Python warning')
logger.error('Python Error')
logger.critical('Python critical')
  1. 自定义过滤函数
import logging

class Filter(logging.Filter):
    def __init__(self,name):
        super().__init__()
        self.name = name
    def filter(self, record):
        print('日志名称:',record.name)
        print('日志等级名称:', record.levelname)
        print('日志等级号:', record.levelno) #logging.DEBUG
        print('日志执行文件名:', record.filename)
        print('日志message:', record.msg)
        print('日志参数:', record.args)
        print('日志创建时间戳:', record.created)
        print('日志执行文件路径', record.pathname)
        print('日志进程ID', record.process)
        print('日志进程名字', record.processName)
        return True if self.name == 'streamHandle' else False #控制是否打印日志条件


logger = logging.getLogger('logger')
logger.setLevel(logging.DEBUG)

filter = logging.Filter(name='logger')
filter1 = logging.Filter(name='logger1')

stream_handler = logging.StreamHandler()
logger.addHandler(stream_handler)
stream_handler.addFilter(Filter('streamHandle'))

file_handler = logging.FileHandler('test.log')
logger.addHandler(file_handler)
file_handler.addFilter(Filter('fileHandler')) #test.log 中不会有日志信息

logger.debug('Python debug')
logger.info('Python info')
logger.warning('Python warning')
logger.error('Python Error')
logger.critical('Python critical')

五、配置日志

  1. logging.conf 配置文件
  • [loggers]:指定了所有日志器(logger)的名称
  • [handlers]:指定了所有处理器(handler)的名称
  • [formatters]:指定了所有格式化器(formatter)的名称
  • [logger_]:为每个日志器指定级别、处理器和其他属性
  • [handler_]:为每个处理器指定类、级别、格式化器等
  • [formatter_]:为每个格式化器指定格式和日期格式

[loggers]
keys=root,simpleHandler,fileHandler #loggers名称集合,logging.getLogger 中的name参数,默认root

[handlers]
keys=printSimpleHandler,printFileHandler #处理器名称集合

[formatters]
keys=simpleFormatter,fileFormatter #日志格式化名称集合

[logger_root] # loggers=root日志配置
level=DEBUG #日志等级
handlers=printSimpleHandler,printFileHandler #该日志下运行的处理器

[logger_simpleHandler] # loggers=simpleHandler日志配置
level=DEBUG #日志等级
handlers=printSimpleHandler #该日志下运行的处理器
qualname=simpleHandler
propagate=0 #日志记录器的传播设置。

[logger_fileHandler] # loggers=fileHandler日志配置
level=DEBUG #日志等级
handlers=printFileHandler #该日志下运行的处理器
qualname=fileHandler
propagate=0

[formatter_simpleFormatter] # formatters=simpleFormatter日志格式配置
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s #日志格式
datefmt=%Y/%m/%d %H:%M:%S #日期格式

[formatter_fileFormatter] # formatters=fileFormatter日志格式配置
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s #日志格式
datefmt=%Y-%m-%d %H:%M:%S #日期格式

[handler_printSimpleHandler] # handlers=printSimpleHandler处理器配置
class=StreamHandler #指定处理器,等同于logging.StreamHandler
level=DEBUG #指定日志级别
formatter=simpleFormatter #指定日志格式
args=(sys.stdout,) #处理器参数

[handler_printFileHandler] # handlers=printFileHandler处理器配置
class=FileHandler #指定处理器,等同于logging.FileHandler
level=DEBUG #指定日志级别
formatter=fileFormatter #指定日志格式
args=('test.log',) #处理器参数


  1. logging.config.fileConfig()
import logging.config
import logging

logging.config.fileConfig(fname='logging.conf')

root_logger = logging.getLogger()

simple_handle_logger = logging.getLogger('simpleHandler')

file_handler_logger = logging.getLogger('fileHandler')

def run_log(logger):
    logger.debug('debug message')
    logger.info('info message')
    logger.warning('warn message')
    logger.error('error message')
    logger.critical('critical message')

run_log(root_logger)
run_log(simple_handle_logger)
run_log(file_handler_logger)
  1. logging.config.dictConfig() 日志配置,与logging.config.fileConfig()区别在于,logging.config.fileConfig()读取的是文件,logging.config.dictConfig用的是字典,把logging.conf 配置文件以字典形式配置,logging.config.dictConfig即可

六、其他方法属性

  1. logging.LoggerAdapter(logger, extra=None):添加额外的上下文信息,返回logger对象
import logging

logger = logging.getLogger()


loggers = logging.LoggerAdapter(logger, {"spider": '2131'})
stream_handler_format  = logging.Formatter('%(levelname)s %(asctime)s %(message)s %(spider)s',datefmt='%Y/%m/%d %H:%M:%S')

stream_handler = logging.StreamHandler()
logger.addHandler(stream_handler)
stream_handler.setFormatter(stream_handler_format )

loggers.warning('Python warning')
loggers.error('Python Error')
loggers.critical('Python critical')

相关推荐

Python开发管理神器--UV 使用教程:从安装到项目管理

UV是一个用Rust编写的高效Python包和项目管理工具,提供了比传统工具更快的速度和更强的功能。本文将指导你如何使用UV从安装到运行一个Python项目。重点:它可以独立安装,可...

python入门-Day 26: 优化与调试(python优化方法)

优化与调试,内容包括处理模型运行中的常见问题(内存、依赖)、调整参数(如最大生成长度),以及练习改进Day25的文本生成结果。我会设计一个结构化的任务,帮助你掌握优化和调试技巧,同时提升模型性能...

Python安装(python安装发生严重错误)

Windows系统1.安装python1.1下载Python安装包打开官方网站:https://www.python.org/downloads/点击"DownloadPython3.1...

UV 上手指南:Python 项目环境/包管理新选择

如果你是一位Python开发者,曾因pipinstall的安装速度而感到沮丧,或者希望Python的依赖管理能够像Node.js那样高效顺滑,那么UV可能正是你所需要的工具。UV...

uv——Python开发栈中的高效全能小工具

每天写Python代码的同学,肯定都离不开pip、virtualenv、Poetry等基础工具,但是对这些工具可能是又恨又离不开。那么有什么好的替代呢,虫虫今天就给大家介绍一个替代他们的小工具uv,一...

使用Refurb让你的Python代码更加优秀

还在担心你写的Python代码是否专业,是否符合规范吗?这里介绍一个Python代码优化库Refurb,使用它可以给你的代码提出更加专业的建议,让你的代码更加的可读,规范和专业。下面简单介绍这个库的使...

【ai】dify+python开发AI八字排盘插件

Dify插件是什么?你可以将Dify插件想象成赋予AI应用增强感知和执行能力的模块化组件。它们使得将外部服务、自定义功能以及专用工具以”即插即用”的简洁方式集成到基于Dify构建的AI...

零基础AI开发系列教程:Dify升级指南

Dify近期发布很是频繁,基本两三天一个版本。值得肯定的是优化和改进了很多问题,但是官方的升级文档有点分散,也有点乱。我这里整理了一个升级文档供大家参考,如果还没有升级到新版本的小伙伴,可以按照我的文...

升级到PyTorch 2.0的技巧总结(如何更新pytorch版本)

来源:DeepHubIMBA本文约6400字,建议阅读12分钟在本文将演示PyTorch2.0新功能的使用,以及介绍在使用它时可能遇到的一些问题。PyTorch2.0发布也有一段时间了,大家...

dify 1.6.0版本发布解读:引入MCP支持与多项核心优化升级指南详解

2025年7月10日,dify发布了1.6.0版本。这是一次功能深度升级与性能优化的综合性更新,标志着dify在技术规范支持、操作体验以及系统稳定性方面迈出了重要的一步。本文将从核心新特性、功能增强、...

Python教程(十四):列表(List)(python列表方法总结)

昨天,我们学习了变量作用域,理解了局部和全局变量的概念。今天,我们将开始探索Python的数据结构,从最常用的**列表(List)**开始。列表是Python中最灵活、最常用的数据结构,它可以存储不同...

Python列表操作(python列表有哪些基本操作)

Python添加列表4分钟阅读在Python操作列表有各种方法。例如–简单地将一个列表的元素附加到for循环中另一个列表的尾部,或使用+/*运算符、列表推导、extend()和i...

Python字符串变形术:replace替换+join连接,10分钟掌握核心操作

字符串替换魔法:replace()实战手册核心价值:一键更新文本内容,精准控制替换范围#基础替换:Python变Javas="hellopython"print(s.re...

python集合set() 数据增册改查统计序循常用方法和数学计算

概念特点定义和创建常用操作集合间的关系集合数学操作集合生成式遍历概念:可变、无序、不重复的序列数据容器特点:无序,不支持下标唯一性,可以删除重复数据可修改定义和创建赋值法:语法:s={x,....

Python列表方法append和extend的区别

在Python编程中,列表是一种非常常用的数据结构。而列表有两个方法append()和extend(),它们看起来有点相似,但实际上有着明显的区别。今天咱们就来好好唠唠这俩方法到底有啥不同。基本区别a...

取消回复欢迎 发表评论: