import logging from logging.handlers import RotatingFileHandler import os from datetime import datetime class LoggingUtils: def make_log_dir(dirname='logs'): # 创建存放日志的目录,并返回目录的路径 root=os.path.dirname(os.path.dirname(__file__)) logDir=os.path.join(root,dirname) path = os.path.normpath(logDir) if not os.path.exists(path): os.mkdir(path) return path @staticmethod def get_loggingFileName(fileName): # root=os.path.dirname(os.path.dirname(__file__)) # logDir=os.path.join(root,"logs") # fileName="%s.log"% datetime.now().strftime("%Y-%m-%d") logDir = os.path.join(LoggingUtils.make_log_dir(),fileName) logFile=os.path.normpath(logDir) return logFile @staticmethod def init_logger(name, file=None): ''' 功能: 初始化logger对象 参数: name 必选 string logger模块名称 file 可选 string logger记录文件名,绝对路径 返回值: logger对象 举例: init_logger(__name__, 'P:/PublicFiles/utils.log') ''' import logging log_level = 'INFO' log_format = '[%(asctime)s %(levelname)s %(name)s - %(threadName)s] %(message)s' log_formatter = logging.Formatter(log_format, datefmt='%Y-%m-%d %H:%M:%S') f_handler = logging.FileHandler(file) f_handler.setFormatter(log_formatter) root = logging.getLogger(name) root.setLevel(log_level) root.addHandler(f_handler) return root @staticmethod def logging(name,filenamePath,level='INFO'): #logger logger=logging.getLogger() level=logging.getLevelName(level) logger.setLevel(level) if not logger.handlers: #handeler # fHandler=logging.FileHandler(filename=LoggingUtils.get_loggingFileName(name),encoding="utf-8") # fHandler=logging.FileHandler(filename=filenamePath,encoding="utf-8") fHandler=RotatingFileHandler(filename=filenamePath,maxBytes=1024, backupCount=10,encoding="utf-8") # handler = RotatingFileHandler(filename='app.log', maxBytes=1024, backupCount=3) sh = logging.StreamHandler() # 创建日志处理器,在控制台打印 #formater 创建格式器,指定日志的打印格式 #log_format = '[%(asctime)s %(levelname)s %(name)s - %(threadName)s] %(message)s' # fm="[%(asctime)s]-[%(levelname)s]-[%(name)s]-[Line:%(lineno)d]-[Thread:%(threadName)s]-[Msg:%(message)s]" fm="[%(asctime)s-%(levelname)s-%(module)s-%(funcName)s-Line:%(lineno)d-Thread:%(threadName)s-ThreadId:%(thread)d-Progress:%(process)d] Msg:%(message)s" fmt=logging.Formatter(fm) fHandler.setFormatter(fmt) sh.setFormatter(fmt) #add-handeler logger.addHandler(fHandler) logger.addHandler(sh) return logger
Python的logging模块提供了多种格式化日志消息的方式,可以使用不同的占位符和参数来自定义日志输出的格式。常用的格式化字符串包括:
-
%(levelname)s
:日志级别的名称,例如:"DEBUG"、"INFO"、"WARNING"、"ERROR"、"CRITICAL"。 -
%(asctime)s
:日志记录的时间戳,例如:"2021-01-01 12:34:56"。 -
%(message)s
:日志消息本身。 -
%(name)s
:日志记录器的名称。 -
%(filename)s
:包含日志记录的源文件的文件名。 -
%(funcName)s
:包含日志记录的函数或方法的名称。 -
%(lineno)d
:包含日志记录的源文件的行号。 -
%(module)s
:包含日志记录的模块名称。 -
%(process)d
:日志记录的进程ID。 -
%(thread)d
:日志记录的线程ID。 -
%(pathname)s
:包含日志记录的源文件的完整路径。 -
%(relativeCreated)d
:日志记录的相对创建时间。 -
%(funcName)s
:包含日志记录的函数或方法的名称。 -
%(processName)s
:日志记录的进程名称。 -
%(threadName)s
:日志记录的线程名称。