mirror of
https://github.com/shadow1ng/fscan.git
synced 2026-09-27 05:31:53 +08:00
refactor(logging): 统一日志前缀,删除废弃的 LogBase
- 删除 LogBase 函数,所有调用迁移到 LogInfo/LogError - 新增 PrefixDebug ([.]) 前缀,所有日志级别现在都有前缀 - 修复日志输出缩进不一致的问题 - 删除未使用的 PrefixDefault 常量
This commit is contained in:
+1
-1
@@ -283,7 +283,7 @@ func checkParameterConflicts() error {
|
|||||||
|
|
||||||
// 检查 -ao 和 -m icmp 同时指定的情况(向后兼容提示)
|
// 检查 -ao 和 -m icmp 同时指定的情况(向后兼容提示)
|
||||||
if fv.AliveOnly && fv.ScanMode == "icmp" {
|
if fv.AliveOnly && fv.ScanMode == "icmp" {
|
||||||
LogBase(i18n.GetText("param_conflict_ao_icmp_both"))
|
LogInfo(i18n.GetText("param_conflict_ao_icmp_both"))
|
||||||
}
|
}
|
||||||
|
|
||||||
// 检查本地插件参数
|
// 检查本地插件参数
|
||||||
|
|||||||
@@ -66,9 +66,6 @@ func InitLogger() {
|
|||||||
// LogDebug 输出调试日志
|
// LogDebug 输出调试日志
|
||||||
func LogDebug(msg string) { getGlobalLogger().Debug(msg) }
|
func LogDebug(msg string) { getGlobalLogger().Debug(msg) }
|
||||||
|
|
||||||
// LogBase 输出基础日志
|
|
||||||
func LogBase(msg string) { getGlobalLogger().Base(msg) }
|
|
||||||
|
|
||||||
// LogInfo 输出信息日志
|
// LogInfo 输出信息日志
|
||||||
func LogInfo(msg string) { getGlobalLogger().Info(msg) }
|
func LogInfo(msg string) { getGlobalLogger().Info(msg) }
|
||||||
|
|
||||||
|
|||||||
@@ -60,16 +60,16 @@ const (
|
|||||||
// =============================================================================
|
// =============================================================================
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
// PrefixDebug 调试日志前缀
|
||||||
|
PrefixDebug = "[.]"
|
||||||
|
// PrefixInfo 信息日志前缀
|
||||||
|
PrefixInfo = "[*]"
|
||||||
// PrefixSuccess 成功日志前缀
|
// PrefixSuccess 成功日志前缀
|
||||||
PrefixSuccess = "[+]"
|
PrefixSuccess = "[+]"
|
||||||
// PrefixVuln 漏洞/重要发现前缀
|
// PrefixVuln 漏洞/重要发现前缀
|
||||||
PrefixVuln = "[!]"
|
PrefixVuln = "[!]"
|
||||||
// PrefixInfo 信息日志前缀
|
|
||||||
PrefixInfo = "[*]"
|
|
||||||
// PrefixError 错误日志前缀
|
// PrefixError 错误日志前缀
|
||||||
PrefixError = "[-]"
|
PrefixError = "[-]"
|
||||||
// PrefixDefault 默认日志前缀
|
|
||||||
PrefixDefault = " "
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// =============================================================================
|
// =============================================================================
|
||||||
|
|||||||
@@ -201,15 +201,17 @@ func (l *Logger) formatElapsedTime(elapsed time.Duration) string {
|
|||||||
// getLevelPrefix 获取日志级别前缀
|
// getLevelPrefix 获取日志级别前缀
|
||||||
func (l *Logger) getLevelPrefix(level LogLevel) string {
|
func (l *Logger) getLevelPrefix(level LogLevel) string {
|
||||||
switch level {
|
switch level {
|
||||||
case LevelVuln:
|
case LevelDebug:
|
||||||
return PrefixVuln
|
return PrefixDebug
|
||||||
case LevelSuccess:
|
|
||||||
return PrefixSuccess
|
|
||||||
case LevelInfo:
|
case LevelInfo:
|
||||||
return PrefixInfo
|
return PrefixInfo
|
||||||
|
case LevelSuccess:
|
||||||
|
return PrefixSuccess
|
||||||
|
case LevelVuln:
|
||||||
|
return PrefixVuln
|
||||||
case LevelError:
|
case LevelError:
|
||||||
return PrefixError
|
return PrefixError
|
||||||
default:
|
default:
|
||||||
return PrefixDefault
|
return PrefixInfo // 默认使用 Info 前缀
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -137,14 +137,14 @@ func TestLogger_AllLevels(t *testing.T) {
|
|||||||
logFunc: logger.Debug,
|
logFunc: logger.Debug,
|
||||||
message: "debug message",
|
message: "debug message",
|
||||||
wantMsg: "debug message",
|
wantMsg: "debug message",
|
||||||
wantPfx: PrefixDefault,
|
wantPfx: PrefixDebug,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Base级别",
|
name: "Base级别",
|
||||||
logFunc: logger.Base,
|
logFunc: logger.Base,
|
||||||
message: "base message",
|
message: "base message",
|
||||||
wantMsg: "base message",
|
wantMsg: "base message",
|
||||||
wantPfx: PrefixDefault,
|
wantPfx: PrefixInfo, // Base 已废弃,默认使用 Info 前缀
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Info级别",
|
name: "Info级别",
|
||||||
|
|||||||
@@ -237,9 +237,9 @@ func (b *BaseScanStrategy) LogScanStart() {
|
|||||||
// 仅在本地/Web等特殊模式下显示
|
// 仅在本地/Web等特殊模式下显示
|
||||||
switch b.filterType {
|
switch b.filterType {
|
||||||
case FilterLocal:
|
case FilterLocal:
|
||||||
common.LogBase(i18n.GetText("start_local_scan"))
|
common.LogInfo(i18n.GetText("start_local_scan"))
|
||||||
case FilterWeb:
|
case FilterWeb:
|
||||||
common.LogBase(i18n.GetText("start_web_scan"))
|
common.LogInfo(i18n.GetText("start_web_scan"))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+4
-4
@@ -137,7 +137,7 @@ func probeWithICMP(hostslist []string, chanHosts chan string, aliveHosts *[]stri
|
|||||||
}
|
}
|
||||||
|
|
||||||
common.LogError(i18n.Tr("icmp_listen_failed", err))
|
common.LogError(i18n.Tr("icmp_listen_failed", err))
|
||||||
common.LogBase(i18n.GetText("trying_no_listen_icmp"))
|
common.LogInfo(i18n.GetText("trying_no_listen_icmp"))
|
||||||
|
|
||||||
// 尝试无监听ICMP探测
|
// 尝试无监听ICMP探测
|
||||||
conn2, err := net.DialTimeout("ip4:icmp", "127.0.0.1", 3*time.Second)
|
conn2, err := net.DialTimeout("ip4:icmp", "127.0.0.1", 3*time.Second)
|
||||||
@@ -147,9 +147,9 @@ func probeWithICMP(hostslist []string, chanHosts chan string, aliveHosts *[]stri
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
common.LogBase(i18n.Tr("icmp_connect_failed", err))
|
common.LogError(i18n.Tr("icmp_connect_failed", err))
|
||||||
common.LogBase(i18n.GetText("insufficient_privileges"))
|
common.LogError(i18n.GetText("insufficient_privileges"))
|
||||||
common.LogBase(i18n.GetText("switching_to_ping"))
|
common.LogInfo(i18n.GetText("switching_to_ping"))
|
||||||
|
|
||||||
// 降级使用ping探测
|
// 降级使用ping探测
|
||||||
RunPing(hostslist, chanHosts, livewg)
|
RunPing(hostslist, chanHosts, livewg)
|
||||||
|
|||||||
@@ -24,9 +24,9 @@ func NewLocalScanStrategy() *LocalScanStrategy {
|
|||||||
func (s *LocalScanStrategy) LogPluginInfo(config *common.Config) {
|
func (s *LocalScanStrategy) LogPluginInfo(config *common.Config) {
|
||||||
localPlugin := config.LocalPlugin
|
localPlugin := config.LocalPlugin
|
||||||
if localPlugin != "" {
|
if localPlugin != "" {
|
||||||
common.LogBase(i18n.Tr("local_plugin_info", localPlugin))
|
common.LogInfo(i18n.Tr("local_plugin_info", localPlugin))
|
||||||
} else {
|
} else {
|
||||||
common.LogBase(i18n.GetText("local_plugin_not_specified"))
|
common.LogError(i18n.GetText("local_plugin_not_specified"))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -54,7 +54,7 @@ func (s *LocalScanStrategy) Execute(config *common.Config, state *common.State,
|
|||||||
// 验证本地插件是否存在
|
// 验证本地插件是否存在
|
||||||
if config.LocalPlugin != "" {
|
if config.LocalPlugin != "" {
|
||||||
if !plugins.Exists(config.LocalPlugin) {
|
if !plugins.Exists(config.LocalPlugin) {
|
||||||
common.LogBase(i18n.Tr("local_plugin_not_found", config.LocalPlugin))
|
common.LogError(i18n.Tr("local_plugin_not_found", config.LocalPlugin))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-4
@@ -213,7 +213,7 @@ func EnhancedPortScan(hosts []string, ports string, timeout int64, config *commo
|
|||||||
|
|
||||||
// 检查代理可靠性,如果存在全回显问题则警告
|
// 检查代理可靠性,如果存在全回显问题则警告
|
||||||
if common.IsProxyEnabled() && !common.IsProxyReliable() {
|
if common.IsProxyEnabled() && !common.IsProxyReliable() {
|
||||||
common.LogBase("[!] 检测到代理存在全回显问题,端口扫描结果可能不准确")
|
common.LogError("检测到代理存在全回显问题,端口扫描结果可能不准确")
|
||||||
}
|
}
|
||||||
|
|
||||||
// 创建流式迭代器(O(1) 内存,端口喷洒策略)
|
// 创建流式迭代器(O(1) 内存,端口喷洒策略)
|
||||||
@@ -226,12 +226,12 @@ func EnhancedPortScan(hosts []string, ports string, timeout int64, config *commo
|
|||||||
|
|
||||||
// 大规模扫描警告和线程数自动调整
|
// 大规模扫描警告和线程数自动调整
|
||||||
if totalTasks > 100000 {
|
if totalTasks > 100000 {
|
||||||
common.LogBase(fmt.Sprintf("[*] 大规模扫描: %d 个目标 (%d主机 × %d端口)", totalTasks, len(hosts), len(portList)))
|
common.LogInfo(fmt.Sprintf("大规模扫描: %d 个目标 (%d主机 × %d端口)", totalTasks, len(hosts), len(portList)))
|
||||||
// 如果任务数超过100万且线程数大于300,自动降低线程数
|
// 如果任务数超过100万且线程数大于300,自动降低线程数
|
||||||
if totalTasks > 1000000 && threadNum > 300 {
|
if totalTasks > 1000000 && threadNum > 300 {
|
||||||
oldThreadNum := threadNum
|
oldThreadNum := threadNum
|
||||||
threadNum = 300
|
threadNum = 300
|
||||||
common.LogBase(fmt.Sprintf("[*] 自动调整线程数: %d -> %d (大规模扫描优化)", oldThreadNum, threadNum))
|
common.LogInfo(fmt.Sprintf("自动调整线程数: %d -> %d (大规模扫描优化)", oldThreadNum, threadNum))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -285,7 +285,7 @@ func EnhancedPortScan(hosts []string, ports string, timeout int64, config *commo
|
|||||||
common.FinishProgressBar()
|
common.FinishProgressBar()
|
||||||
}
|
}
|
||||||
|
|
||||||
common.LogBase(i18n.Tr("port_scan_complete", count))
|
common.LogInfo(i18n.Tr("port_scan_complete", count))
|
||||||
|
|
||||||
// 检查扫描失败率,如果过高则警告用户
|
// 检查扫描失败率,如果过高则警告用户
|
||||||
resourceErrors := state.GetResourceExhaustedCount()
|
resourceErrors := state.GetResourceExhaustedCount()
|
||||||
|
|||||||
+6
-6
@@ -96,21 +96,21 @@ func RunScan(info common.HostInfo, config *common.Config, state *common.State) {
|
|||||||
// 检查是否有活跃的连接需要维持
|
// 检查是否有活跃的连接需要维持
|
||||||
if state.IsReverseShellActive() || state.IsSocks5ProxyActive() || state.IsForwardShellActive() {
|
if state.IsReverseShellActive() || state.IsSocks5ProxyActive() || state.IsForwardShellActive() {
|
||||||
if state.IsReverseShellActive() {
|
if state.IsReverseShellActive() {
|
||||||
common.LogBase(i18n.GetText("active_reverse_shell"))
|
common.LogInfo(i18n.GetText("active_reverse_shell"))
|
||||||
}
|
}
|
||||||
if state.IsSocks5ProxyActive() {
|
if state.IsSocks5ProxyActive() {
|
||||||
common.LogBase(i18n.GetText("active_socks5_proxy"))
|
common.LogInfo(i18n.GetText("active_socks5_proxy"))
|
||||||
}
|
}
|
||||||
if state.IsForwardShellActive() {
|
if state.IsForwardShellActive() {
|
||||||
common.LogBase(i18n.GetText("active_forward_shell"))
|
common.LogInfo(i18n.GetText("active_forward_shell"))
|
||||||
}
|
}
|
||||||
common.LogBase(i18n.GetText("press_ctrl_c_exit"))
|
common.LogInfo(i18n.GetText("press_ctrl_c_exit"))
|
||||||
|
|
||||||
// 优雅等待信号
|
// 优雅等待信号
|
||||||
sigChan := make(chan os.Signal, 1)
|
sigChan := make(chan os.Signal, 1)
|
||||||
signal.Notify(sigChan, os.Interrupt, syscall.SIGTERM)
|
signal.Notify(sigChan, os.Interrupt, syscall.SIGTERM)
|
||||||
<-sigChan
|
<-sigChan
|
||||||
common.LogBase(i18n.GetText("received_exit_signal"))
|
common.LogInfo(i18n.GetText("received_exit_signal"))
|
||||||
}
|
}
|
||||||
|
|
||||||
// 完成扫描
|
// 完成扫描
|
||||||
@@ -125,7 +125,7 @@ func finishScan(config *common.Config, state *common.State) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 输出扫描完成信息
|
// 输出扫描完成信息
|
||||||
common.LogBase(i18n.Tr("scan_task_complete", time.Since(state.GetStartTime()).Round(time.Millisecond), state.GetNum()))
|
common.LogInfo(i18n.Tr("scan_task_complete", time.Since(state.GetStartTime()).Round(time.Millisecond), state.GetNum()))
|
||||||
|
|
||||||
// 输出性能统计 JSON(如果启用)
|
// 输出性能统计 JSON(如果启用)
|
||||||
if config.Output.PerfStats {
|
if config.Output.PerfStats {
|
||||||
|
|||||||
@@ -70,12 +70,12 @@ func (s *ServiceScanStrategy) showPluginsForSpecifiedPorts(config *common.Config
|
|||||||
if len(applicablePlugins) > 0 {
|
if len(applicablePlugins) > 0 {
|
||||||
pluginStr := formatPluginList(applicablePlugins)
|
pluginStr := formatPluginList(applicablePlugins)
|
||||||
if isCustomMode {
|
if isCustomMode {
|
||||||
common.LogBase(i18n.Tr("service_plugin_custom", pluginStr))
|
common.LogInfo(i18n.Tr("service_plugin_custom", pluginStr))
|
||||||
} else {
|
} else {
|
||||||
common.LogBase(i18n.Tr("service_plugin_info", pluginStr))
|
common.LogInfo(i18n.Tr("service_plugin_info", pluginStr))
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
common.LogBase(i18n.GetText("service_plugin_none"))
|
common.LogInfo(i18n.GetText("service_plugin_none"))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -201,9 +201,9 @@ func (s *ServiceScanStrategy) LogVulnerabilityPluginInfo(targets []common.HostIn
|
|||||||
|
|
||||||
// 输出插件信息
|
// 输出插件信息
|
||||||
if len(servicePlugins) > 0 {
|
if len(servicePlugins) > 0 {
|
||||||
common.LogBase(i18n.Tr("service_plugin_info", strings.Join(servicePlugins, ", ")))
|
common.LogInfo(i18n.Tr("service_plugin_info", strings.Join(servicePlugins, ", ")))
|
||||||
} else {
|
} else {
|
||||||
common.LogBase(i18n.GetText("scan_no_service_plugins"))
|
common.LogInfo(i18n.GetText("scan_no_service_plugins"))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -227,7 +227,7 @@ func (s *ServiceScanStrategy) discoverTargets(hostInput string, baseInfo common.
|
|||||||
// 主机存活检测
|
// 主机存活检测
|
||||||
if s.shouldPerformLivenessCheck(hosts, config) {
|
if s.shouldPerformLivenessCheck(hosts, config) {
|
||||||
hosts = CheckLive(hosts, false, config, state)
|
hosts = CheckLive(hosts, false, config, state)
|
||||||
common.LogBase(i18n.Tr("alive_hosts_count_info", len(hosts)))
|
common.LogInfo(i18n.Tr("alive_hosts_count_info", len(hosts)))
|
||||||
}
|
}
|
||||||
|
|
||||||
// 端口扫描
|
// 端口扫描
|
||||||
@@ -253,7 +253,7 @@ func (s *ServiceScanStrategy) discoverAlivePorts(hosts []string, config *common.
|
|||||||
hostPorts := state.GetHostPorts()
|
hostPorts := state.GetHostPorts()
|
||||||
if len(hostPorts) > 0 {
|
if len(hostPorts) > 0 {
|
||||||
alivePorts = hostPorts
|
alivePorts = hostPorts
|
||||||
common.LogBase(i18n.Tr("alive_ports_count", len(alivePorts)))
|
common.LogInfo(i18n.Tr("alive_ports_count", len(alivePorts)))
|
||||||
state.ClearHostPorts()
|
state.ClearHostPorts()
|
||||||
return alivePorts
|
return alivePorts
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ func main() {
|
|||||||
signal.Notify(sigChan, os.Interrupt, syscall.SIGTERM)
|
signal.Notify(sigChan, os.Interrupt, syscall.SIGTERM)
|
||||||
go func() {
|
go func() {
|
||||||
<-sigChan
|
<-sigChan
|
||||||
common.LogBase(i18n.GetText("received_exit_signal"))
|
common.LogInfo(i18n.GetText("received_exit_signal"))
|
||||||
_ = common.Cleanup() // 确保结果写入磁盘
|
_ = common.Cleanup() // 确保结果写入磁盘
|
||||||
os.Exit(130) // 128 + SIGINT(2) = 130,标准的中断退出码
|
os.Exit(130) // 128 + SIGINT(2) = 130,标准的中断退出码
|
||||||
}()
|
}()
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ func (p *Socks5ProxyPlugin) Scan(ctx context.Context, info *common.HostInfo, con
|
|||||||
output.WriteString(fmt.Sprintf("监听端口: %d\n", port))
|
output.WriteString(fmt.Sprintf("监听端口: %d\n", port))
|
||||||
output.WriteString(fmt.Sprintf("平台: %s\n\n", runtime.GOOS))
|
output.WriteString(fmt.Sprintf("平台: %s\n\n", runtime.GOOS))
|
||||||
|
|
||||||
common.LogBase(i18n.Tr("socks5_starting", port))
|
common.LogInfo(i18n.Tr("socks5_starting", port))
|
||||||
|
|
||||||
// 启动SOCKS5代理服务器
|
// 启动SOCKS5代理服务器
|
||||||
err := p.startSocks5Server(ctx, port, state)
|
err := p.startSocks5Server(ctx, port, state)
|
||||||
@@ -96,7 +96,7 @@ func (p *Socks5ProxyPlugin) startSocks5Server(ctx context.Context, port int, sta
|
|||||||
for {
|
for {
|
||||||
select {
|
select {
|
||||||
case <-ctx.Done():
|
case <-ctx.Done():
|
||||||
common.LogBase(i18n.GetText("socks5_cancelled"))
|
common.LogInfo(i18n.GetText("socks5_cancelled"))
|
||||||
return ctx.Err()
|
return ctx.Err()
|
||||||
default:
|
default:
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -85,7 +85,7 @@ func StartServer(port int) error {
|
|||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
<-quit
|
<-quit
|
||||||
common.LogBase(i18n.GetText("web_shutting_down"))
|
common.LogInfo(i18n.GetText("web_shutting_down"))
|
||||||
|
|
||||||
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
|
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
|
||||||
defer cancel()
|
defer cancel()
|
||||||
@@ -98,7 +98,7 @@ func StartServer(port int) error {
|
|||||||
|
|
||||||
// 启动服务器
|
// 启动服务器
|
||||||
common.LogSuccess(i18n.Tr("web_server_started", port))
|
common.LogSuccess(i18n.Tr("web_server_started", port))
|
||||||
common.LogBase(fmt.Sprintf("http://localhost:%d", port))
|
fmt.Printf(" http://localhost:%d\n", port)
|
||||||
|
|
||||||
if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
|
if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
|
||||||
return fmt.Errorf("server error: %w", err)
|
return fmt.Errorf("server error: %w", err)
|
||||||
|
|||||||
+1
-1
@@ -304,7 +304,7 @@ func loadPocsConcurrently(pocFiles []string, isEmbedded bool, pocPath string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
wg.Wait()
|
wg.Wait()
|
||||||
common.LogBase(i18n.Tr("poc_load_complete", pocCount, successCount, failCount))
|
common.LogInfo(i18n.Tr("poc_load_complete", pocCount, successCount, failCount))
|
||||||
}
|
}
|
||||||
|
|
||||||
// directoryExists 检查目录是否存在
|
// directoryExists 检查目录是否存在
|
||||||
|
|||||||
Reference in New Issue
Block a user