Superhappyfuntimelogging.

This commit is contained in:
Andrey Petrov 2014-04-24 19:13:33 -07:00
parent 20040a6444
commit e2ba6efad2
5 changed files with 44 additions and 20 deletions

View File

@ -1,10 +1,14 @@
// TODO: Export to a reasonable format. // TODO: Export to a reasonable format.
// TODO: Use proper logger for logging. // TODO: Namespace packages properly (outside of `main`)
package main package main
import ( import (
"github.com/jessevdk/go-flags" "os"
"time" "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 // 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"` 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() { func main() {
options := Options{} options := Options{}
parser := flags.NewParser(&options, flags.Default) parser := flags.NewParser(&options, flags.Default)
@ -35,8 +45,16 @@ func main() {
return 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 { if len(seedNodes) == 0 {
seedNodes = GetSeedsFromDNS(defaultDnsSeeds) seedNodes = GetSeedsFromDNS(defaultDnsSeeds)
} }

View File

@ -2,7 +2,6 @@ package main
import ( import (
"github.com/conformal/btcwire" "github.com/conformal/btcwire"
"log"
"time" "time"
) )
@ -44,20 +43,20 @@ func (c *Crawler) handleAddress(address string) *[]string {
err := peer.Connect() err := peer.Connect()
if err != nil { if err != nil {
log.Printf("[%s] Connection failed: %v", address, err) logger.Debugf("[%s] Connection failed: %v", address, err)
return &r return &r
} }
defer peer.Disconnect() defer peer.Disconnect()
err = peer.Handshake() err = peer.Handshake()
if err != nil { if err != nil {
log.Printf("[%s] Handsake failed: %v", address, err) logger.Debugf("[%s] Handsake failed: %v", address, err)
return &r return &r
} }
// Send getaddr. // Send getaddr.
if err := btcwire.WriteMessage(peer.conn, btcwire.NewMsgGetAddr(), client.pver, client.btcnet); err != nil { 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 return &r
} }
@ -73,7 +72,7 @@ func (c *Crawler) handleAddress(address string) *[]string {
// many unrelated messages. // many unrelated messages.
msg, _, err := btcwire.ReadMessage(peer.conn, client.pver, client.btcnet) msg, _, err := btcwire.ReadMessage(peer.conn, client.pver, client.btcnet)
if err != nil { if err != nil {
log.Printf("[%s] Failed to read message: %v", address, err) logger.Warningf("[%s] Failed to read message: %v", address, err)
continue continue
} }
@ -95,7 +94,7 @@ func (c *Crawler) handleAddress(address string) *[]string {
default: default:
otherMessages = append(otherMessages, tmsg.Command()) otherMessages = append(otherMessages, tmsg.Command())
if len(otherMessages) > tolerateMessages { 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 return &r
} }
} }
@ -137,7 +136,7 @@ func (c *Crawler) Start() {
numWorkers += 1 numWorkers += 1
go func() { go func() {
log.Printf("[%s] Worker started.", address) logger.Debugf("[%s] Worker started.", address)
results := *c.handleAddress(address) results := *c.handleAddress(address)
c.results <- results c.results <- results
}() }()
@ -156,11 +155,11 @@ func (c *Crawler) Start() {
numWorkers -= 1 numWorkers -= 1
if len(r) > 0 { 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 { if len(c.queue) == 0 && numWorkers == 0 {
log.Printf("Done.") logger.Infof("Done.")
return return
} }

9
log.go Normal file
View File

@ -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?

View File

@ -3,7 +3,6 @@ package main
import ( import (
"fmt" "fmt"
"github.com/conformal/btcwire" "github.com/conformal/btcwire"
"log"
"net" "net"
) )
@ -37,7 +36,7 @@ func (p *Peer) Connect() error {
func (p *Peer) Disconnect() { func (p *Peer) Disconnect() {
p.conn.Close() p.conn.Close()
log.Printf("[%s] Closed.", p.address) logger.Debugf("[%s] Closed.", p.address)
} }
func (p *Peer) Handshake() error { func (p *Peer) Handshake() error {
@ -45,7 +44,7 @@ func (p *Peer) Handshake() error {
return fmt.Errorf("Peer is not connected, can't handshake.") 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() nonce, err := btcwire.RandomUint64()
if err != nil { if err != nil {
@ -74,7 +73,7 @@ func (p *Peer) Handshake() error {
if uint32(vmsg.ProtocolVersion) < pver { if uint32(vmsg.ProtocolVersion) < pver {
pver = uint32(vmsg.ProtocolVersion) 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 // Normally we'd check if vmsg.Nonce == p.nonce but the crawler does not
// accept external connections so we skip it. // accept external connections so we skip it.

View File

@ -2,7 +2,6 @@ package main
import ( import (
"github.com/conformal/btcwire" "github.com/conformal/btcwire"
"log"
"net" "net"
"sync" "sync"
) )
@ -17,10 +16,10 @@ func GetSeedsFromDNS(dnsSeeds []string) []string {
defer wait.Done() defer wait.Done()
ips, err := net.LookupIP(address) ips, err := net.LookupIP(address)
if err != nil { if err != nil {
log.Printf("Failed to resolve %s: %v", address, err) logger.Warningf("Failed to resolve %s: %v", address, err)
return return
} }
log.Printf("Resolved %d seeds from %s.", len(ips), address) logger.Debugf("Resolved %d seeds from %s.", len(ips), address)
results <- ips results <- ips
}(address) }(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. // Note that this will likely include duplicate seeds. The crawler deduplicates them.
return seeds return seeds