1.最简单的日志输出 https://www.cnblogs.com/yyds/p/6901864.html 先来试着分别输出一条不同日志级别的日志记录
# 在控制台输出日志的两种方式:
import logging
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.")
第二种写法
logging.log(logging.DEBUG, "This is a debug log.")
logging.log(logging.INFO, "This is a info log.")
logging.log(logging.WARNING, "This is a warning log.")
logging.log(logging.ERROR, "This is a error log.")
logging.log(logging.CRITICAL, "This is a critical log.")
1、经过配置的日志输出, 设置日志器级别 日志写在文件中
logging.basicConfig(level=logging.DEBUG, filename="./haha.txt") # 日志器设置的日志级别 默认是WARNING,
logging.debug("this is Debug message")
logging.info("this is info message")
logging.warning("this is warning message")
logging.error("this is error message")
logging.critical("this is critical message") # critical 极为重要的(汉语意思)
2、配置日志器日志级别的基础上,在配置下日志输出目标文件和日志格式、指定格式
LOG_FORMAT = "%(asctime)s - %(levelname)s - %(name)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.")
3、在上面的基础上,我们再来设置下日期/时间格式
LOG_FORMAT = "%(asctime)s - %(levelname)s - %(message)s"
DATE_FORMAT = "%m/%d/%Y %H:%M:%S %p"
logging.basicConfig(filename='./my.log2', 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.")
掌握了上面的内容之后,已经能够满足我们平时开发中需要的日志记录功能
其值为:"%(levelname)s:%(name)s:%(message)s"
日志级别 日志器名称 日志内容。
问题1:为什么前面两条日志没有被打印出来?
这是因为logging模块提供的日志记录函数所使用的日志器设置的日志级别是WARNING,因此只有WARNING级别的日志记录
以及大于它的ERROR和CRITICAL级别的日志记录被输出了,而小于它的DEBUG和INFO级别的日志记录被丢弃了。
问题2:打印出来的日志信息中各字段表示什么意思?为什么会这样输出?
上面输出结果中每行日志记录的各个字段含义分别是:
日志级别:日志器名称:日志内容
之所以会这样输出,是因为logging模块提供的日志记录函数所使用的日志器设置的日志格式默认是BASIC_FORMAT,
其值为:"%(levelname)s:%(name)s:%(message)s"
问题3:如果将日志记录输出到文件中,而不是打印到控制台?
因为在logging模块提供的日志记录函数所使用的日志器设置的处理器 所指定的日志输出位置默认为:
sys.stderr。
问题4:我是怎么知道这些的?
查看这些日志记录函数的实现代码,可以发现:当我们没有提供任何配置信息的时候,这些函数都会去调用
logging.basicConfig(**kwargs)方法,且不会向该方法传递任何参数。继续查看basicConfig()方法的代码
就可以找到上面这些问题的答案了。
问题5:怎么修改这些默认设置呢?
其实很简单,在我们调用上面这些日志记录函数之前,手动调用一下basicConfig()方法,把我们想设置的内容
以参数的形式传递进去就可以了。
3. logging.basicConfig(**kwargs)函数说明
"""
logging.basicConfig(**kwargs)函数
该方法用于为logging日志系统做一些基本配置,方法定义如下:
参数名称 描述
filename 指定日志输出的文件名,设置后就不会在控制台输出了
filemode 指定日志打开格式,默认为"a", 该选项设置了 filename 才有效
format 指定日志格式化字符串,指定日志输出时 包含的字段信息,以及顺序
datefmt 指定日期/时间格式, 该选项 要在 format中包含 时间字段 %(asctime)时才有效
level 指定日志器的 日志级别
stream 指定日志输出目标 stream, 例如 sys.stdout、 sys.stderr、以及网络stream, 但是 stream 和filename 不能同时使用,会产生异常的
style 指定 format 格式字符串的风格, 可取值为 "%"、 "{"、"$" 默认为 %
handler 如果该选项被指定, 它应该是一个创建 多个 Handlers 可迭代的对象,这些handler将会被添加到 root logger
注意 : filename , stream , handlers 这三个配置项只能存在一个, 不能同时出现两个或者三个
"""
4. logging模块定义的格式字符串字段
"""
字段/属性名称 使用格式 描述
asctime %(asctime)s 日志事件发生的时间--人类可读时间,如:2003-07-08 16:49:45,896
created %(created)f 日志事件发生的时间--时间戳,就是当时调用time.time()函数返回的值
relativeCreated %(relativeCreated)d 日志事件发生的时间相对于logging模块加载时间的相对毫秒数(目前还不知道干嘛用的)
msecs %(msecs)d 日志事件发生事件的毫秒部分
levelname %(levelname)s 该日志记录的文字形式的日志级别('DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL')
levelno %(levelno)s 该日志记录的数字形式的日志级别(10, 20, 30, 40, 50)
name %(name)s 所使用的日志器名称,默认是'root',因为默认使用的是 rootLogger
message %(message)s 日志记录的文本内容,通过 msg % args计算得到的
pathname %(pathname)s 调用日志记录函数的源码文件的全路径
filename %(filename)s pathname的文件名部分,包含文件后缀
module %(module)s filename的名称部分,不包含后缀
lineno %(lineno)d 调用日志记录函数的源代码所在的行号
funcName %(funcName)s 调用日志记录函数的函数名
process %(process)d 进程ID
processName %(processName)s 进程名称,Python 3.1新增
thread %(thread)d 线程ID
threadName %(thread)s 线程名称
"""