进一步简化日志, 提供-v参数开启详细日志

This commit is contained in:
M09Ic 2024-02-08 14:57:33 +08:00
parent cea66e69e0
commit 007ff96478
7 changed files with 63 additions and 32 deletions

View File

@ -17,7 +17,7 @@ import (
"time" "time"
) )
var ver = "" var ver = "v0.9.3"
func Spray() { func Spray() {
var option internal.Option var option internal.Option
@ -79,13 +79,19 @@ func Spray() {
} }
} }
} }
// 一些全局变量初始化 // logs
logs.AddLevel(internal.LogVerbose, "verbose", "[=] %s {{suffix}}")
if option.Debug { if option.Debug {
logs.Log.SetLevel(logs.Debug) logs.Log.SetLevel(logs.Debug)
} }
logs.DefaultColorMap[logs.Info] = logs.PurpleBold logs.Log.SetColorMap(map[logs.Level]func(string) string{
logs.DefaultColorMap[logs.Important] = logs.GreenBold logs.Info: logs.PurpleBold,
logs.Important: logs.GreenBold,
internal.LogVerbose: logs.Green,
})
// 初始化全局变量
pkg.Distance = uint8(option.SimhashDistance) pkg.Distance = uint8(option.SimhashDistance)
ihttp.DefaultMaxBodySize = option.MaxBodyLength * 1024 ihttp.DefaultMaxBodySize = option.MaxBodyLength * 1024
internal.MaxCrawl = option.CrawlDepth internal.MaxCrawl = option.CrawlDepth

2
go.mod
View File

