mirror of
https://github.com/shadow1ng/fscan.git
synced 2025-07-13 12:52:44 +08:00
简化输出格式
This commit is contained in:
parent
faa9f319c8
commit
5aa2fd3599
139
Common/Log.go
139
Common/Log.go
@ -44,6 +44,7 @@ type LogEntry struct {
|
|||||||
const (
|
const (
|
||||||
LogLevelAll = "ALL" // 显示所有级别日志
|
LogLevelAll = "ALL" // 显示所有级别日志
|
||||||
LogLevelError = "ERROR" // 仅显示错误日志
|
LogLevelError = "ERROR" // 仅显示错误日志
|
||||||
|
LogLevelBase = "BASE" // 仅显示信息日志
|
||||||
LogLevelInfo = "INFO" // 仅显示信息日志
|
LogLevelInfo = "INFO" // 仅显示信息日志
|
||||||
LogLevelSuccess = "SUCCESS" // 仅显示成功日志
|
LogLevelSuccess = "SUCCESS" // 仅显示成功日志
|
||||||
LogLevelDebug = "DEBUG" // 仅显示调试日志
|
LogLevelDebug = "DEBUG" // 仅显示调试日志
|
||||||
@ -51,10 +52,11 @@ const (
|
|||||||
|
|
||||||
// 日志级别对应的显示颜色映射
|
// 日志级别对应的显示颜色映射
|
||||||
var logColors = map[string]color.Attribute{
|
var logColors = map[string]color.Attribute{
|
||||||
LogLevelError: color.FgRed, // 错误日志显示红色
|
LogLevelError: color.FgBlue, // 错误日志显示蓝色
|
||||||
LogLevelInfo: color.FgYellow, // 信息日志显示黄色
|
LogLevelBase: color.FgYellow, // 信息日志显示黄色
|
||||||
LogLevelSuccess: color.FgGreen, // 成功日志显示绿色
|
LogLevelInfo: color.FgGreen, // 信息日志显示绿色
|
||||||
LogLevelDebug: color.FgBlue, // 调试日志显示蓝色
|
LogLevelSuccess: color.FgRed, // 成功日志显示红色
|
||||||
|
LogLevelDebug: color.FgWhite, // 调试日志显示白色
|
||||||
}
|
}
|
||||||
|
|
||||||
// InitLogger 初始化日志系统
|
// InitLogger 初始化日志系统
|
||||||
@ -63,42 +65,50 @@ func InitLogger() {
|
|||||||
log.SetOutput(io.Discard)
|
log.SetOutput(io.Discard)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var StartTime = time.Now()
|
||||||
|
|
||||||
// formatLogMessage 格式化日志消息为标准格式
|
// formatLogMessage 格式化日志消息为标准格式
|
||||||
// 返回格式:[时间] [级别] 内容
|
// 返回格式:[时间] [级别] 内容
|
||||||
func formatLogMessage(entry *LogEntry) string {
|
func formatLogMessage(entry *LogEntry) string {
|
||||||
timeStr := entry.Time.Format("2006-01-02 15:04:05")
|
elapsed := time.Since(StartTime)
|
||||||
return fmt.Sprintf("[%s] [%s] %s", timeStr, entry.Level, entry.Content)
|
var timeStr string
|
||||||
|
|
||||||
|
// 根据时间长短选择合适的单位
|
||||||
|
switch {
|
||||||
|
case elapsed < time.Second:
|
||||||
|
// 毫秒显示,不需要小数
|
||||||
|
timeStr = fmt.Sprintf("%dms", elapsed.Milliseconds())
|
||||||
|
case elapsed < time.Minute:
|
||||||
|
// 秒显示,保留一位小数
|
||||||
|
timeStr = fmt.Sprintf("%.1fs", elapsed.Seconds())
|
||||||
|
case elapsed < time.Hour:
|
||||||
|
// 分钟和秒显示
|
||||||
|
minutes := int(elapsed.Minutes())
|
||||||
|
seconds := int(elapsed.Seconds()) % 60
|
||||||
|
timeStr = fmt.Sprintf("%dm%ds", minutes, seconds)
|
||||||
|
default:
|
||||||
|
// 小时、分钟和秒显示
|
||||||
|
hours := int(elapsed.Hours())
|
||||||
|
minutes := int(elapsed.Minutes()) % 60
|
||||||
|
seconds := int(elapsed.Seconds()) % 60
|
||||||
|
timeStr = fmt.Sprintf("%dh%dm%ds", hours, minutes, seconds)
|
||||||
|
}
|
||||||
|
str := " "
|
||||||
|
switch entry.Level {
|
||||||
|
case LogLevelSuccess:
|
||||||
|
str = "[+]"
|
||||||
|
case LogLevelInfo:
|
||||||
|
str = "[*]"
|
||||||
|
case LogLevelError:
|
||||||
|
str = "[-]"
|
||||||
|
}
|
||||||
|
|
||||||
|
return fmt.Sprintf("[%s] %s %s", timeStr, str, entry.Content)
|
||||||
}
|
}
|
||||||
|
|
||||||
// printLog 根据日志级别打印日志
|
// printLog 根据日志级别打印日志
|
||||||
func printLog(entry *LogEntry) {
|
func printLog(entry *LogEntry) {
|
||||||
// 根据当前设置的日志级别过滤日志
|
if LogLevel != "debug" && entry.Level == LogLevelDebug {
|
||||||
shouldPrint := false
|
|
||||||
switch LogLevel {
|
|
||||||
case LogLevelDebug:
|
|
||||||
// DEBUG级别显示所有日志
|
|
||||||
shouldPrint = true
|
|
||||||
case LogLevelError:
|
|
||||||
// ERROR级别显示 ERROR、SUCCESS、INFO
|
|
||||||
shouldPrint = entry.Level == LogLevelError ||
|
|
||||||
entry.Level == LogLevelSuccess ||
|
|
||||||
entry.Level == LogLevelInfo
|
|
||||||
case LogLevelSuccess:
|
|
||||||
// SUCCESS级别显示 SUCCESS、INFO
|
|
||||||
shouldPrint = entry.Level == LogLevelSuccess ||
|
|
||||||
entry.Level == LogLevelInfo
|
|
||||||
case LogLevelInfo:
|
|
||||||
// INFO级别只显示 INFO
|
|
||||||
shouldPrint = entry.Level == LogLevelInfo
|
|
||||||
case LogLevelAll:
|
|
||||||
// ALL显示所有日志
|
|
||||||
shouldPrint = true
|
|
||||||
default:
|
|
||||||
// 默认只显示 INFO
|
|
||||||
shouldPrint = entry.Level == LogLevelInfo
|
|
||||||
}
|
|
||||||
|
|
||||||
if !shouldPrint {
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -141,27 +151,6 @@ func clearAndWaitProgress() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// LogError 记录错误日志,自动包含文件名和行号信息
|
|
||||||
func LogError(errMsg string) {
|
|
||||||
// 获取调用者的文件名和行号
|
|
||||||
_, file, line, ok := runtime.Caller(1)
|
|
||||||
if !ok {
|
|
||||||
file = "unknown"
|
|
||||||
line = 0
|
|
||||||
}
|
|
||||||
file = filepath.Base(file)
|
|
||||||
|
|
||||||
errorMsg := fmt.Sprintf("%s:%d - %s", file, line, errMsg)
|
|
||||||
|
|
||||||
entry := &LogEntry{
|
|
||||||
Level: LogLevelError,
|
|
||||||
Time: time.Now(),
|
|
||||||
Content: errorMsg,
|
|
||||||
}
|
|
||||||
|
|
||||||
handleLog(entry)
|
|
||||||
}
|
|
||||||
|
|
||||||
// handleLog 统一处理日志的输出
|
// handleLog 统一处理日志的输出
|
||||||
func handleLog(entry *LogEntry) {
|
func handleLog(entry *LogEntry) {
|
||||||
if ProgressBar != nil {
|
if ProgressBar != nil {
|
||||||
@ -175,6 +164,24 @@ func handleLog(entry *LogEntry) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// LogDebug 记录调试日志
|
||||||
|
func LogDebug(msg string) {
|
||||||
|
handleLog(&LogEntry{
|
||||||
|
Level: LogLevelDebug,
|
||||||
|
Time: time.Now(),
|
||||||
|
Content: msg,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// LogInfo 记录进度信息
|
||||||
|
func LogBase(msg string) {
|
||||||
|
handleLog(&LogEntry{
|
||||||
|
Level: LogLevelBase,
|
||||||
|
Time: time.Now(),
|
||||||
|
Content: msg,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
// LogInfo 记录信息日志
|
// LogInfo 记录信息日志
|
||||||
func LogInfo(msg string) {
|
func LogInfo(msg string) {
|
||||||
handleLog(&LogEntry{
|
handleLog(&LogEntry{
|
||||||
@ -200,13 +207,25 @@ func LogSuccess(result string) {
|
|||||||
status.mu.Unlock()
|
status.mu.Unlock()
|
||||||
}
|
}
|
||||||
|
|
||||||
// LogDebug 记录调试日志
|
// LogError 记录错误日志,自动包含文件名和行号信息
|
||||||
func LogDebug(msg string) {
|
func LogError(errMsg string) {
|
||||||
handleLog(&LogEntry{
|
// 获取调用者的文件名和行号
|
||||||
Level: LogLevelDebug,
|
_, file, line, ok := runtime.Caller(1)
|
||||||
|
if !ok {
|
||||||
|
file = "unknown"
|
||||||
|
line = 0
|
||||||
|
}
|
||||||
|
file = filepath.Base(file)
|
||||||
|
|
||||||
|
errorMsg := fmt.Sprintf("%s:%d - %s", file, line, errMsg)
|
||||||
|
|
||||||
|
entry := &LogEntry{
|
||||||
|
Level: LogLevelError,
|
||||||
Time: time.Now(),
|
Time: time.Now(),
|
||||||
Content: msg,
|
Content: errorMsg,
|
||||||
})
|
}
|
||||||
|
|
||||||
|
handleLog(entry)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CheckErrs 检查是否为需要重试的错误
|
// CheckErrs 检查是否为需要重试的错误
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
package Common
|
package Common
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"sort"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"sort"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// ParsePort 解析端口配置字符串为端口号列表
|
// ParsePort 解析端口配置字符串为端口号列表
|
||||||
@ -73,7 +73,7 @@ func ParsePort(ports string) []int {
|
|||||||
scanPorts = removeDuplicate(scanPorts)
|
scanPorts = removeDuplicate(scanPorts)
|
||||||
sort.Ints(scanPorts)
|
sort.Ints(scanPorts)
|
||||||
|
|
||||||
LogInfo(GetText("valid_port_count", len(scanPorts)))
|
LogBase(GetText("valid_port_count", len(scanPorts)))
|
||||||
return scanPorts
|
return scanPorts
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -97,7 +97,7 @@ func probeWithICMP(hostslist []string, chanHosts chan string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Common.LogError(Common.GetText("icmp_listen_failed", err))
|
Common.LogError(Common.GetText("icmp_listen_failed", err))
|
||||||
Common.LogInfo(Common.GetText("trying_no_listen_icmp"))
|
Common.LogBase(Common.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)
|
||||||
@ -108,8 +108,8 @@ func probeWithICMP(hostslist []string, chanHosts chan string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Common.LogError(Common.GetText("icmp_connect_failed", err))
|
Common.LogError(Common.GetText("icmp_connect_failed", err))
|
||||||
Common.LogInfo(Common.GetText("insufficient_privileges"))
|
Common.LogBase(Common.GetText("insufficient_privileges"))
|
||||||
Common.LogInfo(Common.GetText("switching_to_ping"))
|
Common.LogBase(Common.GetText("switching_to_ping"))
|
||||||
|
|
||||||
// 降级使用ping探测
|
// 降级使用ping探测
|
||||||
RunPing(hostslist, chanHosts)
|
RunPing(hostslist, chanHosts)
|
||||||
|
@ -92,8 +92,8 @@ var (
|
|||||||
|
|
||||||
// LocalInfoScan 本地信息收集主函数
|
// LocalInfoScan 本地信息收集主函数
|
||||||
func LocalInfoScan(info *Common.HostInfo) (err error) {
|
func LocalInfoScan(info *Common.HostInfo) (err error) {
|
||||||
Common.LogInfo("开始本地信息收集...")
|
Common.LogBase("开始本地信息收集...")
|
||||||
|
|
||||||
// 获取用户主目录
|
// 获取用户主目录
|
||||||
home, err := os.UserHomeDir()
|
home, err := os.UserHomeDir()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -107,7 +107,7 @@ func LocalInfoScan(info *Common.HostInfo) (err error) {
|
|||||||
// 根据规则搜索敏感文件
|
// 根据规则搜索敏感文件
|
||||||
searchSensitiveFiles()
|
searchSensitiveFiles()
|
||||||
|
|
||||||
Common.LogInfo("本地信息收集完成")
|
Common.LogBase("本地信息收集完成")
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user