python日志类logging的使用

python日志类logging的使用

1.简单使用

下面是简单使用,日志输出到控制台,相当于特殊的print

import logging  # 引入logging模块
# 将信息打印到控制台上
logging.debug(u"debug信息")
logging.info(u"info")
logging.warning(u"warning信息")
logging.error(u"error信息")
logging.critical(u"critical信息")

结果

image-20211008094051222

上面可以看到只有后面三个能打印出来

默认生成的root logger的level是logging.WARNING,低于该级别的就不输出了

级别排序:CRITICAL > ERROR > WARNING > INFO > DEBUG

debug : 最低级,默认不显示。打印全部的日志,详细的信息,通常只出现在诊断问题上

info : 打印info,warning,error,critical级别的日志,确认一切按预期运行

warning : 打印warning,error,critical级别的日志,一个迹象表明,一些意想不到的事情发生了,或表明一些问题在不久的将来(例如。磁盘空间低”),这个软件还能按预期工作

error : 打印error,critical级别的日志,更严重的问题,软件没能执行一些功能

critical : 打印critical级别,一个严重的错误,这表明程序本身可能无法继续运行

另外还有一个级别设置是NOTSET ,是notset、 意思是不设置级别限制,都可以输出。

2.设置日志级别

设置日志级别是logging.DEBUG ,因为debug 是最低级的日志级别,相当于所有日志都可以输出了。

import logging  # 引入logging模块
logging.basicConfig(level=logging.DEBUG)  # 设置日志级别

# 将信息打印到控制台上
logging.debug("debug信息")
logging.info("info")
logging.warning("warning信息")
logging.error("error信息")
logging.critical("critical信息")

结果

image-20211008095045084

3.格式化输出日志

下面代码使用basicConfig接口设置了日志的输出级别,输出格式。输出的地方还是控制台。

import logging  # 引入logging模块
 # logging.basicConfig函数对日志的输出格式及方式做相关配置
# 由于日志基本配置中级别设置为DEBUG,所以一下打印信息将会全部显示在控制台上
logging.basicConfig(level=logging.DEBUG,
                    filename='output.log',
                    datefmt='%Y/%m/%d %H:%M:%S',
                    format='%(asctime)s - %(name)s - %(levelname)s - %(lineno)d - %(module)s - %(message)s')
logger = logging.getLogger(__name__)

logger.info('This is a log info')
logger.debug('Debugging')
logger.warning('Warning exists')
logger.info('Finish')

这里我们指定了输出文件的名称为 output.log,另外指定了日期的输出格式,其中年月日的格式变成了 % Y/% m/% d,另外输出的 format 格式增加了 lineno、module 这两个信息,运行之后便会生成一个 output.log 的文件,内容如下:

image-20211008101742389

当删除filename='output.log', 后结果输出到控制台

image-20211008101836092

常用函数接口解释

函数或类接口说明
Logging.Formatter(fmt)这个类配置了日志的格式,在里面自定义设置日期和时间,输出日志的时候将会按照设置的格式显示内容。
setFormatter()设置Formatter
Logging.LoggerLogger是Logging模块的主体,进行以下三项工作,1.为程序提供记录日志的接口,2判断日志所处级别,并判断是否要过滤,3.根据其日志级别将该条日志分发给不同handler
logger.setLevel(logging.INFO)设置日志级别
Logging.HandlerHandler基于日志级别对日志进行分发,Handler 也可以说是一个对日志进行操作的对象。如设置为WARNING级别的Handler只会处理WARNING及以上级别的日志。
logging.FileHandler(path, mode=‘w’)文件Handler
logging.StreamHandler()控制台Handler,默认使用 StreamHandler
Logger.addHandler()添加一个Handler,Handler 是一个对日志进行操作的对象。可以添加多个不同的Handler分别对应不同的操作。比如一个输出到控制台,一个输出到文件
Logger.removeHandler()删除一个Handler
Logger.addFilter()添加一个Filter,过滤作用
HTTPHandler(host=‘localhost:8001’, url=‘log’, method=‘POST’)httphander
6format常用格式说明
%(levelno)s: 打印日志级别的数值
%(levelname)s: 打印日志级别名称 # (常用)
%(pathname)s: 打印当前执行程序的路径,其实就是sys.argv[0]
%(filename)s: 打印当前执行程序名 # (常用)
%(funcName)s: 打印日志的当前函数
%(lineno)d: 打印日志的当前行号 # (常用)
%(asctime)s: 打印日志的时间 # (常用)
%(thread)d: 打印线程ID
%(threadName)s: 打印线程名称
%(process)d: 打印进程ID
%(message)s: 打印日志信息 # (必要)

