在之前测试运维试听课程中,芒果给大家介绍了python日志系统-logging的使用,这里我们来做个小总结。
日志相关概念介绍
日志是一种可以追踪某些软件运行时所发生事件的方法。软件开发人员可以向他们的代码中调用日志记录相关的方法来表明发生了某些事情。
一个事件可以用一个可包含可选变量数据的消息来描述。
日志的作用:
通过对日志的分析,可以方便用户了解系统或软件、应用的运行情况;如果你的应用日志足够丰富,也可以分析以往用户的操作行为、类型喜好、地域分布或其他更多信息;如果一个应用的日志同时也分了多个级别,那么可以很轻易地分析得到该应用的健康状况,及时发现问题并快速定位、解决问题,补救损失。
logging介绍
logging模块是Python内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级、日志保存路径、日志文件回滚等。
logging模块的日志级别:
logging模块默认定义了以下几个日志等级,它允许开发人员自定义其他日志级别,但是这是不被推荐的,尤其是在开发供别人使用的库时,因为这会导致日志级别的混乱。
DEBUG 最详细的日志信息,典型应用场景是 问题诊断
INFO 信息详细程度仅次于DEBUG,通常只记录关键节点信息,用于确认一切都是按照我们预期的那样进行工作
WARNING 当某些不期望的事情发生时记录的信息(如,磁盘可用空间较低),但是此时应用程序还是正常运行的
ERROR 由于一个更严重的问题导致某些功能不能正常运行时记录的信息
CRITICAL 当发生严重错误,导致应用程序不能继续运行时记录的信息
logging使用范例
简单配置
用 logging.basicConfig()函数调整日志级别、输出格式等,使用logging的时日输入函数输出日志。
示例:
代码语言:javascript复制import logging
logging.basicConfig(level=logging.DEBUG,
format="%(asctime)s %(name)s %(levelname)s %(message)s",
datefmt = "%Y-%m-%d %H:%M:%S %a")
logging.debug("debug_msg")
logging.info("info_msg")
logging.warning("warning_msg")
logging.error("error_msg")
logging.critical("critical_msg")
默认情况下Python的logging模块将日志打印到了标准输出中,且只显示了大于等于WARNING级别的日志,这说明默认的日志级别设置为WARNING(日志级别等级CRITICAL > ERROR > WARNING > INFO > DEBUG)
默认输出格式为
默认的日志格式为日志级别:Logger名称:用户输出消息
日志流处理流程
在介绍logging模块的日志流处理流程之前,我们先来介绍下logging模块的四大组件:
日志器 Logger 提供了应用程序可一直使用的接口
处理器 Handler 将logger创建的日志记录发送到合适的目的输出
过滤器 Filter 提供了更细粒度的控制工具来决定输出哪条日志记录,丢弃哪条日志记录
格式器 Formatter 决定日志记录的最终输出格式
logging模块就是通过这些组件来完成日志处理的,上面所使用的logging模块级别的函数也是通过这些组件对应的类来实现的。
示例:
代码语言:javascript复制import logging
import logging.handlers
import datetime
import sys
def handle_log():
my_logger = logging.getLogger("my_logger")
my_logger.setLevel(logging.DEBUG)
all_handler = logging.handlers.TimedRotatingFileHandler(
"all_test.log",
when="midnight",
interval=1,
backupCount=7,
atTime=datetime.time(0,0,0,0)
)
all_handler.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s - %(message)s"))
all_handler.setLevel(logging.DEBUG)
err_handler = logging.FileHandler("error_test.log")
err_handler.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s - %(filename)s[:%(lineno)d] - %(message)s"))
err_handler.setLevel(logging.ERROR)
my_logger.addHandler(all_handler)
my_logger.addHandler(err_handler)
return my_logger
def log_test(logger):
logger.debug("debug_msg")
logger.info("info_msg")
logger.warning("warning_msg")
logger.error("error_msg")
logger.critical("critical_msg")
if __name__ == '__main__':
logger = handle_log()
log_test(logger)