日志组件
Python日志组件是一个常用的组件。
问题描述
日常我们写日志很简单,而如果在每个函数都需要写日志;或者代码有所改动,大量的修改日志代码,造成费事费力,容易出错。
有没有一种可以快速写日志的方式呢?这里给出一种实现
基于切片的思想,使用修饰器(和Java注解的形式类似,不知这样思考是否正确,望大佬指教)
# ! /usr/bin/python
# -*- coding: utf-8 -*-
# 只需要在此引入下面的文件,导入两个函数
from MyLog import log, log_init
# 在想要打印的日志的函数上添加@log即可
@log
def function(a, b):
return a+b
if __name__ == '__main__':
log_init()
function(1, 1)
输出结果
2021-09-17 21:18:35,039 - [INFO - (function) (1, 1) -> 2]
这里不仅可以输出到控制台,也可以同时输出到日志文件
只需要修改
log_init()
为
log_init(to_file=True, file_name="要输出的文件名")
代码实现
MyLog.py代码实现:
# ! /usr/bin/python
# -*- coding: utf-8 -*-
import functools
import logging
LOG_FILE_NAME = "log.log"
logger = logging.getLogger(__name__)
def log_init(to_file=False, file_name=LOG_FILE_NAME):
"""
:param to_file: 是否同时输出到日志文件
:param file_name: 日志文件名
:return: 无
"""
logger.setLevel(logging.INFO)
formatter = logging.Formatter("%(asctime)s - [%(levelname)s - %(message)s]")
chlr = logging.StreamHandler()
chlr.setLevel(logging.INFO)
chlr.setFormatter(formatter)
logger.addHandler(chlr)
if to_file:
handler = logging.FileHandler(file_name)
handler.setLevel(logging.INFO)
handler.setFormatter(formatter)
logger.addHandler(handler)
def log(func):
@functools.wraps(func)
def inner(*args, **kwargs):
res = func(*args, **kwargs)
logger.info(f"({func.__name__}) {args} -> {res}")
return res
return inner