4.一个常用的例子和handler的使用

一个完整的使用例子。有两个日志操作器(Handler)。分别是文件输出和控制台输出。

import logging  # 引入logging模块
import os.path
import time
# 第一步,创建一个logger
logger = logging.getLogger()
logger.setLevel(logging.INFO)  # Log等级总开关
# 第二步,创建一个handler,用于写入日志文件
rq = time.strftime('%Y-%m-%d_%Hh-%Mm-%Ss', time.localtime(time.time()))

log_path = 'Logs/'
# 检查是否存在路径,不存在就创建
if not os.path.exists(log_path):
    os.makedirs(log_path)

log_name = log_path + rq + '.log'  # 日志完整路径
logfile = log_name
formatter = logging.Formatter("%(asctime)s %(levelname)s  %(message)s")

#########################################################
# 1.增加一个输出到文件的日志操作者

fh = logging.FileHandler(logfile, mode='w', encoding='utf-8')
fh.setLevel(logging.DEBUG)  # 输出到file的log等级的开关
# 第三步,定义handler的输出格式
fh.setFormatter(formatter)
# 第四步,将logger添加到handler里面
logger.addHandler(fh)


######################################################
# 2.增加一个输出到控制台的日志操作者

# 只要在输入到日志中的第二步和第三步插入一个handler输出到控制台:
# 创建一个handler,用于输出到控制台
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)  # 输出到console的log等级的开关,可以和上面文件的不一样
# 第四步和第五步分别加入以下代码即可
ch.setFormatter(formatter)
logger.addHandler(ch)


# 模拟输出日志
logger.debug('this is a logger debug message')
logger.info('this is a logger info message')
logger.warning('this is a logger warning message')
logger.error('this is a logger error message')
logger.critical('this is a logger critical message')

文件命名结果

image-20211007223622706

文件结果

image-20211007223351666

控制台结果

image-20211007223549779

5 捕获 Traceback 异常信息

如果遇到错误,我们更希望报错时出现的详细 Traceback 信息,便于调试,利用 logging 模块我们可以非常方便地实现这个记录,我们用一个实例来感受一下:

import logging

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

# Formatter
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

# FileHandler
file_handler = logging.FileHandler('result.log')
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)

# StreamHandler
stream_handler = logging.StreamHandler()
stream_handler.setFormatter(formatter)
logger.addHandler(stream_handler)

# Log
logger.info('Start')
logger.warning('Something maybe fail.')
try:
    result = 10 / 0
except Exception:
    logger.error('Faild to get result', exc_info=True)
logger.info('Finished')

这里我们在 error () 方法中添加了一个参数,将 exc_info 设置为了 True,这样我们就可以输出执行过程中的信息了,即完整的 Traceback 信息。 运行结果如下:

2021-10-08 10:27:41,098 - __main__ - INFO - Start
2021-10-08 10:27:41,098 - __main__ - WARNING - Something maybe fail.
2021-10-08 10:27:41,098 - __main__ - ERROR - Faild to get result
Traceback (most recent call last):
  File "D:/PythonCode/DGL/练习/test2.py", line 23, in <module>
    result = 10 / 0
ZeroDivisionError: division by zero
2021-10-08 10:27:41,100 - __main__ - INFO - Finished

可以看到这样我们就非常方便地记录下来了报错的信息,一旦出现了错误,我们也能非常方便地排查。

参考:https://cuiqingcai.com/6080.html

https://www.cnblogs.com/xianyulouie/p/11041777.html

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值