Browse Source

logger: Better colours and output

tags/v0.7.0
Daniel Oaks 7 years ago
parent
commit
415a8117ee
4 changed files with 44 additions and 38 deletions
  1. 3
    1
      irc/commands.go
  2. 18
    27
      irc/logger.go
  3. 17
    7
      irc/server.go
  4. 6
    3
      oragono.go

+ 3
- 1
irc/commands.go View File

@@ -5,7 +5,9 @@
5 5
 
6 6
 package irc
7 7
 
8
-import "github.com/DanielOaks/girc-go/ircmsg"
8
+import (
9
+	"github.com/DanielOaks/girc-go/ircmsg"
10
+)
9 11
 
10 12
 // Command represents a command accepted from a client.
11 13
 type Command struct {

+ 18
- 27
irc/logger.go View File

@@ -44,26 +44,6 @@ var (
44 44
 	}
45 45
 )
46 46
 
47
-// ClientLogger is a logger dedicated to a single client. This is a convenience class that
48
-// automagically adds the client nick to logged messages.
49
-type ClientLogger struct {
50
-	client *Client
51
-}
52
-
53
-// NewClientLogger returns a new ClientLogger.
54
-func NewClientLogger(client *Client) ClientLogger {
55
-	logger := ClientLogger{
56
-		client: client,
57
-	}
58
-	return logger
59
-}
60
-
61
-// Log logs the given message with the given details.
62
-func (logger *ClientLogger) Log(level LogLevel, logType, object, message string) {
63
-	object = fmt.Sprintf("%s : %s", logger.client.nick, object)
64
-	logger.client.server.logger.Log(level, logType, object, message)
65
-}
66
-
67 47
 // Logger is the main interface used to log debug/info/error messages.
