Files
chatlog_alpha/pkg/util/dll_logger.go
lx1056758714-glitch 0afaf9ec00 集成wx_key.dll并优化微信进程与密钥管理
新增DLL方式的微信数据库密钥提取(优先于原生方式),集成wx_key.dll相关代码和开发文档,完善临时账户名称与进程PID的动态管理,增强微信进程状态监控和自动切换逻辑。更新README,详细说明项目功能、使用方法和DLL集成指南。
2025-12-14 17:47:30 +08:00

171 lines
3.5 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package util
import (
"fmt"
"os"
"path/filepath"
"sync"
"time"
)
// DLLLogger DLL日志记录器
type DLLLogger struct {
mu sync.Mutex
logFile *os.File
logPath string
enabled bool
}
var (
dllLogger *DLLLogger
dllLoggerOnce sync.Once
)
// GetDLLLogger 获取DLL日志记录器单例
func GetDLLLogger() *DLLLogger {
dllLoggerOnce.Do(func() {
dllLogger = &DLLLogger{
enabled: true,
}
// 尝试初始化日志文件
dllLogger.initLogFile()
})
return dllLogger
}
// initLogFile 初始化日志文件
func (l *DLLLogger) initLogFile() {
if !l.enabled {
return
}
// 获取当前工作目录
workDir, err := os.Getwd()
if err != nil {
// 如果获取失败,使用默认工作目录
workDir = DefaultWorkDir("")
}
// 创建日志目录
logDir := filepath.Join(workDir, "logs")
if err := os.MkdirAll(logDir, 0755); err != nil {
// 如果创建目录失败,禁用日志
l.enabled = false
return
}
// 生成日志文件名dll_YYYYMMDD_HHMMSS.log
timestamp := time.Now().Format("20060102_150405")
logFileName := fmt.Sprintf("dll_%s.log", timestamp)
l.logPath = filepath.Join(logDir, logFileName)
// 创建日志文件
file, err := os.OpenFile(l.logPath, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
if err != nil {
l.enabled = false
return
}
l.logFile = file
}
// LogError 记录错误信息
func (l *DLLLogger) LogError(message string) {
l.log("ERROR", message)
}
// LogStatus 记录状态信息
func (l *DLLLogger) LogStatus(level int, message string) {
var levelStr string
switch level {
case 0:
levelStr = "INFO"
case 1:
levelStr = "SUCCESS"
case 2:
levelStr = "ERROR"
default:
levelStr = "UNKNOWN"
}
l.log(levelStr, message)
}
// LogInfo 记录普通信息
func (l *DLLLogger) LogInfo(message string) {
l.log("INFO", message)
}
// LogDebug 记录调试信息
func (l *DLLLogger) LogDebug(message string) {
l.log("DEBUG", message)
}
// LogWarning 记录警告信息
func (l *DLLLogger) LogWarning(message string) {
l.log("WARNING", message)
}
// log 内部日志记录函数
func (l *DLLLogger) log(level, message string) {
if !l.enabled || l.logFile == nil {
return
}
l.mu.Lock()
defer l.mu.Unlock()
timestamp := time.Now().Format("2006-01-02 15:04:05.000")
logEntry := fmt.Sprintf("[%s] [%s] %s\n", timestamp, level, message)
if _, err := l.logFile.WriteString(logEntry); err != nil {
// 写入失败,关闭文件并禁用日志
l.logFile.Close()
l.logFile = nil
l.enabled = false
}
}
// GetLogPath 获取日志文件路径
func (l *DLLLogger) GetLogPath() string {
return l.logPath
}
// IsEnabled 检查日志是否启用
func (l *DLLLogger) IsEnabled() bool {
return l.enabled
}
// Close 关闭日志文件
func (l *DLLLogger) Close() {
l.mu.Lock()
defer l.mu.Unlock()
if l.logFile != nil {
l.logFile.Close()
l.logFile = nil
}
l.enabled = false
}
// LogInitialization 记录DLL初始化信息
func (l *DLLLogger) LogInitialization(pid uint32, success bool, errorMsg string) {
if success {
l.LogStatus(1, fmt.Sprintf("DLL初始化成功PID: %d", pid))
} else {
l.LogError(fmt.Sprintf("DLL初始化失败PID: %d, 错误: %s", pid, errorMsg))
}
}
// LogPolling 记录轮询信息
func (l *DLLLogger) LogPolling(keyFound bool, key string, keyType string) {
if keyFound {
l.LogStatus(1, fmt.Sprintf("找到%s密钥: %s", keyType, key))
} else {
l.LogStatus(0, "轮询中...")
}
}
// LogCleanup 记录清理信息
func (l *DLLLogger) LogCleanup() {
l.LogStatus(0, "DLL资源已清理")
}