logging模块


title: logging模块
top: 43
date: 2022-07-26 09:35:46
tags:

  • logging
    categories:
  • python

什么是日志

日志是一种可以追踪某些软件运行时所发生事件的方法。软件开发人员可以向他们的代码中调用日志记录相关的方法来表明发生了某些事情。一个事件可以用一个可包含可选变量数据的消息来描述。此外,事件也有重要性的概念,这个重要性也可以被称为严重性级别(level)。

日志的等级

级别何时使用
DEBUG详细信息,典型地调试问题时会感兴趣。 详细的debug信息。
INFO证明事情按预期工作。 关键事件。
WARNING表明发生了一些意外,或者不久的将来会发生问题(如‘磁盘满了’)。软件还是在正常工作。
ERROR由于更严重的问题,软件已不能执行一些功能了。 一般错误消息。
CRITICAL严重错误,表明软件已不能继续运行了。
NOTICE不是错误,但是可能需要处理。普通但是重要的事件。
ALERT需要立即修复,例如系统数据库损坏。
EMERGENCY紧急情况,系统不可用(例如系统崩溃),一般会通知所有用户。

logging的日志等级

日志等级(level)描述
DEBUG最详细的日志信息,典型应用场景是 问题诊断
INFO信息详细程度仅次于DEBUG,通常只记录关键节点信息,用于确认一切都是按照我们预期的那样进行工作
WARNING当某些不期望的事情发生时记录的信息(如,磁盘可用空间较低),但是此时应用程序还是正常运行的
ERROR由于一个更严重的问题导致某些功能不能正常运行时记录的信息
CRITICAL当发生严重错误,导致应用程序不能继续运行时记录的信息

列表中的日志等级是从上到下依次增高,日志内容依次减少,即DEBUG可以显示所有日志,CRITICAL只能显示自己。

import logging

logging.debug("debug_msg")
logging.info("info_msg")
logging.warning("warning_msg")
logging.error("error_msg")
logging.critical("critical_msg")


"""output
WARNING:root:warning_msg
ERROR:root:error_msg
CRITICAL:root:critical_msg


"""

logging输出日志流程

在这里插入图片描述

Handler类

- BaseRotatingHandler
- Rotating Filehandler    # 滚动的多日志输出,按照时间or其他方式去生成多个日志
- TimedRotatingfilehandler

- Sockethandler
- Dataaramhandler
- Smtphandler
- Sysloghandler
- Nteventloghandler
- Httphandler
- WatchedFilehandler
- Qutelehandler
- Nullhandler

Formatters格式

属性格式描述
asctime%(asctime)s日志产生的时间,默认格式为msecs2003-07-0816:49:45,896
msecs%(msecs)d日志生成时间的亳秒部分
created%(created)ftime.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(如果可用)
threadname%( threadname)s线程名(如果可用)
"""logging packages
Loggers: 记录器,提供应用程序代码能直接使用的接口;
Handlers: 处理器,将记录器产生的日志发送至目的地;
Fiters: 过滤器,提供更好的粒度控制,决定哪些日志会被输出;
Formatters: 格式化器,设置日志的组成结构和消息字段
*****************************
flow charts
1. 创建一个logger并设置默认等级
2. 创建屏幕StreamHandle // 创建文件 FileHandle
3. 设置日志等级
4. 创建formatter // 格式化样式 %( )s
5. 用formatter渲染所有的Handle
6. 将所有Handle加入logger内
7.程序调用logger

"""
import logging
# 记录器
loggerName = 'bgape002.top.pack'
logger = logging.getLogger(loggerName)
logger.setLevel(logging.DEBUG)

# 处理器
consoleHandler = logging.StreamHandler()
consoleHandler.setLevel(logging.DEBUG)  # 未设置,默认使用logger级别
fileHandler = logging.FileHandler(filename='demo02.log', mode='w')
fileHandler.setLevel(logging.WARNING)

# 过滤器
flt = logging.Filter('bgape002.top')  # 如果loggerName不包含bgape002.top前缀,则过滤
logger.addFilter(flt)  # 添加过滤器
# fltconsl = logging.Filter('top')
# fileHandler.addFilter(fltconsl)  # 给fileHandle添加过滤器

# 格式化器
formatter = logging.Formatter('%(asctime)s|%(levelname)8s|%(filename)s[:%(lineno)d]|%(message)s')

# 设置处理器格式
consoleHandler.setFormatter(formatter)
fileHandler.setFormatter(formatter)

# 记录器添加处理器
logger.addHandler(consoleHandler)
logger.addHandler(fileHandler)

name = 'bgape'; age = 28
logger.debug('name %s, age %d, debug', name, age)
logger.info('name %s, age %d, info', name, age)
logger.warning('name %s, age %d, warning' % (name, age))
logger.error('name {}, age {}, error'.format(name, age))
logger.critical(f'name {name}, age {age}, critical')


"""output
2022-07-26 09:59:44,615|   DEBUG|demo02.py[:48]|name bgape, age 28, debug
2022-07-26 09:59:44,615|    INFO|demo02.py[:49]|name bgape, age 28, info
2022-07-26 09:59:44,615| WARNING|demo02.py[:50]|name bgape, age 28, warning
2022-07-26 09:59:44,616|   ERROR|demo02.py[:51]|name bgape, age 28, error
2022-07-26 09:59:44,616|CRITICAL|demo02.py[:52]|name bgape, age 28, critical

"""

logging.config载入配置文件

配置文件类型可支持两种类型

  • 可以由configparse模块解析的配置文件格式

    # logging.conf
    
    [loggers]
    keys=root,bgape
    
    [handlers]
    keys=fileHandler,consoleHandler
    
    [formatters]
    keys=simpleFormatter
    
    [logger_root]
    level=DEBUG
    handlers=consoleHandler
    
    [logger_bgape]
    level=DEBUG
    handlers=fileHandler,consoleHandler
    qualname=bgape
    propagate=0
    
    [handler_consoleHandler]
    class=StreamHandler
    args=(sys.stdout,)
    level=DEBUG
    formatter=simpleFormatter
    
    [handler_fileHandler]
    class=handlers.TimedRotatingFileHandler
    args=('demo03.log','midnight',1,0)
    level=DEBUG
    formatter=simpleFormatter
    
    [formatter_simpleFormatter]
    format=%(asctime)s|%(levelname)8s|%(filename)s[:%(lineno)d]|%(message)s
    datefmt=%Y-%m-%d %H:%M:%S
    
    
    
  • 字典格式,一般以json格式保存在本地

# 配置文件方式处理日志
import logging
import logging.config

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

rootLogger = logging.getLogger()
bgapeLogger = logging.getLogger('bgape')

rootLogger.debug("Debug")
bgapeLogger.debug('Debug.bgape')

a = 'bgape'
try:
    int(a)
except Exception as e:
    # bgapeLogger.error(e)
    bgapeLogger.exception(e)
    
    
"""output
2022-07-26 10:06:21|   DEBUG|demo03.py[:11]|Debug
2022-07-26 10:06:21|   DEBUG|demo03.py[:12]|Debug.bgape
2022-07-26 10:06:21|   ERROR|demo03.py[:19]|invalid literal for int() with base 10: 'bgape'
Traceback (most recent call last):
  File "D:\documents\lang\python\pyBasement\loggingL\demo03.py", line 16, in <module>
    int(a)
ValueError: invalid literal for int() with base 10: 'bgape'

"""

参考链接

[1] Python基础之标准库logging 你还在用print来调试程序吗,OUT啦

[2] 标准库系列:logging 日志打印

  • 20
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值