Browse Source

fix logging so that we always go out through log4go's global logger and we remove its default stdout appender

Alan Shreve 12 years ago
parent
commit
1bbabe1a54
9 changed files with 54 additions and 50 deletions
  1. 10 10
      client/history.go
  2. 8 8
      client/main.go
  3. 6 6
      client/metrics.go
  4. 4 4
      client/ui/http.go
  5. 4 4
      conn/conn.go
  6. 15 11
      log/logger.go
  7. 1 1
      server/http.go
  8. 3 3
      server/main.go
  9. 3 3
      server/tunnel.go

+ 10 - 10
client/history.go

@@ -1,16 +1,16 @@
 package client
 package client
 
 
 import (
 import (
-        "time"
 	"container/list"
 	"container/list"
 	"net/http"
 	"net/http"
+	"time"
 )
 )
 
 
 type RequestHistoryEntry struct {
 type RequestHistoryEntry struct {
-	req  *http.Request
-	resp *http.Response
-        start time.Time
-        duration time.Duration
+	req      *http.Request
+	resp     *http.Response
+	start    time.Time
+	duration time.Duration
 }
 }
 
 
 type RequestHistory struct {
 type RequestHistory struct {
@@ -20,7 +20,7 @@ type RequestHistory struct {
 	resps      chan *http.Response
 	resps      chan *http.Response
 	history    *list.List
 	history    *list.List
 	onChange   func([]*RequestHistoryEntry)
 	onChange   func([]*RequestHistoryEntry)
-        metrics *ClientMetrics
+	metrics    *ClientMetrics
 }
 }
 
 
 func NewRequestHistory(maxSize int, metrics *ClientMetrics, onChange func([]*RequestHistoryEntry)) *RequestHistory {
 func NewRequestHistory(maxSize int, metrics *ClientMetrics, onChange func([]*RequestHistoryEntry)) *RequestHistory {
@@ -31,7 +31,7 @@ func NewRequestHistory(maxSize int, metrics *ClientMetrics, onChange func([]*Req
 		resps:      make(chan *http.Response),
 		resps:      make(chan *http.Response),
 		history:    list.New(),
 		history:    list.New(),
 		onChange:   onChange,
 		onChange:   onChange,
-                metrics:    metrics,
+		metrics:    metrics,
 	}
 	}
 
 
 	go func() {
 	go func() {
@@ -50,7 +50,7 @@ func NewRequestHistory(maxSize int, metrics *ClientMetrics, onChange func([]*Req
 }
 }
 
 
 func (rh *RequestHistory) addRequest(req *http.Request) {
 func (rh *RequestHistory) addRequest(req *http.Request) {
-        rh.metrics.reqMeter.Mark(1)
+	rh.metrics.reqMeter.Mark(1)
 	if rh.history.Len() >= rh.maxSize {
 	if rh.history.Len() >= rh.maxSize {
 		entry := rh.history.Remove(rh.history.Back()).(*RequestHistoryEntry)
 		entry := rh.history.Remove(rh.history.Back()).(*RequestHistoryEntry)
 		delete(rh.reqToEntry, entry.req)
 		delete(rh.reqToEntry, entry.req)
@@ -64,8 +64,8 @@ func (rh *RequestHistory) addRequest(req *http.Request) {
 
 
 func (rh *RequestHistory) addResponse(resp *http.Response) {
 func (rh *RequestHistory) addResponse(resp *http.Response) {
 	if entry, ok := rh.reqToEntry[resp.Request]; ok {
 	if entry, ok := rh.reqToEntry[resp.Request]; ok {
-                entry.duration = time.Since(entry.start)
-                rh.metrics.reqTimer.Update(entry.duration)
+		entry.duration = time.Since(entry.start)
+		rh.metrics.reqTimer.Update(entry.duration)
 
 
 		entry.resp = resp
 		entry.resp = resp
 		rh.onChange(rh.copy())
 		rh.onChange(rh.copy())

+ 8 - 8
client/main.go

@@ -5,9 +5,9 @@ import (
 	"crypto/rand"
 	"crypto/rand"
 	"fmt"
 	"fmt"
 	"net"
 	"net"
-	"ngrok"
 	"ngrok/client/ui"
 	"ngrok/client/ui"
 	"ngrok/conn"
 	"ngrok/conn"
+	nlog "ngrok/log"
 	"ngrok/proto"
 	"ngrok/proto"
 	"runtime"
 	"runtime"
 	"time"
 	"time"
@@ -26,7 +26,7 @@ func connect(addr string, typ string) (c conn.Conn, err error) {
 		return
 		return
 	}
 	}
 
 
-	//log.Debug("Dialing %v", addr)
+	log.Debug("Dialing %v", addr)
 	if tcpConn, err = net.DialTCP("tcp", nil, tcpAddr); err != nil {
 	if tcpConn, err = net.DialTCP("tcp", nil, tcpAddr); err != nil {
 		return
 		return
 	}
 	}
@@ -86,9 +86,9 @@ func control(s *State) {
 	defer func() {
 	defer func() {
 		if r := recover(); r != nil {
 		if r := recover(); r != nil {
 			log.Error("Recovering from failure %v, attempting to reconnect to server after 10 seconds . . .", r)
 			log.Error("Recovering from failure %v, attempting to reconnect to server after 10 seconds . . .", r)
-			time.Sleep(10 * time.Second)
 			s.status = "reconnecting"
 			s.status = "reconnecting"
 			s.Update()
 			s.Update()
+			time.Sleep(10 * time.Second)
 			go control(s)
 			go control(s)
 		}
 		}
 	}()
 	}()
@@ -155,14 +155,14 @@ func mkid() string {
 }
 }
 
 
 func Main() {
 func Main() {
-	ngrok.LogToFile()
-	//	ngrok.LogToConsole()
+	// XXX: should do this only if they ask us too
+	nlog.LogToFile()
 
 
 	// parse options
 	// parse options
 	opts := parseArgs()
 	opts := parseArgs()
 
 
 	// init terminal, http UI
 	// init terminal, http UI
-	//termView := ui.NewTerm()
+	termView := ui.NewTerm()
 	httpView := ui.NewHttp(9999)
 	httpView := ui.NewHttp(9999)
 
 
 	// init client state
 	// init client state
@@ -171,8 +171,8 @@ func Main() {
 		id: mkid(),
 		id: mkid(),
 
 
 		// ui communication channels
 		// ui communication channels
-		//            ui: ui.NewUi(termView, httpView),
-		ui: ui.NewUi(httpView),
+		ui: ui.NewUi(termView, httpView),
+		//ui: ui.NewUi(httpView),
 
 
 		// command-line options
 		// command-line options
 		opts: opts,
 		opts: opts,

+ 6 - 6
client/metrics.go

@@ -14,9 +14,9 @@ type ClientMetrics struct {
 	connGauge       metrics.Gauge
 	connGauge       metrics.Gauge
 	connMeter       metrics.Meter
 	connMeter       metrics.Meter
 	connTimer       metrics.Timer
 	connTimer       metrics.Timer
-        reqGauge    metrics.Gauge
-        reqMeter    metrics.Meter
-        reqTimer    metrics.Timer
+	reqGauge        metrics.Gauge
+	reqMeter        metrics.Meter
+	reqTimer        metrics.Timer
 	proxySetupTimer metrics.Timer
 	proxySetupTimer metrics.Timer
 	bytesIn         metrics.Histogram
 	bytesIn         metrics.Histogram
 	bytesOut        metrics.Histogram
 	bytesOut        metrics.Histogram
@@ -29,9 +29,9 @@ func NewClientMetrics() *ClientMetrics {
 		connGauge:       metrics.NewGauge(),
 		connGauge:       metrics.NewGauge(),
 		connMeter:       metrics.NewMeter(),
 		connMeter:       metrics.NewMeter(),
 		connTimer:       metrics.NewTimer(),
 		connTimer:       metrics.NewTimer(),
-		reqGauge:       metrics.NewGauge(),
-		reqMeter:       metrics.NewMeter(),
-		reqTimer:       metrics.NewTimer(),
+		reqGauge:        metrics.NewGauge(),
+		reqMeter:        metrics.NewMeter(),
+		reqTimer:        metrics.NewTimer(),
 		proxySetupTimer: metrics.NewTimer(),
 		proxySetupTimer: metrics.NewTimer(),
 		bytesIn:         metrics.NewHistogram(metrics.NewExpDecaySample(sampleSize, sampleAlpha)),
 		bytesIn:         metrics.NewHistogram(metrics.NewExpDecaySample(sampleSize, sampleAlpha)),
 		bytesOut:        metrics.NewHistogram(metrics.NewExpDecaySample(sampleSize, sampleAlpha)),
 		bytesOut:        metrics.NewHistogram(metrics.NewExpDecaySample(sampleSize, sampleAlpha)),

+ 4 - 4
client/ui/http.go

@@ -127,12 +127,12 @@ func (h *Http) run() {
 			template.New("page.html").Funcs(funcMap).ParseFiles("./templates/page.html", "./templates/body.html"))
 			template.New("page.html").Funcs(funcMap).ParseFiles("./templates/page.html", "./templates/body.html"))
 
 
 		for _, htxn := range s.GetHistory() {
 		for _, htxn := range s.GetHistory() {
-                        req, resp := htxn.GetRequest(), htxn.GetResponse()
+			req, resp := htxn.GetRequest(), htxn.GetResponse()
 
 
 			req.Body = NewRepeatableReader(req.Body)
 			req.Body = NewRepeatableReader(req.Body)
-                        if resp != nil && resp.Body != nil {
-                            resp.Body = NewRepeatableReader(resp.Body)
-                        }
+			if resp != nil && resp.Body != nil {
+				resp.Body = NewRepeatableReader(resp.Body)
+			}
 		}
 		}
 
 
 		// write the response
 		// write the response

+ 4 - 4
conn/conn.go

@@ -8,24 +8,24 @@ import (
 	"math/rand"
 	"math/rand"
 	"net"
 	"net"
 	"net/http"
 	"net/http"
-	"ngrok"
+	"ngrok/log"
 )
 )
 
 
 type Conn interface {
 type Conn interface {
 	net.Conn
 	net.Conn
-	ngrok.Logger
+	log.Logger
 	Id() string
 	Id() string
 }
 }
 
 
 type tcpConn struct {
 type tcpConn struct {
 	net.Conn
 	net.Conn
-	ngrok.Logger
+	log.Logger
 	id  int32
 	id  int32
 	typ string
 	typ string
 }
 }
 
 
 func NewTCP(conn net.Conn, typ string) *tcpConn {
 func NewTCP(conn net.Conn, typ string) *tcpConn {
-	c := &tcpConn{conn, ngrok.NewPrefixLogger(), rand.Int31(), typ}
+	c := &tcpConn{conn, log.NewPrefixLogger(), rand.Int31(), typ}
 	c.AddLogPrefix(c.Id())
 	c.AddLogPrefix(c.Id())
 	c.Info("New connection from %v", conn.RemoteAddr())
 	c.Info("New connection from %v", conn.RemoteAddr())
 	return c
 	return c

+ 15 - 11
logger.go → log/logger.go

@@ -1,23 +1,26 @@
-package ngrok
+package log
 
 
 import (
 import (
 	log "code.google.com/p/log4go"
 	log "code.google.com/p/log4go"
 	"fmt"
 	"fmt"
 )
 )
 
 
-var Log log.Logger
+const (
+	logfile string = "ngrok.log"
+)
 
 
 func init() {
 func init() {
-	Log = make(log.Logger)
-	//    Log.AddFilter("log", log.DEBUG, log.NewFileLogWriter("ngrok.log", true))
+	// log4go automatically sets the global logger to write to stdout
+	// and we don't want that by default
+	delete(log.Global, "stdout")
 }
 }
 
 
 func LogToConsole() {
 func LogToConsole() {
-	Log.AddFilter("log", log.DEBUG, log.NewConsoleLogWriter())
+	log.Global.AddFilter("log", log.DEBUG, log.NewConsoleLogWriter())
 }
 }
 
 
 func LogToFile() {
 func LogToFile() {
-	Log.AddFilter("log", log.DEBUG, log.NewFileLogWriter("ngrok.log", true))
+	log.Global.AddFilter("log", log.DEBUG, log.NewFileLogWriter(logfile, true))
 }
 }
 
 
 type Logger interface {
 type Logger interface {
@@ -29,11 +32,12 @@ type Logger interface {
 }
 }
 
 
 type PrefixLogger struct {
 type PrefixLogger struct {
+	*log.Logger
 	prefix string
 	prefix string
 }
 }
 
 
 func NewPrefixLogger() Logger {
 func NewPrefixLogger() Logger {
-	return &PrefixLogger{}
+	return &PrefixLogger{Logger: &log.Global}
 }
 }
 
 
 func (pl *PrefixLogger) pfx(fmtstr string) interface{} {
 func (pl *PrefixLogger) pfx(fmtstr string) interface{} {
@@ -41,19 +45,19 @@ func (pl *PrefixLogger) pfx(fmtstr string) interface{} {
 }
 }
 
 
 func (pl *PrefixLogger) Debug(arg0 string, args ...interface{}) {
 func (pl *PrefixLogger) Debug(arg0 string, args ...interface{}) {
-	Log.Debug(pl.pfx(arg0), args...)
+	pl.Logger.Debug(pl.pfx(arg0), args...)
 }
 }
 
 
 func (pl *PrefixLogger) Info(arg0 string, args ...interface{}) {
 func (pl *PrefixLogger) Info(arg0 string, args ...interface{}) {
-	Log.Info(pl.pfx(arg0), args...)
+	pl.Logger.Info(pl.pfx(arg0), args...)
 }
 }
 
 
 func (pl *PrefixLogger) Warn(arg0 string, args ...interface{}) error {
 func (pl *PrefixLogger) Warn(arg0 string, args ...interface{}) error {
-	return Log.Warn(pl.pfx(arg0), args...)
+	return pl.Logger.Warn(pl.pfx(arg0), args...)
 }
 }
 
 
 func (pl *PrefixLogger) Error(arg0 string, args ...interface{}) error {
 func (pl *PrefixLogger) Error(arg0 string, args ...interface{}) error {
-	return Log.Error(pl.pfx(arg0), args...)
+	return pl.Logger.Error(pl.pfx(arg0), args...)
 }
 }
 
 
 func (pl *PrefixLogger) AddLogPrefix(prefix string) {
 func (pl *PrefixLogger) AddLogPrefix(prefix string) {

+ 1 - 1
server/http.go

@@ -56,7 +56,7 @@ func httpHandler(tcpConn net.Conn) {
 
 
 	if tunnel == nil {
 	if tunnel == nil {
 		conn.Info("Not tunnel found for hostname %s", req.Host)
 		conn.Info("Not tunnel found for hostname %s", req.Host)
-                return
+		return
 	}
 	}
 
 
 	tunnel.HandlePublicConnection(conn)
 	tunnel.HandlePublicConnection(conn)

+ 3 - 3
server/main.go

@@ -3,10 +3,10 @@ package server
 import (
 import (
 	log "code.google.com/p/log4go"
 	log "code.google.com/p/log4go"
 	"flag"
 	"flag"
-        "fmt"
+	"fmt"
 	"net"
 	"net"
-	"ngrok"
 	"ngrok/conn"
 	"ngrok/conn"
+	nlog "ngrok/log"
 	"ngrok/proto"
 	"ngrok/proto"
 	"regexp"
 	"regexp"
 )
 )
@@ -117,7 +117,7 @@ func proxyListener(addr *net.TCPAddr, domain string) {
 }
 }
 
 
 func Main() {
 func Main() {
-	ngrok.LogToConsole()
+	nlog.LogToConsole()
 	done := make(chan int)
 	done := make(chan int)
 	// parse options
 	// parse options
 	opts := parseArgs()
 	opts := parseArgs()

+ 3 - 3
server/tunnel.go

@@ -3,8 +3,8 @@ package server
 import (
 import (
 	"fmt"
 	"fmt"
 	"net"
 	"net"
-	"ngrok"
 	"ngrok/conn"
 	"ngrok/conn"
+	"ngrok/log"
 	"ngrok/proto"
 	"ngrok/proto"
 )
 )
 
 
@@ -28,7 +28,7 @@ type Tunnel struct {
 	proxies chan conn.Conn
 	proxies chan conn.Conn
 
 
 	// logger
 	// logger
-	ngrok.Logger
+	log.Logger
 }
 }
 
 
 func newTunnel(msg *proto.RegMsg, ctl *Control) {
 func newTunnel(msg *proto.RegMsg, ctl *Control) {
@@ -36,7 +36,7 @@ func newTunnel(msg *proto.RegMsg, ctl *Control) {
 		regMsg:  msg,
 		regMsg:  msg,
 		ctl:     ctl,
 		ctl:     ctl,
 		proxies: make(chan conn.Conn),
 		proxies: make(chan conn.Conn),
-		Logger:  ngrok.NewPrefixLogger(),
+		Logger:  log.NewPrefixLogger(),
 	}
 	}
 
 
 	switch t.regMsg.Protocol {
 	switch t.regMsg.Protocol {