feat: Initialize wxauto WeChat automation project with job extraction tools
- Add wxauto package with WeChat UI automation and message handling capabilities - Implement job_extractor.py for automated job posting extraction from WeChat groups - Add job_extractor_gui.py providing graphical interface for job extraction tool - Create comprehensive documentation in Chinese covering GUI usage, multi-group support, and quick start guides - Add build configuration files (build_exe.py, build_exe.spec) for packaging as standalone executable - Include utility scripts for WeChat interaction (auto_send_msg.py, get_history.py, receive_file_transfer.py) - Add project configuration files (pyproject.toml, setup.cfg, requirements.txt) - Include test files (test_api.py, test_com_fix.py) for API and compatibility validation - Add Apache 2.0 LICENSE and comprehensive README documentation - Configure .gitignore to exclude build artifacts, logs, and temporary files
This commit is contained in:
128
wxauto/logger.py
Normal file
128
wxauto/logger.py
Normal file
@@ -0,0 +1,128 @@
|
||||
from wxauto.param import WxParam
|
||||
|
||||
import logging
|
||||
import colorama
|
||||
from pathlib import Path
|
||||
from datetime import datetime
|
||||
import sys
|
||||
import io
|
||||
|
||||
|
||||
# # 初始化 colorama
|
||||
colorama.init()
|
||||
|
||||
if hasattr(sys.stdout, 'buffer'):
|
||||
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8', errors='ignore')
|
||||
|
||||
LOG_COLORS = {
|
||||
'DEBUG': colorama.Fore.CYAN,
|
||||
'INFO': colorama.Fore.GREEN,
|
||||
'WARNING': colorama.Fore.YELLOW,
|
||||
'ERROR': colorama.Fore.RED,
|
||||
'CRITICAL': colorama.Fore.MAGENTA
|
||||
}
|
||||
|
||||
class ColoredFormatter(logging.Formatter):
|
||||
def format(self, record):
|
||||
levelname = record.levelname
|
||||
message = super().format(record)
|
||||
return f"{LOG_COLORS[levelname]}{message}{colorama.Style.RESET_ALL}"
|
||||
|
||||
class WxautoLogger:
|
||||
name: str = 'wxauto'
|
||||
|
||||
def __init__(self):
|
||||
self.logger = self.setup_logger()
|
||||
self.file_handler = None # 先不创建文件处理器
|
||||
self.set_debug(False)
|
||||
|
||||
def setup_logger(self) -> logging.Logger:
|
||||
"""设置日志记录器"""
|
||||
# 配置根记录器
|
||||
root_logger = logging.getLogger()
|
||||
root_logger.setLevel(logging.DEBUG)
|
||||
|
||||
# 添加asyncio日志过滤
|
||||
logging.getLogger('asyncio').setLevel(logging.WARNING)
|
||||
|
||||
# 设置第三方库的日志级别
|
||||
logging.getLogger('comtypes').setLevel(logging.WARNING)
|
||||
logging.getLogger('urllib3').setLevel(logging.WARNING)
|
||||
logging.getLogger('requests').setLevel(logging.WARNING)
|
||||
|
||||
# 清除现有处理器
|
||||
root_logger.handlers.clear()
|
||||
|
||||
# 格式
|
||||
fmt = '%(asctime)s [%(name)s] [%(levelname)s] [%(filename)s:%(lineno)d] %(message)s'
|
||||
|
||||
# 控制台处理器(带颜色)
|
||||
self.console_handler = logging.StreamHandler()
|
||||
console_formatter = ColoredFormatter(
|
||||
fmt=fmt,
|
||||
datefmt="%Y-%m-%d %H:%M:%S"
|
||||
)
|
||||
self.console_handler.setFormatter(console_formatter)
|
||||
self.console_handler.setLevel(logging.DEBUG)
|
||||
|
||||
root_logger.addHandler(self.console_handler)
|
||||
|
||||
return logging.getLogger(self.name)
|
||||
|
||||
def setup_file_logger(self):
|
||||
"""根据WxParam.ENABLE_FILE_LOGGER决定是否创建文件日志处理器"""
|
||||
if not WxParam.ENABLE_FILE_LOGGER or self.file_handler is not None:
|
||||
return
|
||||
|
||||
# 文件处理器(无颜色)
|
||||
log_dir = Path("wxauto_logs")
|
||||
log_dir.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
# 使用当前时间创建日志文件
|
||||
current_time = datetime.now().strftime("%Y%m%d")
|
||||
log_file = log_dir / f"app_{current_time}.log"
|
||||
|
||||
self.file_handler = logging.FileHandler(log_file, encoding='utf-8')
|
||||
file_formatter = logging.Formatter(
|
||||
'%(asctime)s [%(name)s] [%(levelname)s] [%(filename)s:%(lineno)d] %(message)s',
|
||||
datefmt="%Y-%m-%d %H:%M:%S"
|
||||
)
|
||||
self.file_handler.setFormatter(file_formatter)
|
||||
self.file_handler.setLevel(logging.DEBUG)
|
||||
|
||||
# 将文件处理器添加到日志记录器
|
||||
logging.getLogger().addHandler(self.file_handler)
|
||||
|
||||
def set_debug(self, debug=False):
|
||||
"""动态设置日志级别"""
|
||||
if debug:
|
||||
self.console_handler.setLevel(logging.DEBUG)
|
||||
else:
|
||||
self.console_handler.setLevel(logging.INFO)
|
||||
|
||||
def _ensure_file_logger(self):
|
||||
"""确保文件日志处理器被初始化"""
|
||||
if WxParam.ENABLE_FILE_LOGGER and self.file_handler is None:
|
||||
self.setup_file_logger()
|
||||
|
||||
def debug(self, msg: str, stacklevel=2, *args, **kwargs):
|
||||
self._ensure_file_logger() # 确保文件日志初始化
|
||||
self.logger.debug(msg, *args, stacklevel=stacklevel, **kwargs)
|
||||
|
||||
def info(self, msg: str, stacklevel=2, *args, **kwargs):
|
||||
self._ensure_file_logger() # 确保文件日志初始化
|
||||
self.logger.info(msg, *args, stacklevel=stacklevel, **kwargs)
|
||||
|
||||
def warning(self, msg: str, stacklevel=2, *args, **kwargs):
|
||||
self._ensure_file_logger() # 确保文件日志初始化
|
||||
self.logger.warning(msg, *args, stacklevel=stacklevel, **kwargs)
|
||||
|
||||
def error(self, msg: str, stacklevel=2, *args, **kwargs):
|
||||
self._ensure_file_logger() # 确保文件日志初始化
|
||||
self.logger.error(msg, *args, stacklevel=stacklevel, **kwargs)
|
||||
|
||||
def critical(self, msg: str, stacklevel=2, *args, **kwargs):
|
||||
self._ensure_file_logger() # 确保文件日志初始化
|
||||
self.logger.critical(msg, *args, stacklevel=stacklevel, **kwargs)
|
||||
|
||||
wxlog = WxautoLogger()
|
||||
Reference in New Issue
Block a user