import logging


logging的作用类似于print,但是比print好用。

需要导入的包

import logging

级别

logging日志可以认为有5个级别:debug,info,warning,error,critical,默认输出级别是warning,说明只有warning及以上的级别的信息才会被打印出来。

logging.debug("debug")
logging.info("information")
logging.warning("warning")
logging.error("error")
logging.critical("critical")

输出:

WARNING:root:warning
ERROR:root:error
CRITICAL:root:critical

调整打印级别等信息用logging.basicConfig()

logging.basicConfig(level=logging.DEBUG)
logging.debug("debug")
logging.info("information")
logging.warning("warning")
logging.error("error")
logging.critical("critical")

这样debug及以上级别的信息都可以会被打印

logging.basicConfig()

该函数除了可以用level参数调整信息打印级别,还可以调整信息不输出到控制台,输出到文件里,利用参数filename。好处:每次运行的日志信息都可以保留。
比如:相关信息写入到文件train.log中

logging.basicConfig(level=logging.DEBUG, filename="./train.log")

当前目录下的train.log文件,每一次的运行结果以追加方式写入train.log里,因为filemode参数默认是追加a(append的意思)。
如果每次要把之前的日志信息清空,重新写入新的信息到train.log,只需修改filemode参数为w。

logging.basicConfig(level=logging.DEBUG, filename="train.log", filemode='w')

参数format可以调整日志输出的格式,常用的格式

logging.basicConfig(level=logging.DEBUG,
                    format='[%(asctime)s %(filename)s] line %(lineno)d: %(levelname)s %(message)s',
                    datefmt='%Y-%m-%d %H:%M:%S')

lineno表示文件filename中第几行代码输出的日志信息,levelname日志级别,message打印的信息内容。
输出:

[2023-11-27 21:58:44 test.py] line 6: DEBUG debug
[2023-11-27 21:58:44 test.py] line 7: INFO information
[2023-11-27 21:58:44 test.py] line 8: WARNING warning
[2023-11-27 21:58:44 test.py] line 9: ERROR error
[2023-11-27 21:58:44 test.py] line 10: CRITICAL critical

同时在控制台和文件写入日志

  1. 实例化记录器logger,记录器默认名字root,这里设置为train_log;设置记录器输出日志的级别
# 实例化记录器
logger = logging.getLogger(name="train_log")
# 设置记录器的日志级别,大于等于该级别的日志才会输出到控制台或文件
logger.setLevel(logging.INFO)
  1. 创建2个处理器handler,一个用于输出到控制台,一个用于输出到文件;设置处理器输出日志的级别,不设置就和记录器logger一样,如果设置了,日志信息先经过logger筛,再经过处理器筛。(处理器类型很多,不止2种)
# 把日志输出到控制台的handler
consoleHandler = logging.StreamHandler()
consoleHandler.setLevel(logging.DEBUG)  # 所有级别的日志都会输出到控制台

# 把日志输出到文件的handler,输出到当前目录下的train.log文件
fileHandler = logging.FileHandler(filename="./train.log")

把日志输出到文件,默认追加方式(append)写入,如果要覆盖,修改mode参数

fileHandler = logging.FileHandler(filename="./train.log", mode='w')
  1. 创建不同的打印格式formatter
formatter = logging.Formatter(fmt="[%(asctime)s %(filename)s] line %(lineno)d: %(levelname)s %(message)s",
                              datefmt='%Y-%m-%d %H:%M:%S')

simple_fmt = logging.Formatter(fmt = "[%(pathname)s] %(levelname)s %(message)s")
  1. 绑定handler和formatter,绑定logger和handler
# 绑定handler和formatter
consoleHandler.setFormatter(formatter)
fileHandler.setFormatter(simple_fmt)
# 绑定logger和handler
logger.addHandler(consoleHandler)
logger.addHandler(fileHandler)
  1. 打印日志信息,注意不再是logging.debug()
# 要用logger不能用logging
logger.debug("debug")
logger.info("information")
logger.error("error")

补充:过滤器filter

过滤器可以被绑定到logger记录器,也可以绑定到处理器handler。不管绑定到哪里,过滤器就像一个开关一样,当过滤器的名字是logger名字的前缀,开关就为开,否则为关。(假如记录器名字是test.loss.log,过滤器名字为test或者test.loss,那么开关就“开”了)
当过滤器绑定到logger,开关“开”表示这个logger有用于输出日志,开关“关”表示这个记录器不用于输出日志。绑定到handler同理。

# 过滤器绑定到logger记录器
flt = logging.Filter(name="test.loss")  # 相当于开关
logger.addFilter(flt)
# 过滤器绑定到处理器handler
flt = logging.Filter(name="test.loss")  # 相当于开关
consoleHandler.addFilter(flt)

RotatingFileHandler

RotatingFileHandler(filename='train.log',maxBytes=10 * 1024 * 1024, backupCount=5)

日志信息保存到文件名train.log中,maxBytes表示单个文件最大多少个字节,超过了,就备份旧文件,创建新文件。backupCount表示除了train.log还可以有几个备份文件,例如backupCount=5则总共有6个文件(一个train.log,5个备份文件)。
第一个文件名为train.log,但该文件大小达到maxBytes,将旧的文件命名为train.log.1(这就是备份旧文件),创建新文件train.log,这个新文件大小也达到train.log,那么把train.log.1->命名为train.log.2,把train.log->备份为train.log.1,再创建新文件train.log。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值