diff --git a/btc-crawl.go b/btc-crawl.go index 206d03a..9b19468 100644 --- a/btc-crawl.go +++ b/btc-crawl.go @@ -1,10 +1,14 @@ // TODO: Export to a reasonable format. -// TODO: Use proper logger for logging. +// TODO: Namespace packages properly (outside of `main`) package main import ( - "github.com/jessevdk/go-flags" + "os" "time" + + "github.com/alexcesaro/log" + "github.com/alexcesaro/log/golog" + "github.com/jessevdk/go-flags" ) // Taken from: https://github.com/bitcoin/bitcoin/blob/89d72f3d9b6e7ef051ad1439f266b809f348229b/src/chainparams.cpp#L143 @@ -25,6 +29,12 @@ type Options struct { PeerAge time.Duration `long:"peer-age" description:"Ignore discovered peers older than this." default:"24h"` } +var logLevels = []log.Level{ + log.Warning, + log.Info, + log.Debug, +} + func main() { options := Options{} parser := flags.NewParser(&options, flags.Default) @@ -35,8 +45,16 @@ func main() { return } - seedNodes := options.Seed + // Figure out the log level + numVerbose := len(options.Verbose) + if numVerbose > len(logLevels) { // lol math.Min, you floaty bugger. + numVerbose = len(logLevels) + } + logLevel := logLevels[numVerbose] + logger = golog.New(os.Stderr, logLevel) + + seedNodes := options.Seed if len(seedNodes) == 0 { seedNodes = GetSeedsFromDNS(defaultDnsSeeds) } diff --git a/crawler.go b/crawler.go index 7124091..f4e70e2 100644 --- a/crawler.go +++ b/crawler.go @@ -2,7 +2,6 @@ package main import ( "github.com/conformal/btcwire" - "log" "time" ) @@ -44,20 +43,20 @@ func (c *Crawler) handleAddress(address string) *[]string { err := peer.Connect() if err != nil { - log.Printf("[%s] Connection failed: %v", address, err) + logger.Debugf("[%s] Connection failed: %v", address, err) return &r } defer peer.Disconnect() err = peer.Handshake() if err != nil { - log.Printf("[%s] Handsake failed: %v", address, err) + logger.Debugf("[%s] Handsake failed: %v", address, err) return &r } // Send getaddr. if err := btcwire.WriteMessage(peer.conn, btcwire.NewMsgGetAddr(), client.pver, client.btcnet); err != nil { - log.Printf("[%s] GetAddr failed: %v", address, err) + logger.Warningf("[%s] GetAddr failed: %v", address, err) return &r } @@ -73,7 +72,7 @@ func (c *Crawler) handleAddress(address string) *[]string { // many unrelated messages. msg, _, err := btcwire.ReadMessage(peer.conn, client.pver, client.btcnet) if err != nil { - log.Printf("[%s] Failed to read message: %v", address, err) + logger.Warningf("[%s] Failed to read message: %v", address, err) continue } @@ -95,7 +94,7 @@ func (c *Crawler) handleAddress(address string) *[]string { default: otherMessages = append(otherMessages, tmsg.Command()) if len(otherMessages) > tolerateMessages { - log.Printf("[%s] Giving up with %d results after tolerating messages: %v.", address, len(r), otherMessages) + logger.Debugf("[%s] Giving up with %d results after tolerating messages: %v.", address, len(r), otherMessages) return &r } } @@ -137,7 +136,7 @@ func (c *Crawler) Start() { numWorkers += 1 go func() { - log.Printf("[%s] Worker started.", address) + logger.Debugf("[%s] Worker started.", address) results := *c.handleAddress(address) c.results <- results }() @@ -156,11 +155,11 @@ func (c *Crawler) Start() { numWorkers -= 1 if len(r) > 0 { - log.Printf("Added %d new peers of %d returned. Total %d known peers via %d connected.", newAdded, len(r), c.count, numGood) + logger.Infof("Added %d new peers of %d returned. Total %d known peers via %d connected.", newAdded, len(r), c.count, numGood) } if len(c.queue) == 0 && numWorkers == 0 { - log.Printf("Done.") + logger.Infof("Done.") return } diff --git a/log.go b/log.go new file mode 100644 index 0000000..9c000a5 --- /dev/null +++ b/log.go @@ -0,0 +1,9 @@ +package main + +import ( + "github.com/alexcesaro/log/golog" +) + +var logger *golog.Logger + +// TODO: Init a default logger in case it's used as a lib? diff --git a/peer.go b/peer.go index a8e08b3..2cd7e8a 100644 --- a/peer.go +++ b/peer.go @@ -3,7 +3,6 @@ package main import ( "fmt" "github.com/conformal/btcwire" - "log" "net" ) @@ -37,7 +36,7 @@ func (p *Peer) Connect() error { func (p *Peer) Disconnect() { p.conn.Close() - log.Printf("[%s] Closed.", p.address) + logger.Debugf("[%s] Closed.", p.address) } func (p *Peer) Handshake() error { @@ -45,7 +44,7 @@ func (p *Peer) Handshake() error { return fmt.Errorf("Peer is not connected, can't handshake.") } - log.Printf("[%s] Starting handshake.", p.address) + logger.Debugf("[%s] Starting handshake.", p.address) nonce, err := btcwire.RandomUint64() if err != nil { @@ -74,7 +73,7 @@ func (p *Peer) Handshake() error { if uint32(vmsg.ProtocolVersion) < pver { pver = uint32(vmsg.ProtocolVersion) } - log.Printf("[%s] -> Version: %s", p.address, vmsg.UserAgent) + logger.Debugf("[%s] -> Version: %s", p.address, vmsg.UserAgent) // Normally we'd check if vmsg.Nonce == p.nonce but the crawler does not // accept external connections so we skip it. diff --git a/seed.go b/seed.go index 09b3229..e7c17ab 100644 --- a/seed.go +++ b/seed.go @@ -2,7 +2,6 @@ package main import ( "github.com/conformal/btcwire" - "log" "net" "sync" ) @@ -17,10 +16,10 @@ func GetSeedsFromDNS(dnsSeeds []string) []string { defer wait.Done() ips, err := net.LookupIP(address) if err != nil { - log.Printf("Failed to resolve %s: %v", address, err) + logger.Warningf("Failed to resolve %s: %v", address, err) return } - log.Printf("Resolved %d seeds from %s.", len(ips), address) + logger.Debugf("Resolved %d seeds from %s.", len(ips), address) results <- ips }(address) } @@ -37,7 +36,7 @@ func GetSeedsFromDNS(dnsSeeds []string) []string { } } - log.Printf("Resolved %d seed nodes from %d DNS seeds.", len(seeds), len(dnsSeeds)) + logger.Infof("Resolved %d seed nodes from %d DNS seeds.", len(seeds), len(dnsSeeds)) // Note that this will likely include duplicate seeds. The crawler deduplicates them. return seeds