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)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(如果可用) |
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'
"""