0-python库之-logging日志系统
2020-02-16 本文已影响0人
Creator_Ly
一般情况我们可以使用print()进行打印信息,当我们需要打印的信息可以等级显示,加时间戳,保存到文件等的时候,使用print就不太方便,这时候一般使用logging库
1、设置日志级别
我们先做一个测试,如下语句:
import logging # 引入logging模块
logging.debug(u"debug")
logging.info(u"info")
logging.warning(u"warning")
logging.error(u"error")
logging.critical(u"critical")
运行结果如下:
WARNING:root:warning
ERROR:root:error
CRITICAL:root:critical
所以可以知道logging的默认等级为warning,低于该等级的就不输出了,
那如何设置日志输出的等级呢,如下
import logging # 引入logging模块
logging.basicConfig(level=logging.NOTSET) # 设置日志级别
logging.debug(u"debug")
logging.info(u"info")
logging.warning(u"warning")
logging.error(u"error")
logging.critical(u"critical")
使用basicConfig里面的level字段设置,有如下几个等级可以设置
CRITICAL = 50
FATAL = CRITICAL
ERROR = 40
WARNING = 30
WARN = WARNING
INFO = 20
DEBUG = 10
NOTSET = 0
2、设置日志显示格式
如果我们想给日志加个打印时间,打印所处的文件行数等,如何设置。
import logging
if __name__ == '__main__':
logging.basicConfig(level=logging.NOTSET, # 设置日志级别
format="%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s")
logging.debug(u"debug")
logging.info(u"info")
logging.warning(u"warning")
logging.error(u"error")
logging.critical(u"critical")
可以看到输入结果有时间,有代码文件和行数。
2020-02-16 16:16:43,356 - test.py[line:54] - DEBUG: debug
2020-02-16 16:16:43,356 - test.py[line:55] - INFO: info
2020-02-16 16:16:43,356 - test.py[line:56] - WARNING: warning
2020-02-16 16:16:43,356 - test.py[line:57] - ERROR: error
2020-02-16 16:16:43,356 - test.py[line:58] - CRITICAL: critical
3、设置日志输出文件
同理我们想把文件输出到一个文件里面保存,如下,使用filename参数
import logging
if __name__ == '__main__':
logging.basicConfig(level=logging.NOTSET, # 设置日志级别
format="%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s",
filename="test.log", # 指定输出的文件
)
logging.debug(u"debug")
logging.info(u"info")
logging.warning(u"warning")
logging.error(u"error")
logging.critical(u"critical")
这样设置后,我们会发下日志内容是保存在test.log文件里面了,可以没办法实时显示在终端,要看log还得打开文件,我们能否做到日志文件里面有保存,终端也能实时显示呢。
这时候就要用到logging里面的Handler接口
4、同时输出到终端和文件
这边我们一般使用getLogger接口实例化的logging,而不将其直接暴露
如:
import logging
logger = logging.getLogger("") # 实例化logging
logger.debug(u"debug")
logger.info(u"info")
logger.warning(u"warning")
logger.error(u"error")
logger.critical(u"critical")
之后我们就可以使用Handler,handler对象负责将适当的日志消息(基于日志消息的log level)分发给handler的指定目标,如文件、标准输出流等。
logging里面有很多handle
logging.StreamHandler # 日志输出到流,可以是 sys.stderr,sys.stdout 或者文件。
logging.FileHandler # 日志输出到文件。
logging.handlers.BaseRotatingHandler # 基本的日志回滚方式。
logging.handlers.RotatingHandler # 日志回滚方式,支持日志文件最大数量和日志文件回滚。
logging.handlers.TimeRotatingHandler # 日志回滚方式,在一定时间区域内回滚日志文件。
logging.handlers.SocketHandler # 远程输出日志到TCP/IP sockets。
logging.handlers.DatagramHandler # 远程输出日志到UDP sockets。
logging.handlers.SMTPHandler # 远程输出日志到邮件地址。
logging.handlers.SysLogHandler # 日志输出到syslog。
logging.handlers.NTEventLogHandler # 远程输出日志到Windows NT/2000/XP的事件日志。
logging.handlers.MemoryHandler # 日志输出到内存中的指定buffer。
logging.handlers.HTTPHandler # 通过”GET”或者”POST”远程输出到HTTP服务器。
logging.NullHandler
我们这边需要使用到的就是StreamHandler和FileHandler这两个
如下例子:
import logging
logger = logging.getLogger("") # 实例化logging
def logging_init():
# 创建handler
fh = logging.FileHandler/("test.log", encoding="utf-8")
ch = logging.StreamHandler()
# 设置logger日志等级
logger.setLevel(logging.INFO)
# 设置输出日志格式
formatter = logging.Formatter(
fmt="%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s"
)
# 为handler指定输出格式,注意大小写
fh.setFormatter(formatter)
ch.setFormatter(formatter)
# 为logger添加的日志处理器
logger.addHandler(fh)
logger.addHandler(ch)
return True
if __name__ == '__main__':
logging_init()
logger.debug(u"debug")
logger.info(u"info")
logger.warning(u"warning")
logger.error(u"error")
logger.critical(u"critical")
- 一般先创建我们需要的handle,如FileHandler/StreamHandler
- 然后设置handle的属性,如setLevel/setFormatter
- 最后使用addHandler添加到中心处理器
参考资料:
https://blog.csdn.net/jeffery0207/article/details/95856490
https://www.cnblogs.com/xianyulouie/p/11041777.html