为什么不用print打印输出?
1、这种方式对于简单脚本型程序有用,但是如果是复杂的系统,最好不要用。首先,这些print是没用的输出,大量使用很有可能会被遗忘在代码里。
2、print 输出的所有信息都到了标准输出中,这将严重影响到你从标准输出中查看其它输出数据。
使用logging的优势:
1、可以控制消息的级别,过滤掉那些并不重要的消息。
2、可决定输出到什么地方,以及怎么输出。有许多的重要性别级可供选择,debug、info、warning、error 以及 fatal。通过赋予 logger 或者 handler 不同的级别,你就可以只输出错误消息到特定的记录文件中,或者在调试时只记录调试信息。
将日志打印直接输出到屏幕
默认情况下,logging将日志打印到屏幕,日志级别为WARNING;
日志级别大小关系为:CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET,当然也可以自己定义日志级别
import logging
logging.debug('this is debug message')
logging.info('this is info message')
logging.warning('this is warning message')
logging.error('this is error message')
#打印结果:
WARNING:root:this is warning message
ERROR:root:this is error message
通过logging.basicConfig函数对日志的输出格式做相关配置
import logging
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(filename)s[line:%(lineno)s] %(levelname)s %(message)s')
logging.debug('this is debug message')
logging.info('this is info message')
logging.warning('this is warning message')
logging.error('this is error message')
#打印结果:
2021-03-16 11:04:49,221 get_test.py[line:28] DEBUG this is debug message
2021-03-16 11:04:49,221 get_test.py[line:29] INFO this is info message
2021-03-16 11:04:49,221 get_test.py[line:30] WARNING this is warning message
2021-03-16 11:04:49,221 get_test.py[line:31] ERROR this is error message
logging.basicConfig函数各参数:
filename: 指定日志文件名
filemode: 和file函数意义相同,指定日志文件的打开模式,'w'或'a'
format: 指定输出的格式和内容,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: 打印日志信息
datefmt: 指定时间格式,同time.strftime()
level: 设置日志级别,默认为logging.WARNING
stream: 指定将日志的输出流,可以指定输出到sys.stderr,sys.stdout或者文件,默认输出到sys.stderr,当stream和filename同时指定时,stream被忽略
将日志写入到文件
import logging
logging.basicConfig(
level=logging.DEBUG,
filename='text.log',
filemode='w',
format='%(asctime)s %(filename)s[line:%(lineno)s] %(levelname)s %(message)s')
logging.debug('this is debug message')
logging.info('this is info message')
logging.warning('this is warning message')
logging.error('this is error message')
#写入文件text.log:
2021-03-16 11:04:49,221 get_test.py[line:28] DEBUG this is debug message
2021-03-16 11:04:49,221 get_test.py[line:29] INFO this is info message
2021-03-16 11:04:49,221 get_test.py[line:30] WARNING this is warning message
2021-03-16 11:04:49,221 get_test.py[line:31] ERROR this is error message
将日志同时输出到文件和屏幕
# 将日志输出到文件
logger = logging.getLogger()
logger.setLevel(level=logging.INFO)
handler = logging.FileHandler("test.log")
handler.setLevel(level=logging.INFO)
formatter = logging.Formatter('%(asctime)s %(filename)s[line:%(lineno)s] %(levelname)s %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
# 将日志输出到屏幕
console = logging.StreamHandler()
console.setLevel(level=logging.INFO)
console.setFormatter(formatter)
logger.addHandler(console)
#在文件和屏幕都可看到
2021-03-16 11:35:19,162 get_test.py[line:43] INFO this is info message
2021-03-16 11:35:19,162 get_test.py[line:44] WARNING this is warning message
2021-03-16 11:35:19,162 get_test.py[line:45] ERROR this is error message
logging有一个日志处理的主对象,其他处理方式都是通过addHandler添加进去,logging中包含的handler主要有一下几种:
StreamHandler 日志输出到流、可以是sys.stder、sysstdout或者文件
FileHandler logging模块自带的三个handler之一。继承自StreamHandler。将日志信息输出到磁盘文件上
NullHandler 空操作handler,logging模块自带的三个handler之一,没有参数。
WatchedFileHandler 位于logging.handlers模块中。用于监视文件的状态,如果文件被改变了,那么就关闭当前流,重新打开文件,创建一个新的流
RotatingFileHandler 位于logging.handlers支持循环日志文件
TimedRotatingFileHandler 定时循环日志handler,位于logging.handlers,支持定时生成新日志文件
SocketHandler 远程输出日志到TCP/IP
DatagramHandler 远程输出日志到UDP
SMTPHandler 远程输出日志到mail地址
SysLogHandler 日志输出到syslog
NtEventHandler 远程输出日志到Windows 的事件日志
MemoryHandler 日志输出到内存中的指定buffer
HTTPHandler 通过GET或者POST远程输出到HTTP服务器