前记
1、日志作用:
程序调试;
了解软件程序运行情况;
程序运行故障分析与问题定位;
2、详细日志等级:
debug/info/notice/warning/error/critical/alert/emergency
3、日志记录可能包含的字段信息:
事件发生时间
事件发生位置
事件日志级别
事件内容
一、日志等级:
DEBUG 详细日志,问题诊断;
INFO 记录关键节点信息;
WARNING 记录不期望的事件;
ERROR 记录严重问题导致功能运行不正常;
CRITICAL严重错误,导致应用程序不能继续运行的信息;
注:debug和info进行开发调试,线上使用warning或error级别;
二、logging模块使用
两种方式:
1、使用logging提供的模块级别的函数;
2、使用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进行一次性配置
其中logging.basicConfig(**kwargs)函数用于指定"要记录的日志级别"、"日志格式"、"日志输出位置"、"日志文件的打开模式"等,其他几个用于记录各个级别日志的函数;四大组件(后续):
组件和说明
loggers 提供应用程序代码直接使用的接口
handlers 用于将日志记录发送到指定的目的位置
filters 提供更细粒度的日志过滤功能,用于决定哪些日志记录将会被输出(其它的日志记录将会被忽略)
formatters 用于控制日志信息的最终输出格式
三、logging提供的模块级别函数的使用
logging函数的日志器的日志级别是warning,只有warning及大于它的error和critical日志被输出,小于它的debug和info被丢弃;
import logginglogging.debug("this is a debug log.");
logging.info("this is a info log.")
logging.warning("this is a warning log.")
logging.error("this is a error log.")
logging.critical("this is a critical log.")输出:
WARNING:root:this is a warning log.
ERROR:root:this is a error log.
CRITICAL:root:this is a critical log.结果含义:日志级别:日志器名称:日志内容
因为日志器设置的日志格式默认是BASIC_FORMAT,值为"%(levelname)s:%(name)s:%(message)s"
logging.basicConfig()函数说明
定义:logging.basicConfig(**kwargs)
函数可接受的关键字:
参数名称 描述
filename 指定日志输出目标文件的文件名,指定该设置项后日志信心就不会被输出到控制台了
filemode 指定日志文件的打开模式,默认为'a'。需要注意的是,该选项要在filename指定时才有效
format 指定日志格式字符串,即指定日志输出时所包含的字段信息以及它们的顺序。logging模块定义的格式字段下面会列出。
datefmt 指定日期/时间格式。需要注意的是,该选项要在format中包含时间字段%(asctime)s时才有效
level 指定日志器的日志级别
stream 指定日志输出目标stream,如sys.stdout、sys.stderr以及网络stream。需要说明的是,stream和filename不能同时提供,否则会引发 ValueError异常
style Python 3.2中新添加的配置项。指定format格式字符串的风格,可取值为'%'、'{'和'$',默认为'%'
handlers Python 3.3中新添加的配置项。该选项如果被指定,它应该是一个创建了多个Handler的可迭代对象,这些handler将会被添加到root logger。需要说明的是:filename、stream和handlers这三个配置项只能有一个存在,不能同时出现2个或3个,否则会引发ValueError异常。
四、配置后的日志输出
import logginglogging.basicConfig(level=logging.DEBUG)
logging.debug("this is a debug log.");
logging.info("this is a info log.")
logging.warning("this is a warning log.")
logging.error("this is a error log.")
logging.critical("this is a critical log.")
输出:
DEBUG:root:this is a debug log.
INFO:root:this is a info log.
WARNING:root:this is a warning log.
ERROR:root:this is a error log.
CRITICAL:root:this is a critical log.优化后:
import loggingLOG_FORMAT = "%(asctime)s - %(levelname)s - %(message)s"
logging.basicConfig(filename='my.log', level=logging.DEBUG, format=LOG_FORMAT)logging.debug("This is a debug log.")
logging.info("This is a info log.")
logging.warning("This is a warning log.")
logging.error("This is a error log.")
logging.critical("This is a critical log.")
输出:
2018-08-23 22:36:44,163 - DEBUG - This is a debug log.
2018-08-23 22:36:44,163 - INFO - This is a info log.
2018-08-23 22:36:44,163 - WARNING - This is a warning log.
2018-08-23 22:36:44,163 - ERROR - This is a error log.
2018-08-23 22:36:44,163 - CRITICAL - This is a critical log.设置日期/时间格式:
import loggingLOG_FORMAT="%(asctime)s - %(levelname)s - %(message)s"
DATE_FORMAT="%m/%d/%Y %H:%M:%S %p"logging.basicConfig(filename="my.log",level=logging.DEBUG,format=LOG_FORMAT,datefmt=DATE_FORMAT)
logging.debug("This is a debug log.")
logging.info("This is a info log.")
logging.warning("This is a warning log.")
logging.error("This is a error log.")
logging.critical("This is a critical log.")
输出:
08/23/2018 22:40:59 PM - DEBUG - This is a debug log.
08/23/2018 22:40:59 PM - INFO - This is a info log.
08/23/2018 22:40:59 PM - WARNING - This is a warning log.
08/23/2018 22:40:59 PM - ERROR - This is a error log.
08/23/2018 22:40:59 PM - CRITICAL - This is a critical log.logging.basicConfig()函数是一次性简单配置工具,多次调用不累加操作。后续学习四大组件;
注:如有错误,请指正!