python logging使用指南

Posted ximisu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python logging使用指南相关的知识,希望对你有一定的参考价值。

为什么要使用logging?

比起print,logging更适合使用在项目中。logging可以方便的定制日志的格式,并且提供了日志分级,可以通过设置日志级别来决定哪些级别的日志可以输出。logging还提供了直接输出到文件的功能,logging可以满足大多数框架的日志需求。
 

基础

 
大模块分类:
Logger: 公开程序代码直接使用的接口
Handlers: 将日志发送到适当的目的地。
Filters: 提供了更细粒度的工具来确定输出哪些日志记录。
Formatters: 格式化程序在最终输出中指定日志记录的布局。
 
什么时候适合用logging呢?
执行的任务
最佳日志工具
需要控制台输出的程序
print()
报告程序运行期间的信息,或者错误信息(用于状态监控或错误调查)
loging.info(), (logging.erro()用于细致的调查)
发出特定运行时警告
warning.warn(): 如果报错时,客户端是可以改的。用这个。
logging.warning():如果客户端什么也不做,但还是需要记录信息。
记录异常日志,而不抛出异常(长时运行服务器的异常处理器)
loging.error(), logging.exception(), logging.critical()
 

日志级别:

Debug: 详细日志,,一般用于调查问题。
INFO: 确认用例按照预期的要求运行。
WARNING: 预示意外事件发生,或者将会在近期发生(如磁盘空间不足)。软件仍然正常工作中。
Error: 由于一个严重的问题,软件无法执行某些功能。
CRITICAL: 一个严重的问题,导致整个软件可能不无法正常运行。
 
默认级别是WARNING
 

logging基础使用

 

最简单的例子

logging.warning("test warning")
logging.info("test info")
 

输入日志到文件

logging.basicConfig(filename="testtest.log", level=logging.DEBUG)
logging.debug("test debug info to a file")
logging.info("test info to a file")
logging.warning("test warning to a file")
 
通过命令行配置日志等级
loglevel = "DEBUG"
numeric_level = getattr(logging, loglevel.upper(), None)
if not isinstance(numeric_level, int):
raise ValueError(‘Invalid log level: %s‘ % loglevel)
logging.basicConfig(level=numeric_level)
 
注意事项:
basicConfig总是在第一次调用日志输出之前调用。之后调用日志输出就不再配置了。就算之后直接调用basicConfig也没有用。
这也可以带来另一个福利,只要在一个地方配置好logging后,就算是在其他模块中调用logging,也会输出到相同的地方。
 
使用logging输出变量
logging.warning(‘%s before you %s‘, ‘Look‘, ‘leap!‘)
 
配置输出日志的格式:
logging.basicConfig(format=‘%(asctime)s %(levelname)s %(message)s‘, datefmt=‘%m/%d/%Y %I:%M:%S %p‘)
asctime: 表示日期
datefmt:表示时间格式
levelname: log level的名称
message: 调用logging.warning时输出信息
 
logging支持的属性格式:
 
时间格式化支持,和time.strfime一样。
 
 

logging进阶

 

使用logger name来区分logger

在记录日志时,一个很好的约定是在每个日志记录模块使用一个模块级的日志记录程序
logger = logging.getLogger(__name__)
logger name可以支持层级模式,一看san.pdf就知道它是san的子模块。
默认的logger name是root
 
basicConfig:的默认format是:severity:logger name:message
 
 

handler的应用

handler主要是为了把不同的
使用示例:
-------------------------
logger = logging.getLogger()
logging.basicConfig(format=‘%(asctime)s %(levelname)s %(message)s‘, level=logging.DEBUG)
 
formatter = logging.Formatter(‘%(asctime)s %(levelname)s %(message)s‘)
 
fh = logging.FileHandler("../log/test1.log")
fh.setLevel(logging.WARN)
fh.setFormatter(formatter)
logger.addHandler(fh)
 
debug_fh = logging.FileHandler("debug.log")
debug_fh.setLevel(logging.INFO)
debug_fh.setFormatter(formatter)
 
logger.addHandler(debug_fh)
 
logger.debug("test debug")
logger.info("test info")
logger.warning("test warn")
--------------------------
 
 

Filter的应用

filter,相当于logrecord会经过的地方,可以对所有的日志信息进行更精细化的定制。加了ip后,就可以通过format中的%(ip)-15s来把相应的值输出出来了。
--------------------
import logging
from random import choice
 
class MyFilter(logging.Filter):
IPS = ["10.12.13.233", "22.22.22.22"]
 
def filter(self, record):
record.ip = choice(MyFilter.IPS)
return True
 
if __name__ == ‘__main__‘:
filter = MyFilter()
logger = logging.getLogger()
logging.basicConfig(format="%(asctime)-15s %(ip)-15s %(message)s", level= logging.DEBUG)
 
logger.addFilter(MyFilter())
logger.setLevel(logging.DEBUG)
 
logger.warning("this is the warning info")
logger.critical("???")
--------------------
 

异常日志的捕获

python三的e,不能直接打印出异常日志了。
需要使用
traceback.print_exec()来打印异常日志
traceback.format_exc(): 返回的是字符串,用这个可以把异常信息输出到文件中。
print_exec(file=open("tb.txt", "w+")) 还可以接受file参数直接写入到一个文件中。

以上是关于python logging使用指南的主要内容,如果未能解决你的问题,请参考以下文章

python logging模块使用简介

python Log使用

Python中logging模块的使用,使用loguru替换logging

python使用logging模块实现日志写入

python的logging库使用

python之logging模块的使用