logging 模块是 Python 内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级、日志保存路径、日志文件回滚等;相比 print,具备如下优点:
- 可以通过设置不同的日志等级,在 release 版本中只输出重要信息,而不必显示大量的调试信息;
- print 将所有信息都输出到标准输出中,严重影响开发者从标准输出中查看其它数据;logging
则可以由开发者决定将信息输出到什么地方,以及怎么输出; - 和 print 相比,logging 是线程安全的。
参考文献:参考文章
生成文件名与指定日志时间:
import logging
logging.basicConfig(level=logging.INFO,
format='%(asctime)s %(filename)s %(levelname)s %(message)s',
datefmt='%a %d %b %Y %H:%M:%S',
filename='my.log',
filemode='w')
logging.info('This is a info.')
logging.debug('This is a debug message.')
logging.warning('This is a warning.')
执行结果:
logging.basicConfig(**kwargs):
使用默认格式化程序创建 StreamHandler 并将其添加到根日志记录器中,从而完成日志系统的基本配置。如果没有为根日志程序定义处理程序,debug()、info()、warning()、error()和 critical() 函数将自动调用 basicConfig()。如果根日志记录器已经为其配置了处理程序,则此函数不执行任何操作。
参考参数如下:
format 输出格式详解
%(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: 打印日志信息
再来看看一个简单的例子:
# -*- coding: utf-8 -*-
import logging
logging.debug('debug级别,一般用来打印一些调试信息,级别最低')
logging.info('info级别,一般用来打印一些正常的操作信息')
logging.warning('waring级别,一般用来打印警告信息')
logging.error('error级别,一般用来打印一些错误信息')
logging.critical('critical级别,一般用来打印一些致命的错误信息,等级最高')
执行结果:
```python
ERROR:root:error级别,一般用来打印一些错误信息
CRITICAL:root:critical级别,一般用来打印一些致命的错误信息,等级
最高
因为logging是分级别的,上面5个级别的信息从上到下依次递增,可以通过设置logging的level,使其只打印某个级别以上的信息。因为默认等级是 WARNING,所以只有 WARNING 以上级别的日志被打印出来。如果我们想把debug和info也打印出来,可以使用 basicConfig 对其进行配置:
logging.basicConfig(level=logging.DEBUG)
这样控制台的输出就会包含上面5条所有信息。
下面给出生成csv与txt源码:
handler = logging.FileHandler(“log.csv”)
handler = logging.FileHandler(“log.txt”)
import logging
logger = logging.getLogger(__name__)
logger.setLevel(level = logging.INFO)
handler = logging.FileHandler("log.csv")
handler.setLevel(logging.INFO)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.info("Start print log")
logger.debug("Do something")
logger.warning("Something maybe fail.")
logger.info("Finish")
执行结果:
将日志同时输出到屏幕和日志文件:logger中添加StreamHandler,可以将日志输出到屏幕上。
源码:
import logging
logger = logging.getLogger(__name__)
logger.setLevel(level = logging.INFO)
handler = logging.FileHandler("log.txt")
handler.setLevel(logging.INFO)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
console = logging.StreamHandler()
console.setLevel(logging.INFO)
logger.addHandler(handler)
logger.addHandler(console)
logger.info("Start print log")
logger.debug("Do something")
logger.warning("Something maybe fail.")
logger.info("Finish")
执行结果:
Start print log
Something maybe fail.
Finish
附录
参考:https://www.cnblogs.com/yyds/p/6901864.html
引用文献:
文献1