68 48
 type Logger struct {
69 49
 	loggers []SingleLogger
@@ -100,9 +80,9 @@ func NewLogger(config []LoggingConfig) (*Logger, error) {
100 80
 }
101 81
 
102 82
 // Log logs the given message with the given details.
103
-func (logger *Logger) Log(level LogLevel, logType, object, message string) {
83
+func (logger *Logger) Log(level LogLevel, logType string, messageParts ...string) {
104 84
 	for _, singleLogger := range logger.loggers {
105
-		singleLogger.Log(level, logType, object, message)
85
+		singleLogger.Log(level, logType, messageParts...)
106 86
 	}
107 87
 }
108 88
 
@@ -123,7 +103,7 @@ type SingleLogger struct {
123 103
 }
124 104
 
125 105
 // Log logs the given message with the given details.
126
-func (logger *SingleLogger) Log(level LogLevel, logType, object, message string) {
106
+func (logger *SingleLogger) Log(level LogLevel, logType string, messageParts ...string) {
127 107
 	// no logging enabled
128 108
 	if !(logger.MethodSTDERR || logger.MethodFile.Enabled) {
129 109
 		return
@@ -141,11 +121,13 @@ func (logger *SingleLogger) Log(level LogLevel, logType, object, message string)
141 121
 	}
142 122
 
143 123
 	// assemble full line
124
+	timeGrey := ansi.ColorFunc("243")
144 125
 	grey := ansi.ColorFunc("8")
145 126
 	alert := ansi.ColorFunc("232+b:red")
146 127
 	warn := ansi.ColorFunc("black:214")
147
-	info := ansi.ColorFunc("33")
128
+	info := ansi.ColorFunc("117")
148 129
 	debug := ansi.ColorFunc("78")
130
+	section := ansi.ColorFunc("229")
149 131
 
150 132
 	levelDisplay := logLevelDisplayNames[level]
151 133
 	if level == LogError {
@@ -158,14 +140,23 @@ func (logger *SingleLogger) Log(level LogLevel, logType, object, message string)
158 140
 		levelDisplay = debug(levelDisplay)
159 141
 	}
160 142
 
161
-	fullStringFormatted := fmt.Sprintf("%s  %s : %s : %s : %s", grey(time.Now().UTC().Format("2006-01-02T15:04:05Z")), levelDisplay, logType, object, message)
162
-	fullString := fmt.Sprintf("%s  %s : %s : %s : %s", time.Now().UTC().Format("2006-01-02T15:04:05Z"), logLevelDisplayNames[level], logType, object, message)
143
+	sep := grey(":")
144
+	fullStringFormatted := fmt.Sprintf("%s %s %s %s %s %s ", timeGrey(time.Now().UTC().Format("2006-01-02T15:04:05Z")), sep, levelDisplay, sep, section(logType), sep)
145
+	fullStringRaw := fmt.Sprintf("%s : %s : %s : ", time.Now().UTC().Format("2006-01-02T15:04:05Z"), logLevelDisplayNames[level], section(logType))
146
+	for i, p := range messageParts {
147
+		fullStringFormatted += p
148
+		fullStringRaw += p
149
+		if i != len(messageParts)-1 {
150
+			fullStringFormatted += " " + sep + " "
151
+			fullStringRaw += " : "
152
+		}
153
+	}
163 154
 
164 155
 	// output
165 156
 	if logger.MethodSTDERR {
166 157
 		fmt.Fprintln(os.Stderr, fullStringFormatted)
167 158
 	}
168 159
 	if logger.MethodFile.Enabled {
169
-		logger.MethodFile.Writer.WriteString(fullString + "\n")
160
+		logger.MethodFile.Writer.WriteString(fullStringRaw + "\n")
170 161
 	}
171 162
 }

+ 17
- 7
irc/server.go View File

@@ -219,6 +219,7 @@ func NewServer(configFilename string, config *Config, logger *Logger) (*Server,
219 219
 	}
220 220
 
221 221
 	// open data store
222
+	server.logger.Log(LogDebug, "startup", "Opening datastore")
222 223
 	db, err := buntdb.Open(config.Datastore.Path)
223 224
 	if err != nil {
224 225
 		return nil, fmt.Errorf("Failed to open datastore: %s", err.Error())
@@ -241,10 +242,12 @@ func NewServer(configFilename string, config *Config, logger *Logger) (*Server,
241 242
 	}
242 243
 
243 244
 	// load *lines
245
+	server.logger.Log(LogDebug, "startup", "Loading D/Klines")
244 246
 	server.loadDLines()
245 247
 	server.loadKLines()
246 248
 
247 249
 	// load password manager
250
+	server.logger.Log(LogDebug, "startup", "Loading passwords")
248 251
 	err = server.store.View(func(tx *buntdb.Tx) error {
249 252
 		saltString, err := tx.Get(keySalt)
250 253
 		if err != nil {
@@ -264,6 +267,7 @@ func NewServer(configFilename string, config *Config, logger *Logger) (*Server,
264 267
 		return nil, fmt.Errorf("Could not load salt: %s", err.Error())
265 268
 	}
266 269
 
270
+	server.logger.Log(LogDebug, "startup", "Loading MOTD")
267 271
 	if config.Server.MOTD != "" {
268 272
 		file, err := os.Open(config.Server.MOTD)
269 273
 		if err == nil {
@@ -378,7 +382,7 @@ func (server *Server) Shutdown() {
378 382
 	server.clients.ByNickMutex.RUnlock()
379 383
 
380 384
 	if err := server.store.Close(); err != nil {
381
-		server.logger.Log(LogError, "shutdown", "db", fmt.Sprintln("Server.Shutdown store.Close: error:", err))
385
+		server.logger.Log(LogError, "shutdown", fmt.Sprintln("Could not close datastore:", err))
382 386
 	}
383 387
 }
384 388
 
@@ -395,10 +399,10 @@ func (server *Server) Run() {
395 399
 			done = true
396 400
 
397 401
 		case <-server.rehashSignal:
398
-			// eventually we expect to use HUP to reload config
402
+			server.logger.Log(LogInfo, "rehash", "Rehashing due to SIGHUP")
399 403
 			err := server.rehash()
400 404
 			if err != nil {
401
-				server.logger.Log(LogError, "rehash", "server", fmt.Sprintln("Failed to rehash:", err.Error()))
405
+				server.logger.Log(LogError, "rehash", fmt.Sprintln("Failed to rehash:", err.Error()))
402 406
 			}
403 407
 
404 408
 		case conn := <-server.newConns:
@@ -450,6 +454,8 @@ func (server *Server) Run() {
450 454
 					continue
451 455
 				}
452 456
 
457
+				server.logger.Log(LogDebug, "localconnect-ip", fmt.Sprintf("Client connecting from %v", ipaddr))
458
+
453 459
 				go NewClient(server, conn.Conn, conn.IsTLS)
454 460
 				continue
455 461
 			}
@@ -497,7 +503,7 @@ func (server *Server) createListener(addr string, tlsMap map[string]*tls.Config)
497 503
 	server.listeners[addr] = li
498 504
 
499 505
 	// start listening
500
-	server.logger.Log(LogInfo, "listeners", "listener", fmt.Sprintf("listening on %s using %s.", addr, tlsString))
506
+	server.logger.Log(LogInfo, "listeners", fmt.Sprintf("listening on %s using %s.", addr, tlsString))
501 507
 
502 508
 	// setup accept goroutine
503 509
 	go func() {
@@ -549,7 +555,7 @@ func (server *Server) createListener(addr string, tlsMap map[string]*tls.Config)
549 555
 					server.listenerUpdateMutex.Unlock()
550 556
 
551 557
 					// print notice
552
-					server.logger.Log(LogInfo, "listeners", "listener", fmt.Sprintf("updated listener %s using %s.", addr, tlsString))
558
+					server.logger.Log(LogInfo, "listeners", fmt.Sprintf("updated listener %s using %s.", addr, tlsString))
553 559
 				}
554 560
 			default:
555 561
 				// no events waiting for us, fall-through and continue
@@ -596,7 +602,7 @@ func (server *Server) wslisten(addr string, tlsMap map[string]*TLSListenConfig)
596 602
 		if listenTLS {
597 603
 			tlsString = "TLS"
598 604
 		}
599
-		server.logger.Log(LogInfo, "listeners", "listener", fmt.Sprintf("websocket listening on %s using %s.", addr, tlsString))
605
+		server.logger.Log(LogInfo, "listeners", fmt.Sprintf("websocket listening on %s using %s.", addr, tlsString))
600 606
 
601 607
 		if listenTLS {
602 608
 			err = http.ListenAndServeTLS(addr, config.Cert, config.Key, nil)
@@ -604,7 +610,7 @@ func (server *Server) wslisten(addr string, tlsMap map[string]*TLSListenConfig)
604 610
 			err = http.ListenAndServe(addr, nil)
605 611
 		}
606 612
 		if err != nil {
607
-			server.logger.Log(LogError, "listeners", "listener", fmt.Sprintf("listenAndServe error [%s]: %s", tlsString, err))
613
+			server.logger.Log(LogError, "listeners", fmt.Sprintf("listenAndServe error [%s]: %s", tlsString, err))
608 614
 		}
609 615
 	}()
610 616
 }
@@ -651,6 +657,8 @@ func (server *Server) tryRegister(c *Client) {
651 657
 	c.RplISupport()
652 658
 	server.MOTD(c)
653 659
 	c.Send(nil, c.nickMaskString, RPL_UMODEIS, c.nick, c.ModeString())
660
+
661
+	server.logger.Log(LogDebug, "localconnect", fmt.Sprintf("Client registered [%s]", c.nick))
654 662
 }
655 663
 
656 664
 // MOTD serves the Message of the Day.
@@ -1399,11 +1407,13 @@ func (server *Server) rehash() error {
1399 1407
 
1400 1408
 // REHASH
1401 1409
 func rehashHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool {
1410
+	server.logger.Log(LogInfo, "rehash", fmt.Sprintf("REHASH command used by %s", client.nick))
1402 1411
 	err := server.rehash()
1403 1412
 
1404 1413
 	if err == nil {
1405 1414
 		client.Send(nil, server.name, RPL_REHASHING, client.nick, "ircd.yaml", "Rehashing")
1406 1415
 	} else {
1416
+		server.logger.Log(LogError, "rehash", fmt.Sprintln("Failed to rehash:", err.Error()))
1407 1417
 		client.Send(nil, server.name, ERR_UNKNOWNERROR, client.nick, "REHASH", err.Error())
1408 1418
 	}
1409 1419
 	return false

+ 6
- 3
oragono.go View File

@@ -90,14 +90,17 @@ Options:
90 90
 		}
91 91
 	} else if arguments["run"].(bool) {
92 92
 		rand.Seed(time.Now().UTC().UnixNano())
93
+		if !arguments["--quiet"].(bool) {
94
+			logger.Log(irc.LogInfo, "startup", fmt.Sprintf("Oragono v%s starting", irc.SemVer))
95
+		}
93 96
 		server, err := irc.NewServer(configfile, config, logger)
94 97
 		if err != nil {
95
-			logger.Log(irc.LogError, "startup", "server", fmt.Sprintf("Could not load server: %s", err.Error()))
98
+			logger.Log(irc.LogError, "startup", fmt.Sprintf("Could not load server: %s", err.Error()))
96 99
 			return
97 100
 		}
98 101
 		if !arguments["--quiet"].(bool) {
99
-			logger.Log(irc.LogInfo, "startup", "server", fmt.Sprintf("Oragono v%s running", irc.SemVer))
100
-			defer logger.Log(irc.LogInfo, "shutdown", "server", fmt.Sprintf("Oragono v%s exiting", irc.SemVer))
102
+			logger.Log(irc.LogInfo, "startup", "Server running")
103
+			defer logger.Log(irc.LogInfo, "shutdown", fmt.Sprintf("Oragono v%s exiting", irc.SemVer))
101 104
 		}
102 105
 		server.Run()
103 106
 	}

Loading…
Cancel
Save