配置日志系统 Args: log_level: 日志级别 (DEBUG, INFO, WARNING, ERROR, CRITICAL) log_file: 日志文件路径,如果不指定则只输出到控制台 log_format: 日志格式 Returns: 根日志记录器
(
log_level: str = "INFO",
log_file: Optional[str] = None,
log_format: str = "%(asctime)s [%(levelname)s] %(name)s: %(message)s"
)
| 36 | |
| 37 | |
| 38 | def setup_logging( |
| 39 | log_level: str = "INFO", |
| 40 | log_file: Optional[str] = None, |
| 41 | log_format: str = "%(asctime)s [%(levelname)s] %(name)s: %(message)s" |
| 42 | ) -> logging.Logger: |
| 43 | """ |
| 44 | 配置日志系统 |
| 45 | |
| 46 | Args: |
| 47 | log_level: 日志级别 (DEBUG, INFO, WARNING, ERROR, CRITICAL) |
| 48 | log_file: 日志文件路径,如果不指定则只输出到控制台 |
| 49 | log_format: 日志格式 |
| 50 | |
| 51 | Returns: |
| 52 | 根日志记录器 |
| 53 | """ |
| 54 | # 设置日志级别 |
| 55 | numeric_level = getattr(logging, log_level.upper(), None) |
| 56 | if not isinstance(numeric_level, int): |
| 57 | numeric_level = logging.INFO |
| 58 | |
| 59 | # 配置根日志记录器 |
| 60 | root_logger = logging.getLogger() |
| 61 | root_logger.setLevel(numeric_level) |
| 62 | |
| 63 | # 清除现有的处理器 |
| 64 | root_logger.handlers.clear() |
| 65 | |
| 66 | # 创建格式化器 |
| 67 | formatter = ShanghaiTimeFormatter(log_format) |
| 68 | |
| 69 | # 控制台处理器 |
| 70 | console_handler = logging.StreamHandler(sys.stdout) |
| 71 | console_handler.setFormatter(formatter) |
| 72 | console_handler.setLevel(numeric_level) |
| 73 | root_logger.addHandler(console_handler) |
| 74 | |
| 75 | # 文件处理器(如果指定了日志文件) |
| 76 | if log_file: |
| 77 | # 确保日志目录存在 |
| 78 | log_dir = os.path.dirname(log_file) |
| 79 | if log_dir: |
| 80 | os.makedirs(log_dir, exist_ok=True) |
| 81 | |
| 82 | file_handler = logging.FileHandler(log_file, encoding="utf-8") |
| 83 | file_handler.setFormatter(formatter) |
| 84 | file_handler.setLevel(numeric_level) |
| 85 | root_logger.addHandler(file_handler) |
| 86 | |
| 87 | return root_logger |
| 88 | |
| 89 | |
| 90 | def generate_password(length: int = DEFAULT_PASSWORD_LENGTH) -> str: |
no test coverage detected