Python 通过生成器写一个日志调用方法, 支持以下功能
实例题目
通过生成器写一个日志调用方法, 支持以下功能
根据指令向屏幕输出日志
根据指令向文件输出日志
根据指令同时向文件&屏幕输出日志
以上日志格式如下
2017-10-19 22:07:38 [1] test log db backup 3
2017-10-19 22:07:40 [2] user alex login success
#注意:其中[1],[2]是指自日志方法第几次调用,每调用一次输出一条日志
代码结构如下:
def logger(filename,channel=’file’):
日志方法
:param filename: log filename
:param channel: 输出的目的地,屏幕(terminal),文件(file),屏幕+文件(both)
:return:
your code
#调用
logobj = logger(filename=”web.log”,channel=’both’)
log_obj.__next__()
log_obj.send(‘user alex login success’)
代码答案
这个题目的要求,很明显是需要调用到Python 自带的日志模块 logging
import logging # 调用日志模块
def logger(filename,channel="terminal"):
"""
使用 logging 日志模块
:param filename: 文件名
:param channel: 输出目的地
"""
logger = logging.getLogger("函数编程练习题Exe_13")
logger.setLevel(level=logging.DEBUG)
# 设置默认的日志等级
formatter = logging.Formatter("%(levelname)s: %(name)s // %(asctime)s %(message)s")
# 写定日志格式
handler_stream = logging.StreamHandler() #调用控制台输出
handler_stream.setFormatter(formatter)
handler_file = logging.FileHandler(filename,mode="w",encoding="utf-8") #调用文件输出
handler_file.setLevel(level=logging.DEBUG)
handler_file.setFormatter(formatter)
count = 1
while True:
msg = yield count
count += 1
if channel == "terminal":
logger.addHandler(handler_stream)
logger.info(f"[{count}] {msg}")
elif channel == "file":
logger.addHandler(handler_file)
logger.info(f"[{count}] {msg}")
elif channel == "both":
logger.addHandler(handler_stream)
logger.addHandler(handler_file)
logger.info(f"[{count}] {msg}")
else:
exit("输入错误,程序退出")
log_obj = logger("my.log",channel="both")
print(next(log_obj))
log_obj.send("user alex login success")
log_obj.send("user hahaha login success")
# 也可以输入其他的值
生成器 通过 send() 发送值