From eb4dad73ae2404bd245af8949af474732e3e33a2 Mon Sep 17 00:00:00 2001 From: Matt Joiner Date: Thu, 22 Aug 2019 13:59:04 +1000 Subject: [PATCH] Lots of improvements to logging --- client.go | 2 +- cmd/torrent/main.go | 58 ++++++++++++++++++++++++++++----------------- go.mod | 10 ++++---- go.sum | 25 ++++++++++++++----- portfwd.go | 4 ++-- 5 files changed, 62 insertions(+), 37 deletions(-) diff --git a/client.go b/client.go index 4443c9af..b4de0a6c 100644 --- a/client.go +++ b/client.go @@ -324,7 +324,7 @@ func (cl *Client) newDhtServer(conn net.PacketConn) (s *dht.Server, err error) { if err != nil { cl.logger.Printf("error bootstrapping dht: %s", err) } - log.Str("completed bootstrap").AddValues(s, ts).Log(cl.logger) + log.Fstr("%v: completed bootstrap", s).AddValues(s, ts).Log(cl.logger) }() } return diff --git a/cmd/torrent/main.go b/cmd/torrent/main.go index 8e86ae97..0152a5e2 100644 --- a/cmd/torrent/main.go +++ b/cmd/torrent/main.go @@ -4,7 +4,6 @@ package main import ( "expvar" "fmt" - "log" "net" "net/http" "os" @@ -13,6 +12,10 @@ import ( "syscall" "time" + "golang.org/x/xerrors" + + "github.com/anacrolix/log" + "github.com/anacrolix/envpprof" "github.com/anacrolix/tagflag" humanize "github.com/dustin/go-humanize" @@ -63,48 +66,47 @@ func torrentBar(t *torrent.Torrent) { }() } -func addTorrents(client *torrent.Client) { +func addTorrents(client *torrent.Client) error { for _, arg := range flags.Torrent { - t := func() *torrent.Torrent { + t, err := func() (*torrent.Torrent, error) { if strings.HasPrefix(arg, "magnet:") { t, err := client.AddMagnet(arg) if err != nil { - log.Fatalf("error adding magnet: %s", err) + return nil, xerrors.Errorf("error adding magnet: %w", err) } - return t + return t, nil } else if strings.HasPrefix(arg, "http://") || strings.HasPrefix(arg, "https://") { response, err := http.Get(arg) if err != nil { - log.Fatalf("Error downloading torrent file: %s", err) + return nil, xerrors.Errorf("Error downloading torrent file: %s", err) } metaInfo, err := metainfo.Load(response.Body) defer response.Body.Close() if err != nil { - fmt.Fprintf(os.Stderr, "error loading torrent file %q: %s\n", arg, err) - os.Exit(1) + return nil, xerrors.Errorf("error loading torrent file %q: %s\n", arg, err) } t, err := client.AddTorrent(metaInfo) if err != nil { - log.Fatal(err) + return nil, xerrors.Errorf("adding torrent: %w", err) } - return t + return t, nil } else if strings.HasPrefix(arg, "infohash:") { t, _ := client.AddTorrentInfoHash(metainfo.NewHashFromHex(strings.TrimPrefix(arg, "infohash:"))) - return t + return t, nil } else { metaInfo, err := metainfo.LoadFromFile(arg) if err != nil { - fmt.Fprintf(os.Stderr, "error loading torrent file %q: %s\n", arg, err) - os.Exit(1) + return nil, xerrors.Errorf("error loading torrent file %q: %s\n", arg, err) } t, err := client.AddTorrent(metaInfo) - if err != nil { - log.Fatal(err) - } - return t + return nil, xerrors.Errorf("adding torrent: %w", err) + return t, nil } }() + if err != nil { + return xerrors.Errorf("adding torrent for %q: %w", arg, err) + } torrentBar(t) t.AddPeers(func() (ret []torrent.Peer) { for _, ta := range flags.TestPeer { @@ -120,6 +122,7 @@ func addTorrents(client *torrent.Client) { t.DownloadAll() }() } + return nil } var flags = struct { @@ -134,6 +137,7 @@ var flags = struct { Stats *bool PublicIP net.IP Progress bool + Quiet bool `help:"discard client logging"` tagflag.StartPos Torrent []string `arity:"+" help:"torrent file path or magnet uri"` }{ @@ -165,7 +169,13 @@ func exitSignalHandlers(client *torrent.Client) { } func main() { - log.SetFlags(log.LstdFlags | log.Lshortfile) + if err := mainErr(); err != nil { + log.Printf("error in main: %v", err) + os.Exit(1) + } +} + +func mainErr() error { tagflag.Parse(&flags) defer envpprof.Stop() clientConfig := torrent.NewDefaultClientConfig() @@ -176,7 +186,7 @@ func main() { if flags.PackedBlocklist != "" { blocklist, err := iplist.MMapPackedFile(flags.PackedBlocklist) if err != nil { - log.Fatalf("error loading blocklist: %s", err) + return xerrors.Errorf("loading blocklist: %v", err) } defer blocklist.Close() clientConfig.IPBlocklist = blocklist @@ -193,10 +203,13 @@ func main() { if flags.DownloadRate != -1 { clientConfig.DownloadRateLimiter = rate.NewLimiter(rate.Limit(flags.DownloadRate), 1<<20) } + if flags.Quiet { + clientConfig.Logger = log.Discard + } client, err := torrent.NewClient(clientConfig) if err != nil { - log.Fatalf("error creating client: %s", err) + return xerrors.Errorf("creating client: %v", err) } defer client.Close() go exitSignalHandlers(client) @@ -207,7 +220,7 @@ func main() { client.WriteStatus(w) }) if stdoutAndStderrAreSameFile() { - log.SetOutput(progress.Bypass()) + log.Default = log.Logger{log.StreamLogger{W: progress.Bypass(), Fmt: log.LineFormatter}} } if flags.Progress { progress.Start() @@ -216,13 +229,14 @@ func main() { if client.WaitAll() { log.Print("downloaded ALL the torrents") } else { - log.Fatal("y u no complete torrents?!") + return xerrors.New("y u no complete torrents?!") } if flags.Seed { outputStats(client) select {} } outputStats(client) + return nil } func outputStats(cl *torrent.Client) { diff --git a/go.mod b/go.mod index 2924eeeb..47263f76 100644 --- a/go.mod +++ b/go.mod @@ -5,21 +5,21 @@ require ( github.com/RoaringBitmap/roaring v0.4.18 // indirect github.com/alexflint/go-arg v1.1.0 github.com/anacrolix/dht/v2 v2.0.1 - github.com/anacrolix/envpprof v1.0.0 + github.com/anacrolix/envpprof v1.0.1 github.com/anacrolix/go-libutp v1.0.2 - github.com/anacrolix/log v0.2.2-0.20190821105323-e3efcaf1a0fd + github.com/anacrolix/log v0.3.0 github.com/anacrolix/missinggo v1.2.1 github.com/anacrolix/missinggo/perf v1.0.0 github.com/anacrolix/mmsg v1.0.0 // indirect github.com/anacrolix/sync v0.0.0-20180808010631-44578de4e778 github.com/anacrolix/tagflag v0.0.0-20180803105420-3a8ff5428f76 + github.com/anacrolix/upnp v0.1.1 github.com/anacrolix/utp v0.0.0-20180219060659-9e0e1d1d0572 github.com/boltdb/bolt v1.3.1 github.com/bradfitz/iter v0.0.0-20190303215204-33e6a9893b0c github.com/davecgh/go-spew v1.1.1 github.com/dustin/go-humanize v1.0.0 github.com/edsrzf/mmap-go v1.0.0 - github.com/elgatito/upnp v0.0.0-20180711183757-2f244d205f9a github.com/fsnotify/fsnotify v1.4.7 github.com/glycerine/goconvey v0.0.0-20190315024820-982ee783a72e // indirect github.com/google/btree v1.0.0 @@ -32,7 +32,7 @@ require ( github.com/pkg/errors v0.8.1 github.com/smartystreets/assertions v0.0.0-20190215210624-980c5ac6f3ac // indirect github.com/spaolacci/murmur3 v1.1.0 // indirect - github.com/stretchr/testify v1.3.0 + github.com/stretchr/testify v1.4.0 golang.org/x/net v0.0.0-20190628185345-da137c7871d7 golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7 // indirect golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 @@ -40,5 +40,3 @@ require ( ) go 1.13 - -replace github.com/elgatito/upnp => github.com/anacrolix/upnp v0.0.0-20190717072655-8249d7a81c03 diff --git a/go.sum b/go.sum index 69af77ec..0847f5dd 100644 --- a/go.sum +++ b/go.sum @@ -16,13 +16,15 @@ github.com/anacrolix/envpprof v0.0.0-20180404065416-323002cec2fa h1:xCaATLKmn39Q github.com/anacrolix/envpprof v0.0.0-20180404065416-323002cec2fa/go.mod h1:KgHhUaQMc8cC0+cEflSgCFNFbKwi5h54gqtVn8yhP7c= github.com/anacrolix/envpprof v1.0.0 h1:AwZ+mBP4rQ5f7JSsrsN3h7M2xDW/xSE66IPVOqlnuUc= github.com/anacrolix/envpprof v1.0.0/go.mod h1:KgHhUaQMc8cC0+cEflSgCFNFbKwi5h54gqtVn8yhP7c= +github.com/anacrolix/envpprof v1.0.1 h1:lShFeOuHFuzLAfyP6WplWvIfHKmbKu1u9/rDOtcFGX4= +github.com/anacrolix/envpprof v1.0.1/go.mod h1:My7T5oSqVfEn4MD4Meczkw/f5lSIndGAKu/0SM/rkf4= github.com/anacrolix/go-libutp v0.0.0-20180522111405-6baeb806518d/go.mod h1:beQSaSxwH2d9Eeu5ijrEnHei5Qhk+J6cDm1QkWFru4E= github.com/anacrolix/go-libutp v1.0.2 h1:cL2SfTCO418V+DQRdMEW+RNfO2InLqW6PsSLqHwmGR4= github.com/anacrolix/go-libutp v1.0.2/go.mod h1:uIH0A72V++j0D1nnmTjjZUiH/ujPkFxYWkxQ02+7S0U= github.com/anacrolix/log v0.0.0-20180412014343-2323884b361d h1:G8ITVMWuQL4adKRC3A6aBOo0YFJYcmpS3JFQd+rZrn0= github.com/anacrolix/log v0.0.0-20180412014343-2323884b361d/go.mod h1:sf/7c2aTldL6sRQj/4UKyjgVZBu2+M2z9wf7MmwPiew= -github.com/anacrolix/log v0.2.2-0.20190821103111-726085c46ea1 h1:aaaFTLBK8GqKjl/3NAxmK3YPTl5zN65uiJzmf1bQT2g= -github.com/anacrolix/log v0.2.2-0.20190821103111-726085c46ea1/go.mod h1:lWvLTqzAnCWPJA08T2HCstZi0L1y2Wyvm3FJgwU9jwU= +github.com/anacrolix/log v0.3.0 h1:Btxh7GkT4JYWvWJ1uKOwgobf+7q/1eFQaDdCUXCtssw= +github.com/anacrolix/log v0.3.0/go.mod h1:lWvLTqzAnCWPJA08T2HCstZi0L1y2Wyvm3FJgwU9jwU= github.com/anacrolix/missinggo v0.0.0-20180522035225-b4a5853e62ff/go.mod h1:b0p+7cn+rWMIphK1gDH2hrDuwGOcbB6V4VXeSsEfHVk= github.com/anacrolix/missinggo v0.0.0-20180725070939-60ef2fbf63df/go.mod h1:kwGiTUTZ0+p4vAz3VbAI5a30t2YbvemcmspjKwrAz5s= github.com/anacrolix/missinggo v0.2.1-0.20190310234110-9fbdc9f242a8 h1:E2Xb2SBsVzHJ1tNMW9QcckYEQcyBKz1ee8qVjeVRWys= @@ -47,8 +49,8 @@ github.com/anacrolix/tagflag v0.0.0-20180605133421-f477c8c2f14c/go.mod h1:1m2U/K github.com/anacrolix/tagflag v0.0.0-20180803105420-3a8ff5428f76 h1:No2E3UEtiEcvy5juw8FNCrtjWUm+Rq9KB0cMcwMDNnc= github.com/anacrolix/tagflag v0.0.0-20180803105420-3a8ff5428f76/go.mod h1:1m2U/K6ZT+JZG0+bdMK6qauP49QT4wE5pmhJXOKKCHw= github.com/anacrolix/torrent v0.0.0-20180622074351-fefeef4ee9eb/go.mod h1:3vcFVxgOASslNXHdivT8spyMRBanMCenHRpe0u5vpBs= -github.com/anacrolix/upnp v0.0.0-20190717072655-8249d7a81c03 h1:moiTMOh4ZQ8yELlyjgVY1dQF2PlrP2NQr2/qFD1eB1w= -github.com/anacrolix/upnp v0.0.0-20190717072655-8249d7a81c03/go.mod h1:ufVftEeVgFwZQy/aZMVfogCLY/2z19vR7oI+dA3XBhg= +github.com/anacrolix/upnp v0.1.1 h1:v5C+wBiku2zmwFR5B+pUfdNBL5TfPtyO+sWuw+/VEDg= +github.com/anacrolix/upnp v0.1.1/go.mod h1:LXsbsp5h+WGN7YR+0A7iVXm5BL1LYryDev1zuJMWYQo= github.com/anacrolix/utp v0.0.0-20180219060659-9e0e1d1d0572 h1:kpt6TQTVi6gognY+svubHfxxpq0DLU9AfTQyZVc3UOc= github.com/anacrolix/utp v0.0.0-20180219060659-9e0e1d1d0572/go.mod h1:MDwc+vsGEq7RMw6lr2GKOEqjWny5hO5OZXRVNaBJ2Dk= github.com/boltdb/bolt v1.3.1 h1:JQmyP4ZBrce+ZQu0dY660FMfatumYDLun9hBCUVIkF4= @@ -110,6 +112,11 @@ github.com/jtolds/gls v4.2.1+incompatible h1:fSuqC+Gmlu6l/ZYAoZzx2pyucC8Xza35fpR github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/mattn/go-isatty v0.0.7 h1:UvyT9uN+3r7yLEYSlJsbQGdsaB/a0DlgWP3pql6iwOc= github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-sqlite3 v1.7.0 h1:CiYZ8slwBLIMkDbDJCF+Zd2M8bZ1Gz02TMsm1V33Lk0= @@ -118,8 +125,6 @@ github.com/mattn/go-sqlite3 v1.10.0 h1:jbhqpg7tQe4SupckyijYiy0mJJ/pRyHvXf7JdWK86 github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae h1:VeRdUYdCw49yizlSbMEn2SZ+gT+3IUKx8BqxyQdz+BY= github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg= -github.com/op/go-logging v0.0.0-20160315200505-970db520ece7 h1:lDH9UUVJtmYCjyT0CI4q8xvlXPxeZ0gYCVvWbmPlp88= -github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/philhofer/fwd v1.0.0 h1:UbZqGr5Y38ApvM/V/jEljVxwocdweyH+vmYvRPBnbqQ= github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= @@ -146,6 +151,8 @@ github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1 github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/syncthing/syncthing v0.14.48-rc.4/go.mod h1:nw3siZwHPA6M8iSfjDCWQ402eqvEIasMQOE8nFOxy7M= github.com/tinylib/msgp v1.0.2 h1:DfdQrzQa7Yh2es9SuLkixqxuXS2SxsdYn0KbdrOGWD8= github.com/tinylib/msgp v1.0.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= @@ -161,6 +168,7 @@ github.com/willf/bloom v0.0.0-20170505221640-54e3b963ee16 h1:hDGatoumfYOxzIZGsSy github.com/willf/bloom v0.0.0-20170505221640-54e3b963ee16/go.mod h1:MmAltL9pDMNTrvUkxdg0k0q5I0suxmuwp3KbyrZLOZ8= github.com/willf/bloom v2.0.3+incompatible h1:QDacWdqcAUI1MPOwIQZRy9kOR7yxfyEmxX8Wdm2/JPA= github.com/willf/bloom v2.0.3+incompatible/go.mod h1:MmAltL9pDMNTrvUkxdg0k0q5I0suxmuwp3KbyrZLOZ8= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/net v0.0.0-20180524181706-dfa909b99c79/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190318221613-d196dffd7c2b h1:ZWpVMTsK0ey5WJCu+vVdfMldWq7/ezaOcjnKWIHWVkE= @@ -178,3 +186,8 @@ golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 h1:SvFZT6jyqRaOeXpc5h/JSfZe golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7 h1:9zdDQZ7Thm29KFXgAX/+yaf3eVbP7djjWp/dXAppNCc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/portfwd.go b/portfwd.go index b8d70482..2a223a38 100644 --- a/portfwd.go +++ b/portfwd.go @@ -4,7 +4,7 @@ import ( "time" "github.com/anacrolix/log" - "github.com/elgatito/upnp" + "github.com/anacrolix/upnp" ) func addPortMapping(d upnp.Device, proto upnp.Protocol, internalPort int, debug bool) { @@ -25,7 +25,7 @@ func (cl *Client) forwardPort() { return } cl.unlock() - ds := upnp.Discover(0, 2*time.Second) + ds := upnp.Discover(0, 2*time.Second, cl.logger) cl.lock() cl.logger.Printf("discovered %d upnp devices", len(ds)) port := cl.incomingPeerPort()