pytorch之日志模板logging
用Python写代码的时候,在想看的地方写个print xx 就能在控制台上显示打印信息,这样子就能知道它是什么了,但是本人的项目代码我需要看大量的地方或者在一个文件中查看的时候,这时候print就不大方便了,所以Python引入了logging模块来记录我想要的信息。开始简单的了解logging模块吧~
1. logging的优势
python的ogging模块l提供了通用的日志系统,print也可以输入日志,logging相对print来说更好控制输出在哪个地方,怎么输出及控制消息级别来过滤掉那些不需要的信息。logging模块提供了不同的日志级别,并可以采用不同的方式记录日志,比如文件,HTTP GET/POST,SMTP,Socket等,甚至可以自己实现具体的日志记录方式。(一般本人是喜欢把日志信息控制输出到文件里)
logging是python内置的模块,使用的话直接import logging即可
2. 日志级别
级别排序:CRITICAL > ERROR > WARNING > INFO > DEBUG
默认生成的root logger的level是logging.WARNING,低于该级别的就不输出了,当为某个应用程序指定一个日志级别后,应用程序会记录所有日志级别大于或等于指定日志级别的日志信息。
3. logging模块使用方式
logging模块提供了两种记录日志的方式:
(1)第一种方式是使用logging提供的模块级别的函数
(2)第二种方式是使用Logging日志系统的四大组件
logging模块定义的模块级别的常用函数:
函数 | 说明 |
---|---|
logging.debug(msg, *args, **kwargs) | 创建一条严重级别为DEBUG的日志记录 |
logging.info(msg, *args, **kwargs) | 创建一条严重级别为INFO的日志记录 |
logging.warning(msg, *args, **kwargs) | 创建一条严重级别为WARNING的日志记录 |
logging.error(msg, *args, **kwargs) | 创建一条严重级别为ERROR的日志记录 |
logging.critical(msg, *args, **kwargs) | 创建一条严重级别为CRITICAL的日志记录 |
logging.log(level, *args, **kwargs) | 创建一条严重级别为level的日志记录 |
logging.basicConfig(**kwargs) | 对root logger进行一次性配置 |
3.1 第一种方式:使用logging模块定义的模块级别函数
这个真的really简单
import logging
logging.debug("debug_msg")
logging.info("info_msg")
logging.warning("warning_msg")
logging.error("error_msg")
logging.critical("critical_msg")
输出结果:
WARNING:root:warning_msg
ERROR:root:error_msg
CRITICAL:root:critical_msg
默认情况下Python的logging模块将日志打印到了标准输出中,且只显示了大于等于WARNING级别的日志,这说明默认的日志级别设置为WARNING(日志级别等级CRITICAL > ERROR > WARNING > INFO > DEBUG)
默认输出格式为:
日志级别:Logger名称:用户输出消息
并且可以用 logging.basicConfig()函数调整日志级别、输出格式等,上一个简单例子放的代码:
import logging
logging.basicConfig(level=logging.DEBUG,
format="%(asctime)s %(name)s %(levelname)s %(message)s",
datefmt = '%Y-%m-%d %H:%M:%S %a' #注意月份和天数不要搞乱了,这里的格式化符与time模块相同
)
logging.debug("msg1")
logging.info("msg2")
logging.warning("msg3")
logging.error("msg4")
logging.critical("msg5")
输出结果:
2020-11-16 11:37:49 Wed root DEBUG msg1
2020-11-16 11:37:49 Wed root INFO msg2
2020-11-16 11:37:49 Wed root WARNING msg3
2020-11-16 11:37:49 Wed root ERROR msg4
2020-11-16 11:37:49 Wed root CRITICAL msg5
这里仅介绍logging.basicConfig()函数包含的简单参数说明:
参数 | 说明 |
---|---|
filename | 指定日志输出目标文件的文件名(可以写文件名也可以写文件的完整的绝对路径,写文件名日志放执行文件目录下,写完整路径按照完整路径生成日志文件),指定该设置项后日志信心就不会被输出到控制台了 |
format | 指定日志格式字符串,即指定日志输出时所包含的字段信息以及它们的顺序 |
logging模块中定义好的可以用于format格式字符串说明:
函数是一个一次性的简单配置工具使,也就是说只有在第一次调用该函数时会起作用,后续再次调用该函数时完全不会产生任何操作的,多次调用的设置并不是累加操作
第二种使用方式:日志流处理流程
上面简单配置的方法例子中我们了解到了logging.debug()、logging.info()、logging.warning()、logging.error()、logging.critical()(分别用以记录不同级别的日志信息),logging.basicConfig()(用默认日志格式(Formatter)为日志系统建立一个默认的流处理器(StreamHandler),设置基础配置(如日志级别等)并加到root logger(根Logger)中)这几个logging模块级别的函数。
一般采取第二种实现日志记录
第二种是一个模块级别的函数是logging.getLogger([name])(返回一个logger对象,如果没有指定名字将返回root logger)。
logging日志模块四大组件:
日志器(logger)是入口,真正干活儿的是处理器(handler),处理器(handler)还可以通过过滤器(filter)和格式器(formatter)对要输出的日志内容做过滤和格式化等处理操作。
Logger对象最常用的方法分为两类:配置方法 和 消息发送方法:
配置方法:
logger对象配置完成后,可以使用下面的方法来创建日志记录:
日志流处理简要流程
1、创建一个logger
2、设置下logger的日志的等级
3、创建合适的Handler(FileHandler要有路径)
4、设置下每个Handler的日志等级
5、创建下日志的格式
6、向Handler中添加上面创建的格式
7、将上面创建的Handler添加到logger中
8、打印输出logger.debug\logger.info\logger.warning\logger.error\logger.critical
例子 不使用配置文件的方式(StreamHandler):输出到控制台的handler:
import logging
#设置日志内容到/temp/myapp.log文件
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s',
datefmt='%m-%d %H:%M',
filename='/temp/myapp.log',
filemode='w')
#定义一个处理器把INFO日志信息或者更高级别的信息写入到sys.stdderr中
#
console = logging.StreamHandler()
console.setLevel(logging.INFO)
#设置为控制台使用的格式
formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s')
#告诉handler使用这个格式
console.setFormatter(formatter)
#为root logger添加handler
logging.getLogger('').addHandler(console)
# 现在我们可以把日志放在 root logger, 或者其他 logger.
#默认使用的是root logger
logging.info('Jackdaws love my big sphinx of quartz.')
# 定义其他logger
logger1 = logging.getLogger('myapp.area1')
logger2 = logging.getLogger('myapp.area2')
logger1.debug('Quick zephyrs blow, vexing daft Jim.')
logger1.info('How quickly daft jumping zebras vex.')
logger2.warning('Jail zesty vixen who grabbed pay from quack.')
logger2.error('The five boxing wizards jump quickly.')
输出到控制台的结果(log文件无任何信息):
root : INFO Jackdaws love my big sphinx of quartz.
myapp.area1 : INFO How quickly daft jumping zebras vex.
myapp.area2 : WARNING Jail zesty vixen who grabbed pay from quack.
myapp.area2 : ERROR The five boxing wizards jump quickly.
可以看出输入到控制台的信息排除了debug级别的信息
参考:
Python 模块之Logging(四)——常用handlers的使用
Python之路(第十七篇)logging模块