Browse Source

make logging more customizable with a command line switch to log to a file or console or supress logging. don't display the terminal UI when logging to console on ngrok clients. don't use the global log4go logger any more

Alan Shreve 12 years ago
parent
commit
3663b7c28f

+ 7 - 0
src/ngrok/client/cli.go

@@ -24,6 +24,7 @@ type Options struct {
 	subdomain   string
 	historySize int
 	webport     int
+	logto       string
 }
 
 func fail(msg string, args ...interface{}) {
@@ -121,6 +122,11 @@ func parseArgs() *Options {
 		4040,
 		"The port on which the web interface is served")
 
+	logto := flag.String(
+		"log",
+		"none",
+		"Write log messages to this file. 'stdout' and 'none' have special meanings")
+
 	v := flag.Bool(
 		"version",
 		false,
@@ -141,5 +147,6 @@ func parseArgs() *Options {
 		localaddr: parseLocalAddr(),
 		protocol:  parseProtocol(*protocol),
 		webport:   *webport,
+		logto:     *logto,
 	}
 }

+ 7 - 6
src/ngrok/client/main.go

@@ -1,7 +1,6 @@
 package client
 
 import (
-	log "code.google.com/p/log4go"
 	"encoding/json"
 	"fmt"
 	"io/ioutil"
@@ -11,7 +10,7 @@ import (
 	"ngrok/client/views/term"
 	"ngrok/client/views/web"
 	"ngrok/conn"
-	nlog "ngrok/log"
+	"ngrok/log"
 	"ngrok/msg"
 	"ngrok/proto"
 	"ngrok/util"
@@ -242,12 +241,12 @@ func control(s *State, ctl *ui.Controller) {
 }
 
 func Main() {
-	// XXX: should do this only if they ask us too
-	nlog.LogToFile()
-
 	// parse options
 	opts := parseArgs()
 
+	// set up logging
+	log.LogTo(opts.logto)
+
 	// init client state
 	s := &State{
 		status: "connecting",
@@ -271,8 +270,10 @@ func Main() {
 
 	// init ui
 	ctl := ui.NewController()
-	term.New(ctl, s)
 	web.NewWebView(ctl, s, opts.webport)
+	if opts.logto != "stdout" {
+		term.New(ctl, s)
+	}
 
 	go reconnectingControl(s, ctl)
 	go versionCheck(s, ctl)

+ 2 - 0
src/ngrok/client/views/web/view.go

@@ -6,6 +6,7 @@ import (
 	"net/http"
 	"ngrok/client/ui"
 	"ngrok/client/views/web/static"
+	"ngrok/log"
 	"ngrok/proto"
 	"strings"
 )
@@ -35,6 +36,7 @@ func NewWebView(ctl *ui.Controller, state ui.State, port int) *WebView {
 		w.Write(fn())
 	})
 
+	log.Info("Serving web interface on localhost:%d", port)
 	go http.ListenAndServe(fmt.Sprintf(":%d", port), nil)
 	return w
 }

+ 32 - 14
src/ngrok/log/logger.go

@@ -5,22 +5,23 @@ import (
 	"fmt"
 )
 
-const (
-	logfile string = "ngrok.log"
-)
+var root log.Logger = make(log.Logger)
 
-func init() {
-	// log4go automatically sets the global logger to write to stdout
-	// and we don't want that by default
-	delete(log.Global, "stdout")
-}
+func LogTo(target string) {
+	var writer log.LogWriter = nil
 
-func LogToConsole() {
-	log.Global.AddFilter("log", log.DEBUG, log.NewConsoleLogWriter())
-}
+	switch target {
+	case "stdout":
+		writer = log.NewConsoleLogWriter()
+	case "none":
+		// no logging
+	default:
+		writer = log.NewFileLogWriter(target, true)
+	}
 
-func LogToFile() {
-	log.Global.AddFilter("log", log.DEBUG, log.NewFileLogWriter(logfile, true))
+	if writer != nil {
+		root.AddFilter("log", log.DEBUG, writer)
+	}
 }
 
 type Logger interface {
@@ -37,7 +38,7 @@ type PrefixLogger struct {
 }
 
 func NewPrefixLogger() Logger {
-	return &PrefixLogger{Logger: &log.Global}
+	return &PrefixLogger{Logger: &root}
 }
 
 func (pl *PrefixLogger) pfx(fmtstr string) interface{} {
@@ -67,3 +68,20 @@ func (pl *PrefixLogger) AddLogPrefix(prefix string) {
 
 	pl.prefix += "[" + prefix + "]"
 }
+
+// we should never really use these . . . always prefer logging through a prefix logger
+func Debug(arg0 string, args ...interface{}) {
+	root.Debug(arg0, args...)
+}
+
+func Info(arg0 string, args ...interface{}) {
+	root.Info(arg0, args...)
+}
+
+func Warn(arg0 string, args ...interface{}) error {
+	return root.Warn(arg0, args...)
+}
+
+func Error(arg0 string, args ...interface{}) error {
+	return root.Error(arg0, args...)
+}

+ 1 - 1
src/ngrok/server/http.go

@@ -1,10 +1,10 @@
 package server
 
 import (
-	log "code.google.com/p/log4go"
 	"fmt"
 	"net"
 	"ngrok/conn"
+	"ngrok/log"
 )
 
 const (

+ 12 - 4
src/ngrok/server/main.go

@@ -1,12 +1,11 @@
 package server
 
 import (
-	log "code.google.com/p/log4go"
 	"flag"
 	"fmt"
 	"net"
 	"ngrok/conn"
-	nlog "ngrok/log"
+	log "ngrok/log"
 	"ngrok/msg"
 	"regexp"
 )
@@ -16,6 +15,7 @@ type Options struct {
 	proxyPort  int
 	tunnelPort int
 	domain     string
+	logto      string
 }
 
 /* GLOBALS */
@@ -34,6 +34,10 @@ func parseArgs() *Options {
 	tunnelPort := flag.Int("tunnelport", 2280, "Tunnel port")
 	proxyPort := flag.Int("proxyPort", 0, "Proxy port")
 	domain := flag.String("domain", "ngrok.com", "Domain where the tunnels are hosted")
+	logto := flag.String(
+		"log",
+		"stdout",
+		"Write log messages to this file. 'stdout' and 'none' have special meanings")
 
 	flag.Parse()
 
@@ -42,6 +46,7 @@ func parseArgs() *Options {
 		tunnelPort: *tunnelPort,
 		proxyPort:  *proxyPort,
 		domain:     *domain,
+		logto:      *logto,
 	}
 }
 
@@ -103,16 +108,19 @@ func proxyListener(addr *net.TCPAddr, domain string) {
 }
 
 func Main() {
-	nlog.LogToConsole()
-	done := make(chan int)
 	// parse options
 	opts := parseArgs()
 
+	// init logging
+	log.LogTo(opts.logto)
+
 	tunnels = NewTunnelManager(opts.domain)
 
 	go proxyListener(&net.TCPAddr{net.ParseIP("0.0.0.0"), opts.proxyPort}, opts.domain)
 	go controlListener(&net.TCPAddr{net.ParseIP("0.0.0.0"), opts.tunnelPort}, opts.domain)
 	go httpListener(&net.TCPAddr{net.ParseIP("0.0.0.0"), opts.publicPort})
 
+	// wait forever
+	done := make(chan int)
 	<-done
 }

+ 1 - 1
src/ngrok/server/metrics.go

@@ -1,9 +1,9 @@
 package server
 
 import (
-	log "code.google.com/p/log4go"
 	"encoding/json"
 	gometrics "github.com/inconshreveable/go-metrics"
+	"ngrok/log"
 	"time"
 )
 

+ 3 - 4
src/ngrok/server/tunnel.go

@@ -1,12 +1,11 @@
 package server
 
 import (
-	log "code.google.com/p/log4go"
 	"encoding/base64"
 	"fmt"
 	"net"
 	"ngrok/conn"
-	nlog "ngrok/log"
+	log "ngrok/log"
 	"ngrok/msg"
 	"ngrok/version"
 )
@@ -31,7 +30,7 @@ type Tunnel struct {
 	proxies chan conn.Conn
 
 	// logger
-	nlog.Logger
+	log.Logger
 }
 
 func newTunnel(m *msg.RegMsg, ctl *Control) (t *Tunnel) {
@@ -39,7 +38,7 @@ func newTunnel(m *msg.RegMsg, ctl *Control) (t *Tunnel) {
 		regMsg:  m,
 		ctl:     ctl,
 		proxies: make(chan conn.Conn),
-		Logger:  nlog.NewPrefixLogger(),
+		Logger:  log.NewPrefixLogger(),
 	}
 
 	switch t.regMsg.Protocol {