# coding: utf-8 #================================================================# # Copyright (C) 2020 Freecss All rights reserved. # # File Name :plog.py # Author :freecss # Email :karlfreecss@gmail.com # Created Date :2020/10/23 # Description : # #================================================================# import time import logging import pickle as pk import os import functools log_name = "default_log.txt" logging.basicConfig(level=logging.INFO, filename=log_name, filemode='a', format='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s') global recorder recorder = None def mkdir(dirpath): if not os.path.exists(dirpath): os.makedirs(dirpath) class ResultRecorder: def __init__(self, pk_dir = None, pk_filepath = None): self.set_savefile(pk_dir, pk_filepath) self.result = {} logging.info("===========================================================") logging.info("============= Result Recorder Version: 0.02 ===============") logging.info("===========================================================\n") pass def set_savefile(self, pk_dir = None, pk_filepath = None): if pk_dir is None: pk_dir = "result" mkdir(pk_dir) if pk_filepath is None: local_time = time.strftime("%Y%m%d_%H_%M_%S", time.localtime()) pk_filepath = os.path.join(pk_dir, local_time + ".pk") self.save_file = open(pk_filepath, "wb") logger = logging.getLogger() logger.handlers[0].stream.close() logger.removeHandler(logger.handlers[0]) filename = os.path.join(pk_dir, local_time + ".txt") file_handler = logging.FileHandler(filename) file_handler.setLevel(logging.DEBUG) formatter = logging.Formatter('%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s') file_handler.setFormatter(formatter) logger.addHandler(file_handler) def print(self, *argv, screen = False): info = "" for data in argv: info += str(data) if screen: print(info) logging.info(info) def print_result(self, *argv): for data in argv: info = "#Result# %s" % str(data) #print(info) logging.info(info) def store(self, *argv): for data in argv: if data.find(":") < 0: continue label, data = data.split(":") self.store_kv(label, data) def write_result(self, *argv): self.print_result(*argv) self.store(*argv) def store_kv(self, label, data): self.result.setdefault(label, []) self.result[label].append(data) def write_kv(self, label, data): self.print_result({label : data}) #self.print_result(label + ":" + str(data)) self.store_kv(label, data) def dump(self, save_file = None): if save_file is None: save_file = self.save_file pk.dump(self.result, save_file) def clock(self, func): @functools.wraps(func) def clocked(*args, **kwargs): t0 = time.perf_counter() result = func(*args, **kwargs) elapsed = time.perf_counter() - t0 name = func.__name__ # arg_str = ','.join(repr(arg) for arg in args) # context = f"{name}: ({arg_str})=>({result}), cost {elapsed}s" context = f"{name}: ()=>(), cost {elapsed}s" self.write_kv("func:", context) return result return clocked def __del__(self): self.dump() def clocker(*argv): global recorder if recorder is None: recorder = ResultRecorder() return recorder.clock(*argv) def INFO(*argv, screen = False): global recorder if recorder is None: recorder = ResultRecorder() return recorder.print(*argv, screen = screen) def DEBUG(*argv, screen = False): global recorder if recorder is None: recorder = ResultRecorder() return recorder.print(*argv, screen = screen) def logger(): global recorder if recorder is None: recorder = ResultRecorder() return recorder if __name__ == "__main__": recorder = ResultRecorder() recorder.write_kv("test", 1) recorder.set_savefile(pk_dir = "haha") recorder.write_kv("test", 1)