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
 	subdomain   string
 	historySize int
 	historySize int
 	webport     int
 	webport     int
+	logto       string
 }
 }
 
 
 func fail(msg string, args ...interface{}) {
 func fail(msg string, args ...interface{}) {
@@ -121,6 +122,11 @@ func parseArgs() *Options {
 		4040,
 		4040,
 		"The port on which the web interface is served")
 		"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(
 	v := flag.Bool(
 		"version",
 		"version",
 		false,
 		false,
@@ -141,5 +147,6 @@ func parseArgs() *Options {
 		localaddr: parseLocalAddr(),
 		localaddr: parseLocalAddr(),
 		protocol:  parseProtocol(*protocol),
 		protocol:  parseProtocol(*protocol),
 		webport:   *webport,
 		webport:   *webport,
+		logto:     *logto,
 	}
 	}
 }
 }

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

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

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

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

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

@@ -5,22 +5,23 @@ import (
 	"fmt"
 	"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 {
 type Logger interface {
@@ -37,7 +38,7 @@ type PrefixLogger struct {
 }
 }
 
 
 func NewPrefixLogger() Logger {
 func NewPrefixLogger() Logger {
-	return &PrefixLogger{Logger: &log.Global}
+	return &PrefixLogger{Logger: &root}
 }
 }
 
 
 func (pl *PrefixLogger) pfx(fmtstr string) interface{} {
 func (pl *PrefixLogger) pfx(fmtstr string) interface{} {
@@ -67,3 +68,20 @@ func (pl *PrefixLogger) AddLogPrefix(prefix string) {
 
 
 	pl.prefix += "[" + prefix + "]"
 	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
 package server
 
 
 import (
 import (
-	log "code.google.com/p/log4go"
 	"fmt"
 	"fmt"
 	"net"
 	"net"
 	"ngrok/conn"
 	"ngrok/conn"
+	"ngrok/log"
 )
 )
 
 
 const (
 const (

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

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

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

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

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

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