最近研究Python的日志模块,发现要么往文件里写,要么打印到控制台上,就没找到存到变量以及数据库的,这篇文章便是来探究如何取得和日志模块一样的数据。
原始的日志模块
下面是一个简略的日志模块,设置了控制台和文件两种日志形式,日志等级是一致的。其中message_fmt中,%(XXX)s代表的是一些约定好的称号,用于取得体系信息,常用的有asctime时刻,lineno行号,levelname日志等级,filename文件名,funcName函数名,process进程id,thread线程id,threadName线程称号,以及message日志信息。
import logging
class Logger:
def __init__(self):
self.logger = logging.getLogger('MyLogger')
message_fmt = '%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s'
date_fmt = '%Y-%m-%d %H:%M:%S'
fmt = logging.Formatter(fmt=message_fmt, datefmt=date_fmt)
self.logger.setLevel(logging.INFO)
stream_handler = logging.StreamHandler()
file_handler = logging.FileHandler('log.txt', encoding='utf-8')
stream_handler.setFormatter(fmt)
file_handler.setFormatter(fmt)
self.logger.addHandler(stream_handler)
self.logger.addHandler(file_handler)
if __name__ == '__main__':
my_logger = Logger().logger
my_logger.info('1233')
日志的显示效果如下:
模仿日志相关信息
时刻模仿
时刻模仿是最简略的了,使用datetime模块即可,并转换为指定格局的字符串
time_str = datetime.datetime.now().strftime(‘%Y-%m-%d %H:%M:%S’)
文件名、函数名和行号模仿
能够使用inspect模块中的getframeinfo获取当时frame的信息中关于文件名字、函数名和行号的部分,局限性在于只能在当时位置获取这几个信息,封装到函数里便是函数的信息了。
current_frame = inspect.currentframe()
file_pathname = inspect.getframeinfo(current_frame).filename
filename = file_pathname.split('/')[-1]
print(filename)
func_name = inspect.getframeinfo(current_frame).function
lineno = inspect.getframeinfo(current_frame).lineno
print(func_name,lineno)
文件名也能够经过os模块获取
print(os.path.basename(__file__))
函数名和行号也能够经过sys模块获取
print(sys._getframe().f_code.co_name)
print(sys._getframe().f_lineno)
进程、线程id称号模仿
线程方面使用threading模块获得当时线程的信息。
t = threading.currentThread()
print(t.ident)
print(t.getName())
进程方面,使用os模块直接获取id
pid = os.getpid()
print(pid)
如果还需求获得进程的更详细信息,需求装置psutil模块,检查进程称号,状态和父进程id如下,此处的进程称号其实便是Python自己
s = psutil.Process(pid)
print(s.name())
print(s.status())
print(s.ppid())
拼装
至此现已能够模仿出悉数的功用,日志等级和消息是自己写进去的,拼装简易版和复杂版分别如下:
message = '1233'
log_str = f'{time_str}- {filename}[line:{lineno}] - INFO: {message}'
print(log_str)
log_str = f'{time_str}- {filename}[line:{lineno}] -pid:{pid}-threadName:{t.getName()}-threadId:{t.ident}- INFO: {func_name} {message} '
print(log_str)
打印效果如下: