导入
import logging
logging,就是日志单词 log的现在进行时
一个动作正在进行
吃饭,吃饭中
打怪,打怪中
日志的五个级别
日志级别的用法
模块名.方法名()
logging.级别(str要显示的内容)
例子:
import logging
num = input("请输入一个数字")
try:
int_num = int(num)
except:
logging.error("非法的输入{}".format(num))
print('结束了')
日志的运行级别
默认的运行级别是warning,警告级别
修改运行级别,可以让更低级别的被显示出来
logging.basicConfig(level=logging.DEBUG)
日志保存为文件
新增 filename配置
logging.basicConfig(
level=logging.DEBUG,
filename=文件的路径
)
当设置了日志保存在文件时
信息就不会再屏幕上显示了
修改日志的保存模式默认是追加模式
如果希望通过定入赋盖模式
filemode="w",
logging.basicConfig(
level=logging.DEBUG,
filename="mylog.log",
filemode="w",
)
格式化输出日志显示的内容
回顾以前的格式化输出
用一个例子来回顾
m = "我的名字叫%s,我的身高是%.2f,我今年%d,我的学号是%04d" %("吕小布", 1.7444, 22, 32)
print(m)
结果
C:\Users\python_hui\Anaconda3\python.exe G:/教学管理系统1907/oneone/test.py
我的名字叫吕小布,我的身高是1.74,我今年22,我的学号是0032
Process finished with exit code 0
对于logging模块中,日志的格式化输出
用法格式
format = "%(类型)s"
更多类型
演示代码
import logging
logging.basicConfig(
level=logging.DEBUG,
filename="mylog.log",
filemode="w",
format="%(asctime)s %(filename)s %(lineno)s: %(message)s"
)
num = input("请输入一个数字")
try:
int_num = int(num)
except:
logging.info("非法的输入{}".format(num))
print('结束了')
写模式的代码,每一次日志的内容,都会被重写
效果
2019-07-01 14:01:29,433 test_log.py 15: 非法的输入b
获得日志对象获取方式
logging.getLogger()
import logging
# 获得日志对象
logger = logging.getLogger()
print(logger)
print(logger.__dict__)
日志对象的属性字典
{‘filters’: [], ‘name’: ‘root’, ‘level’: 30, ‘parent’: None, ‘propagate’: True, ‘handlers’: [], ‘disabled’: False, ‘_cache’: {}}
日志对象的特点可以实现,同时,在屏幕上显示 内容,和文件中输出内容
它这样操作的机理,是需要两个对象支持的
对象一,是文件处理器,filehandler
对象二,屏幕处理器,streamhandler
日志对象的完整配置import logging,os,time
def get_logger():
"""
获取日志对象,已经对日志对象进行了相关的设置了
:return:
"""
# 生成日志对象
logger = logging.getLogger()
# 设置提示级别
logger.setLevel("INFO")
# 生成日志保存路径
current_dir = os.path.dirname(os.path.abspath(__file__))
logger_file_path = os.path.join(current_dir, time.strftime("%Y%m%d")+".log")
# 设置输出对象
file_handler = logging.FileHandler(logger_file_path, encoding="utf8")
stream_handler = logging.StreamHandler()
# 设置日志输出的格式
fmt = logging.Formatter("%(asctime)s %(filename)s %(lineno)s : %(message)s")
# 设置输出对象按照格式来输出
file_handler.setFormatter(fmt)
# 日志对象添加输出对象
if not logger.handlers:
logger.addHandler(file_handler)
logger.addHandler(stream_handler)
return logger
if __name__ == '__main__':
l = get_logger()
l.info('haha')
图示日志模块
更正,图片器对象有setformatter方法
处理器对象包括了文件处理器对象,流处理器对象
日志对象的使用当日志对象配置好了以后,如果使用,格式为
日志对象.运行级别(str日志内容)
例子:
logger.info("启动运行功能")
------------以下是备课笔记----------------------
日志模块帮助我们记录信息
非常重要的模块
示例
日志级别,五个
设置运行级别
默认信息显示在控制台的
设置后内容输出到文件了
默认是追加模式
将追加模式设置为写模式,默认是追加模式
显示时间与行号
加文件名,加日志内容
其它参数
…
日志对象
日志对象
屏幕与文件对象,不完整版
大鱼吃小鱼,小鱼吃虾米的方式
生态链
打印日志
屏幕与文件同时显示
默认warning模式
修改日志对象的默认级别
开发实用
把日志的设置处理一下
让函数返回一个logger对象
用时直接调对象的方法
回顾
添加日志
日志的子对象
getLogger参数写名称
根,子,孙子,层级
根对象,输出
子对象也在输出时
子对象会输出多次
原因是,子对象输出时看看上级,上也在输出,自己会再次输出
解决重复输出的办法, 让上级对象停止输出就可
设置日志文件的编码为 utf8编码