mirror of
https://github.com/shadow1ng/fscan.git
synced 2025-09-14 14:06:44 +08:00

主要修复: 1. 修复时间显示Bug - StartTime初始化问题 2. 修复Web智能探测错误检测预定义端口而非用户指定端口 3. 修复本地插件被错误调用到端口扫描中的问题 4. 修复host:port格式双重处理导致的多余端口扫描 5. 统一插件过滤逻辑,消除接口不一致性 6. 优化Web检测缓存机制,减少重复HTTP请求 技术改进: - 重构插件适用性检查逻辑,确保策略过滤器正确工作 - 区分Web检测的自动发现模式和用户指定端口模式 - 在解析阶段正确处理host:port格式,避免与默认端口冲突 - 完善缓存机制,提升性能 测试验证: - ./fscan -h 127.0.0.1:3306 现在只检测3306端口 - 本地插件不再参与端口扫描 - Web检测只对指定端口进行协议检测 - 时间显示正确
76 lines
2.1 KiB
Go
76 lines
2.1 KiB
Go
package logging
|
|
|
|
import (
|
|
"fmt"
|
|
"time"
|
|
)
|
|
|
|
// StandardFormatter 标准日志格式化器
|
|
type StandardFormatter struct {
|
|
startTime time.Time
|
|
}
|
|
|
|
// NewStandardFormatter 创建标准格式化器
|
|
func NewStandardFormatter() *StandardFormatter {
|
|
return &StandardFormatter{
|
|
startTime: time.Now(),
|
|
}
|
|
}
|
|
|
|
// SetStartTime 设置开始时间
|
|
func (f *StandardFormatter) SetStartTime(startTime time.Time) {
|
|
f.startTime = startTime
|
|
}
|
|
|
|
// Format 格式化日志条目
|
|
func (f *StandardFormatter) Format(entry *LogEntry) string {
|
|
elapsed := time.Since(f.startTime)
|
|
timeStr := f.formatElapsedTime(elapsed)
|
|
prefix := f.getLevelPrefix(entry.Level)
|
|
|
|
return fmt.Sprintf("[%s] %s %s", timeStr, prefix, entry.Content)
|
|
}
|
|
|
|
// formatElapsedTime 格式化经过的时间
|
|
func (f *StandardFormatter) formatElapsedTime(elapsed time.Duration) string {
|
|
switch {
|
|
case elapsed < MaxMillisecondDisplay:
|
|
// 毫秒显示,不需要小数
|
|
return fmt.Sprintf("%dms", elapsed.Milliseconds())
|
|
case elapsed < MaxSecondDisplay:
|
|
// 秒显示,保留一位小数
|
|
return fmt.Sprintf("%.1fs", elapsed.Seconds())
|
|
case elapsed < MaxMinuteDisplay:
|
|
// 分钟和秒显示
|
|
minutes := int(elapsed.Minutes())
|
|
seconds := int(elapsed.Seconds()) % 60
|
|
return fmt.Sprintf("%dm%ds", minutes, seconds)
|
|
default:
|
|
// 小时、分钟和秒显示
|
|
hours := int(elapsed.Hours())
|
|
minutes := int(elapsed.Minutes()) % 60
|
|
seconds := int(elapsed.Seconds()) % 60
|
|
return fmt.Sprintf("%dh%dm%ds", hours, minutes, seconds)
|
|
}
|
|
}
|
|
|
|
// getLevelPrefix 获取日志级别前缀
|
|
func (f *StandardFormatter) getLevelPrefix(level LogLevel) string {
|
|
switch level {
|
|
case LevelSuccess:
|
|
return PrefixSuccess
|
|
case LevelInfo:
|
|
return PrefixInfo
|
|
case LevelError:
|
|
return PrefixError
|
|
default:
|
|
return PrefixDefault
|
|
}
|
|
}
|
|
|
|
// =============================================================================================
|
|
// 已删除的死代码(未使用):
|
|
// DetailedFormatter 及其 Format() 方法
|
|
// JSONFormatter 及其 SetStartTime() 和 Format() 方法
|
|
// =============================================================================================
|