@ -8,7 +8,7 @@ require (
github.com/antonmedv/expr v1.12.5 github.com/antonmedv/expr v1.12.5
github.com/chainreactors/files v0.0.0-20231123083421-cea5b4ad18a8 github.com/chainreactors/files v0.0.0-20231123083421-cea5b4ad18a8
github.com/chainreactors/gogo/v2 v2.11.12-0.20231228061950-116583962e30 github.com/chainreactors/gogo/v2 v2.11.12-0.20231228061950-116583962e30
github.com/chainreactors/logs v0.0.0-20231220102821-19f082ce37c1 github.com/chainreactors/logs v0.0.0-20240207121836-c946f072f81f
github.com/chainreactors/parsers v0.0.0-20231227070753-8cda94b96b6c github.com/chainreactors/parsers v0.0.0-20231227070753-8cda94b96b6c
github.com/chainreactors/utils v0.0.0-20231031063336-9477f1b23886 github.com/chainreactors/utils v0.0.0-20231031063336-9477f1b23886
github.com/chainreactors/words v0.4.1-0.20240206181137-09f7a0bc8f50 github.com/chainreactors/words v0.4.1-0.20240206181137-09f7a0bc8f50

6
go.sum
View File

@ -14,6 +14,12 @@ github.com/chainreactors/gogo/v2 v2.11.12-0.20231228061950-116583962e30/go.mod h
github.com/chainreactors/logs v0.0.0-20231027080134-7a11bb413460/go.mod h1:VZFqkFDGmp7/JOMeraW+YI7kTGcgz9fgc/HArVFnrGQ= github.com/chainreactors/logs v0.0.0-20231027080134-7a11bb413460/go.mod h1:VZFqkFDGmp7/JOMeraW+YI7kTGcgz9fgc/HArVFnrGQ=
github.com/chainreactors/logs v0.0.0-20231220102821-19f082ce37c1 h1:y4xbdWsmBu1aAyYez1rBN5mgFdAtPViNrsObu1aWbuk= github.com/chainreactors/logs v0.0.0-20231220102821-19f082ce37c1 h1:y4xbdWsmBu1aAyYez1rBN5mgFdAtPViNrsObu1aWbuk=
github.com/chainreactors/logs v0.0.0-20231220102821-19f082ce37c1/go.mod h1:6Mv6W70JrtL6VClulZhmMRZnoYpcTahcDTKLMNEjK0o= github.com/chainreactors/logs v0.0.0-20231220102821-19f082ce37c1/go.mod h1:6Mv6W70JrtL6VClulZhmMRZnoYpcTahcDTKLMNEjK0o=
github.com/chainreactors/logs v0.0.0-20240207114427-8450f3309979 h1:y3xOkts71C7nyzjE05lcOK7YlHuPdnZgES6by7+FeIg=
github.com/chainreactors/logs v0.0.0-20240207114427-8450f3309979/go.mod h1:6Mv6W70JrtL6VClulZhmMRZnoYpcTahcDTKLMNEjK0o=
github.com/chainreactors/logs v0.0.0-20240207115900-a28fc4021dad h1:43Xu1WaPWqeawpUSPlv7OYrEvOOEi0euQuOikgIvDRc=
github.com/chainreactors/logs v0.0.0-20240207115900-a28fc4021dad/go.mod h1:6Mv6W70JrtL6VClulZhmMRZnoYpcTahcDTKLMNEjK0o=
github.com/chainreactors/logs v0.0.0-20240207121836-c946f072f81f h1:tcfp+CEdgiMvjyUzWab5edJtxUwRMSMEIkLybupIx0k=
github.com/chainreactors/logs v0.0.0-20240207121836-c946f072f81f/go.mod h1:6Mv6W70JrtL6VClulZhmMRZnoYpcTahcDTKLMNEjK0o=
github.com/chainreactors/neutron v0.0.0-20231221064706-fd6aaac9c50b/go.mod h1:Q6xCl+KaPtCDIziAHegFxdHOvg6DgpA6hcUWRnQKDPk= github.com/chainreactors/neutron v0.0.0-20231221064706-fd6aaac9c50b/go.mod h1:Q6xCl+KaPtCDIziAHegFxdHOvg6DgpA6hcUWRnQKDPk=
github.com/chainreactors/parsers v0.0.0-20231218072716-fb441aff745f/go.mod h1:ZHEkgxKf9DXoley2LUjdJkiSw08MC3vcJTxfqwYt2LU= github.com/chainreactors/parsers v0.0.0-20231218072716-fb441aff745f/go.mod h1:ZHEkgxKf9DXoley2LUjdJkiSw08MC3vcJTxfqwYt2LU=
github.com/chainreactors/parsers v0.0.0-20231220104848-3a0b5a5bd8dc/go.mod h1:V2w16sBSSiBlmsDR4A0Q9PIk9+TP/6coTXv6olvTI6M= github.com/chainreactors/parsers v0.0.0-20231220104848-3a0b5a5bd8dc/go.mod h1:V2w16sBSSiBlmsDR4A0Q9PIk9+TP/6coTXv6olvTI6M=

View File

@ -22,9 +22,7 @@ import (
var ( var (
DefaultThreads = 20 DefaultThreads = 20
//DefaultTimeout = 5 LogVerbose = logs.Warn - 1
//DefaultPoolSize = 5
//DefaultRateLimit = 0
) )
type Option struct { type Option struct {
@ -120,7 +118,7 @@ type ModeOptions struct {
FuzzyStatus string `long:"fuzzy-status" default:"404,403,500,501,502,503" description:"Strings (comma split), custom fuzzy status"` FuzzyStatus string `long:"fuzzy-status" default:"404,403,500,501,502,503" description:"Strings (comma split), custom fuzzy status"`
UniqueStatus string `long:"unique-status" default:"403" description:"Strings (comma split), custom unique status"` UniqueStatus string `long:"unique-status" default:"403" description:"Strings (comma split), custom unique status"`
Unique bool `long:"unique" description:"Bool, unique response"` Unique bool `long:"unique" description:"Bool, unique response"`
RetryCount int `long:"retry" default:"1" description:"Int, retry count"` RetryCount int `long:"retry" default:"0" description:"Int, retry count"`
SimhashDistance int `long:"distance" default:"5"` SimhashDistance int `long:"distance" default:"5"`
} }
@ -132,7 +130,8 @@ type MiscOptions struct {
PoolSize int `short:"P" long:"pool" default:"5" description:"Int, Pool size"` PoolSize int `short:"P" long:"pool" default:"5" description:"Int, Pool size"`
Threads int `short:"t" long:"thread" default:"20" description:"Int, number of threads per pool"` Threads int `short:"t" long:"thread" default:"20" description:"Int, number of threads per pool"`
Debug bool `long:"debug" description:"Bool, output debug info"` Debug bool `long:"debug" description:"Bool, output debug info"`
Version bool `short:"v" long:"version" description:"Bool, show version"` Version bool `long:"version" description:"Bool, show version"`
Verbose []bool `short:"v" description:"Bool, log verbose level ,default 0, level1: -v level2 -vv "`
Quiet bool `short:"q" long:"quiet" description:"Bool, Quiet"` Quiet bool `short:"q" long:"quiet" description:"Bool, Quiet"`
NoColor bool `long:"no-color" description:"Bool, no color"` NoColor bool `long:"no-color" description:"Bool, no color"`
NoBar bool `long:"no-bar" description:"Bool, No progress bar"` NoBar bool `long:"no-bar" description:"Bool, No progress bar"`
@ -189,6 +188,9 @@ func (opt *Option) PrepareRunner() (*Runner, error) {
r.Progress.Start() r.Progress.Start()
logs.Log.SetOutput(r.Progress.Bypass()) logs.Log.SetOutput(r.Progress.Bypass())
} }
if len(opt.Verbose) == 1 {
logs.Log.SetLevel(LogVerbose)
}
// configuration // configuration
if opt.Force { if opt.Force {
@ -244,10 +246,13 @@ func (opt *Option) PrepareRunner() (*Runner, error) {
if len(opt.AppendRule) > 0 { if len(opt.AppendRule) > 0 {
s.WriteString("file bak enable; ") s.WriteString("file bak enable; ")
} }
if r.RetryCount > 0 { if r.RetryCount > 0 {
s.WriteString("Retry Count: " + strconv.Itoa(r.RetryCount)) s.WriteString("Retry Count: " + strconv.Itoa(r.RetryCount))
} }
logs.Log.Important(s.String()) if s.Len() > 0 {
logs.Log.Important(s.String())
}
if opt.NoScope { if opt.NoScope {
r.Scope = []string{"*"} r.Scope = []string{"*"}
@ -281,7 +286,8 @@ func (opt *Option) PrepareRunner() (*Runner, error) {
if err != nil { if err != nil {
return nil, err return nil, err
} }
logs.Log.Importantf("Loaded %d word from %s", len(dicts[i]), f)
logs.Log.Logf(LogVerbose, "Loaded %d word from %s", len(dicts[i]), f)
} }
} }
@ -318,7 +324,7 @@ func (opt *Option) PrepareRunner() (*Runner, error) {
return nil, fmt.Errorf("%s %w", opt.Word, err) return nil, fmt.Errorf("%s %w", opt.Word, err)
} }
if len(r.Wordlist) > 0 { if len(r.Wordlist) > 0 {
logs.Log.Importantf("Parsed %d words by %s", len(r.Wordlist), opt.Word) logs.Log.Logf(LogVerbose, "Parsed %d words by %s", len(r.Wordlist), opt.Word)
} }
if opt.Rules != nil { if opt.Rules != nil {
@ -476,7 +482,7 @@ func (opt *Option) PrepareRunner() (*Runner, error) {
} }
r.Tasks = tasks r.Tasks = tasks
logs.Log.Importantf("Loaded %d urls from %s", len(tasks), taskfrom) logs.Log.Logf(LogVerbose, "Loaded %d urls from %s", len(tasks), taskfrom)
// 类似dirsearch中的 // 类似dirsearch中的
if opt.Extensions != "" { if opt.Extensions != "" {
@ -553,7 +559,7 @@ func (opt *Option) PrepareRunner() (*Runner, error) {
}) })
} }
logs.Log.Importantf("Loaded %d dictionaries and %d decorators", len(opt.Dictionaries), len(r.Fns)) logs.Log.Logf(LogVerbose, "Loaded %d dictionaries and %d decorators", len(opt.Dictionaries), len(r.Fns))
if opt.Match != "" { if opt.Match != "" {
exp, err := expr.Compile(opt.Match, expr.Patch(&bytesPatcher{})) exp, err := expr.Compile(opt.Match, expr.Patch(&bytesPatcher{}))

View File

@ -148,14 +148,14 @@ func (pool *Pool) genReq(mod pkg.SprayMod, s string) (*ihttp.Request, error) {
func (pool *Pool) Init() error { func (pool *Pool) Init() error {
pool.initwg.Add(2) pool.initwg.Add(2)
if pool.Index != "" { if pool.Index != "" {
logs.Log.Importantf("custom index url: %s", BaseURL(pool.url)+FormatURL(BaseURL(pool.url), pool.Index)) logs.Log.Logf(LogVerbose, "custom index url: %s", BaseURL(pool.url)+FormatURL(BaseURL(pool.url), pool.Index))
pool.reqPool.Invoke(newUnit(pool.Index, InitIndexSource)) pool.reqPool.Invoke(newUnit(pool.Index, InitIndexSource))
} else { } else {
pool.reqPool.Invoke(newUnit(pool.url.Path, InitIndexSource)) pool.reqPool.Invoke(newUnit(pool.url.Path, InitIndexSource))
} }
if pool.Random != "" { if pool.Random != "" {
logs.Log.Importantf("custom random url: %s", BaseURL(pool.url)+FormatURL(BaseURL(pool.url), pool.Random)) logs.Log.Logf(LogVerbose, "custom random url: %s", BaseURL(pool.url)+FormatURL(BaseURL(pool.url), pool.Random))
pool.reqPool.Invoke(newUnit(pool.Random, InitRandomSource)) pool.reqPool.Invoke(newUnit(pool.Random, InitRandomSource))
} else { } else {
pool.reqPool.Invoke(newUnit(pool.safePath(pkg.RandPath()), InitRandomSource)) pool.reqPool.Invoke(newUnit(pool.safePath(pkg.RandPath()), InitRandomSource))
@ -169,13 +169,13 @@ func (pool *Pool) Init() error {
if pool.index.Chunked && pool.ClientType == ihttp.FAST { if pool.index.Chunked && pool.ClientType == ihttp.FAST {
logs.Log.Warn("chunk encoding! buf current client FASTHTTP not support chunk decode") logs.Log.Warn("chunk encoding! buf current client FASTHTTP not support chunk decode")
} }
logs.Log.Info("[baseline.index] " + pool.index.Format([]string{"status", "length", "spend", "title", "frame", "redirect"})) logs.Log.Logf(LogVerbose, "[baseline.index] "+pool.index.Format([]string{"status", "length", "spend", "title", "frame", "redirect"}))
// 检测基本访问能力 // 检测基本访问能力
if pool.random.ErrString != "" { if pool.random.ErrString != "" {
logs.Log.Error(pool.index.String()) logs.Log.Error(pool.index.String())
return fmt.Errorf(pool.index.ErrString) return fmt.Errorf(pool.index.ErrString)
} }
logs.Log.Info("[baseline.random] " + pool.random.Format([]string{"status", "length", "spend", "title", "frame", "redirect"})) logs.Log.Logf(LogVerbose, "[baseline.random] "+pool.random.Format([]string{"status", "length", "spend", "title", "frame", "redirect"}))
// 某些网站http会重定向到https, 如果发现随机目录出现这种情况, 则自定将baseurl升级为https // 某些网站http会重定向到https, 如果发现随机目录出现这种情况, 则自定将baseurl升级为https
if pool.url.Scheme == "http" { if pool.url.Scheme == "http" {
@ -818,7 +818,7 @@ func (pool *Pool) addFuzzyBaseline(bl *pkg.Baseline) {
pool.waiter.Add(1) pool.waiter.Add(1)
pool.doCrawl(bl) // 非有效页面也可能存在一些特殊的url可以用来爬取 pool.doCrawl(bl) // 非有效页面也可能存在一些特殊的url可以用来爬取
pool.baselines[bl.Status] = bl pool.baselines[bl.Status] = bl
logs.Log.Infof("[baseline.%dinit] %s", bl.Status, bl.Format([]string{"status", "length", "spend", "title", "frame", "redirect"})) logs.Log.Logf(LogVerbose, "[baseline.%dinit] %s", bl.Status, bl.Format([]string{"status", "length", "spend", "title", "frame", "redirect"}))
} }
} }

View File

@ -219,6 +219,7 @@ func (r *Runner) Prepare(ctx context.Context) error {
limit = pool.Statistor.Total limit = pool.Statistor.Total
} }
pool.bar = pkg.NewBar(config.BaseURL, limit-pool.Statistor.Offset, r.Progress) pool.bar = pkg.NewBar(config.BaseURL, limit-pool.Statistor.Offset, r.Progress)
logs.Log.Importantf("[pool] task: %s, total %d words, %d threads, proxy: %s", pool.BaseURL, limit-pool.Statistor.Offset, pool.Thread, pool.ProxyAddr)
err = pool.Init() err = pool.Init()
if err != nil { if err != nil {
pool.Statistor.Error = err.Error() pool.Statistor.Error = err.Error()
@ -350,14 +351,14 @@ func (r *Runner) PrintStat(pool *Pool) {
if r.Color { if r.Color {
logs.Log.Important(pool.Statistor.ColorString()) logs.Log.Important(pool.Statistor.ColorString())
if pool.Statistor.Error == "" { if pool.Statistor.Error == "" {
logs.Log.Important(pool.Statistor.ColorCountString()) pool.Statistor.PrintColorCount()
logs.Log.Important(pool.Statistor.ColorSourceString()) pool.Statistor.PrintColorSource()
} }
} else { } else {
logs.Log.Important(pool.Statistor.String()) logs.Log.Important(pool.Statistor.String())
if pool.Statistor.Error == "" { if pool.Statistor.Error == "" {
logs.Log.Important(pool.Statistor.CountString()) pool.Statistor.PrintCount()
logs.Log.Important(pool.Statistor.SourceString()) pool.Statistor.PrintSource()
} }
} }

View File

@ -92,7 +92,10 @@ func (stat *Statistor) String() string {
return s.String() return s.String()
} }
func (stat *Statistor) CountString() string { func (stat *Statistor) PrintCount() {
if len(stat.Counts) == 0 {
return
}
var s strings.Builder var s strings.Builder
s.WriteString("[stat] ") s.WriteString("[stat] ")
s.WriteString(stat.BaseUrl) s.WriteString(stat.BaseUrl)
@ -102,20 +105,26 @@ func (stat *Statistor) CountString() string {
} }
s.WriteString(fmt.Sprintf(" %d: %d,", k, v)) s.WriteString(fmt.Sprintf(" %d: %d,", k, v))
} }
return s.String() logs.Log.Important(s.String())
} }
func (stat *Statistor) SourceString() string { func (stat *Statistor) PrintSource() {
if len(stat.Sources) == 0 {
return
}
var s strings.Builder var s strings.Builder
s.WriteString("[stat] ") s.WriteString("[stat] ")
s.WriteString(stat.BaseUrl) s.WriteString(stat.BaseUrl)
for k, v := range stat.Sources { for k, v := range stat.Sources {
s.WriteString(fmt.Sprintf(" %s: %d,", parsers.GetSpraySourceName(k), v)) s.WriteString(fmt.Sprintf(" %s: %d,", parsers.GetSpraySourceName(k), v))
} }
return s.String() logs.Log.Important(s.String())
} }
func (stat *Statistor) ColorCountString() string { func (stat *Statistor) PrintColorCount() {
if len(stat.Counts) == 0 {
return
}
var s strings.Builder var s strings.Builder
s.WriteString("[stat] ") s.WriteString("[stat] ")
s.WriteString(stat.BaseUrl) s.WriteString(stat.BaseUrl)
@ -125,17 +134,20 @@ func (stat *Statistor) ColorCountString() string {
} }
s.WriteString(fmt.Sprintf(" %s: %s,", logs.Cyan(strconv.Itoa(k)), logs.YellowBold(strconv.Itoa(v)))) s.WriteString(fmt.Sprintf(" %s: %s,", logs.Cyan(strconv.Itoa(k)), logs.YellowBold(strconv.Itoa(v))))
} }
return s.String() logs.Log.Important(s.String())
} }
func (stat *Statistor) ColorSourceString() string { func (stat *Statistor) PrintColorSource() {
if len(stat.Sources) == 0 {
return
}
var s strings.Builder var s strings.Builder
s.WriteString("[stat] ") s.WriteString("[stat] ")
s.WriteString(stat.BaseUrl) s.WriteString(stat.BaseUrl)
for k, v := range stat.Sources { for k, v := range stat.Sources {
s.WriteString(fmt.Sprintf(" %s: %s,", logs.Cyan(parsers.GetSpraySourceName(k)), logs.YellowBold(strconv.Itoa(v)))) s.WriteString(fmt.Sprintf(" %s: %s,", logs.Cyan(parsers.GetSpraySourceName(k)), logs.YellowBold(strconv.Itoa(v))))
} }
return s.String() logs.Log.Important(s.String())
} }
func (stat *Statistor) Json() string { func (stat *Statistor) Json() string {