|  |  | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  | import os | 
					
						
						|  | import os.path | 
					
						
						|  | import logging | 
					
						
						|  | from logging.handlers import RotatingFileHandler | 
					
						
						|  |  | 
					
						
						|  | def get_project_base_directory(): | 
					
						
						|  | PROJECT_BASE = os.path.abspath( | 
					
						
						|  | os.path.join( | 
					
						
						|  | os.path.dirname(os.path.realpath(__file__)), | 
					
						
						|  | os.pardir, | 
					
						
						|  | os.pardir, | 
					
						
						|  | ) | 
					
						
						|  | ) | 
					
						
						|  | return PROJECT_BASE | 
					
						
						|  |  | 
					
						
						|  | def initRootLogger(logfile_basename: str, log_format: str = "%(asctime)-15s %(levelname)-8s %(process)d %(message)s"): | 
					
						
						|  | logger = logging.getLogger() | 
					
						
						|  | if logger.hasHandlers(): | 
					
						
						|  | return | 
					
						
						|  |  | 
					
						
						|  | log_path = os.path.abspath(os.path.join(get_project_base_directory(), "logs", f"{logfile_basename}.log")) | 
					
						
						|  |  | 
					
						
						|  | os.makedirs(os.path.dirname(log_path), exist_ok=True) | 
					
						
						|  | formatter = logging.Formatter(log_format) | 
					
						
						|  |  | 
					
						
						|  | handler1 = RotatingFileHandler(log_path, maxBytes=10*1024*1024, backupCount=5) | 
					
						
						|  | handler1.setFormatter(formatter) | 
					
						
						|  | logger.addHandler(handler1) | 
					
						
						|  |  | 
					
						
						|  | handler2 = logging.StreamHandler() | 
					
						
						|  | handler2.setFormatter(formatter) | 
					
						
						|  | logger.addHandler(handler2) | 
					
						
						|  |  | 
					
						
						|  | logging.captureWarnings(True) | 
					
						
						|  |  | 
					
						
						|  | LOG_LEVELS = os.environ.get("LOG_LEVELS", "") | 
					
						
						|  | pkg_levels = {} | 
					
						
						|  | for pkg_name_level in LOG_LEVELS.split(","): | 
					
						
						|  | terms = pkg_name_level.split("=") | 
					
						
						|  | if len(terms)!= 2: | 
					
						
						|  | continue | 
					
						
						|  | pkg_name, pkg_level = terms[0], terms[1] | 
					
						
						|  | pkg_name = pkg_name.strip() | 
					
						
						|  | pkg_level = logging.getLevelName(pkg_level.strip().upper()) | 
					
						
						|  | if not isinstance(pkg_level, int): | 
					
						
						|  | pkg_level = logging.INFO | 
					
						
						|  | pkg_levels[pkg_name] = logging.getLevelName(pkg_level) | 
					
						
						|  |  | 
					
						
						|  | for pkg_name in ['peewee', 'pdfminer']: | 
					
						
						|  | if pkg_name not in pkg_levels: | 
					
						
						|  | pkg_levels[pkg_name] = logging.getLevelName(logging.WARNING) | 
					
						
						|  | if 'root' not in pkg_levels: | 
					
						
						|  | pkg_levels['root'] = logging.getLevelName(logging.INFO) | 
					
						
						|  |  | 
					
						
						|  | for pkg_name, pkg_level in pkg_levels.items(): | 
					
						
						|  | pkg_logger = logging.getLogger(pkg_name) | 
					
						
						|  | pkg_logger.setLevel(pkg_level) | 
					
						
						|  |  | 
					
						
						|  | msg = f"{logfile_basename} log path: {log_path}, log levels: {pkg_levels}" | 
					
						
						|  | logger.info(msg) |