#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ WordPress 发布系统 - 日志模块 提供发布日志和调试日志功能 """ import os import sys import logging from logging.handlers import RotatingFileHandler from datetime import datetime # 基础目录 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) LOG_DIR = os.path.join(BASE_DIR, 'logs') os.makedirs(LOG_DIR, exist_ok=True) # 日志格式 LOG_FORMAT = '%(asctime)s - %(name)s - %(levelname)s - %(message)s' DEBUG_FORMAT = '%(asctime)s - %(name)s - %(levelname)s - [%(filename)s:%(lineno)d] - %(message)s' PUBLISH_FORMAT = '%(asctime)s | %(message)s' # 日志文件大小限制 (10MB) MAX_BYTES = 10 * 1024 * 1024 BACKUP_COUNT = 5 class PublishLogger: """发布日志记录器""" def __init__(self, log_file='publish.log'): self.logger = logging.getLogger('wp_publish') self.logger.setLevel(logging.INFO) # 避免重复添加处理器 if self.logger.handlers: return # 发布日志文件处理器 log_path = os.path.join(LOG_DIR, log_file) file_handler = RotatingFileHandler( log_path, maxBytes=MAX_BYTES, backupCount=BACKUP_COUNT, encoding='utf-8' ) file_handler.setLevel(logging.INFO) file_handler.setFormatter(logging.Formatter(PUBLISH_FORMAT)) self.logger.addHandler(file_handler) # 控制台输出 console_handler = logging.StreamHandler(sys.stdout) console_handler.setLevel(logging.INFO) console_handler.setFormatter(logging.Formatter(PUBLISH_FORMAT)) self.logger.addHandler(console_handler) def info(self, message): self.logger.info(message) def success(self, message): self.logger.info(f"✅ SUCCESS: {message}") def warning(self, message): self.logger.warning(f"⚠️ WARNING: {message}") def error(self, message): self.logger.error(f"❌ ERROR: {message}") def start_publish(self, source_type, filename=None): timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S') self.logger.info("=" * 60) self.logger.info(f"🚀 开始发布 - {timestamp}") self.logger.info(f"📋 发布类型:{source_type}") if filename: self.logger.info(f"📁 文件名:{filename}") self.logger.info("=" * 60) def end_publish(self, success, post_id=None, post_url=None, error_msg=None): if success: self.success(f"发布成功!文章 ID: {post_id}") if post_url: self.info(f"🔗 文章链接:{post_url}") else: self.error(f"发布失败:{error_msg}") self.info("=" * 60) class DebugLogger: """调试日志记录器""" def __init__(self, log_file='debug.log'): self.logger = logging.getLogger('wp_debug') self.logger.setLevel(logging.DEBUG) # 避免重复添加处理器 if self.logger.handlers: return # 调试日志文件处理器 log_path = os.path.join(LOG_DIR, log_file) file_handler = RotatingFileHandler( log_path, maxBytes=MAX_BYTES, backupCount=BACKUP_COUNT, encoding='utf-8' ) file_handler.setLevel(logging.DEBUG) file_handler.setFormatter(logging.Formatter(DEBUG_FORMAT)) self.logger.addHandler(file_handler) # 错误日志单独记录 error_log_path = os.path.join(LOG_DIR, 'error.log') error_handler = RotatingFileHandler( error_log_path, maxBytes=MAX_BYTES, backupCount=BACKUP_COUNT, encoding='utf-8' ) error_handler.setLevel(logging.ERROR) error_handler.setFormatter(logging.Formatter(DEBUG_FORMAT)) self.logger.addHandler(error_handler) def debug(self, message): self.logger.debug(message) def info(self, message): self.logger.info(message) def warning(self, message): self.logger.warning(message) def error(self, message, exc_info=None): self.logger.error(message, exc_info=exc_info) def log_step(self, step_name, details=None): """记录步骤""" self.logger.info(f"📌 步骤:{step_name}") if details: self.logger.info(f" 详情:{details}") def log_result(self, result_type, result_data): """记录结果""" self.logger.info(f"📊 结果:{result_type}") self.logger.debug(f" 数据:{result_data}") # 创建全局日志实例 publish_logger = PublishLogger() debug_logger = DebugLogger() def get_publish_logger(): """获取发布日志实例""" return publish_logger def get_debug_logger(): """获取调试日志实例""" return debug_logger if __name__ == '__main__': # 测试日志 pl = get_publish_logger() dl = get_debug_logger() pl.start_publish('测试', 'test.docx') pl.info('正在解析文档...') pl.success('文档解析完成') dl.log_step('解析测试', '提取标题和正文') dl.debug('调试信息:文档结构正常') pl.end_publish(True, post_id=1, post_url='https://www.nanlou.net/test')