Преглед на файлове

logger: Very initial working new logs

tags/v0.7.0
Daniel Oaks преди 7 години
родител
ревизия
29e89b16a0
променени са 5 файла, в които са добавени 51 реда и са изтрити 33 реда
  1. 2
    2
      irc/client.go
  2. 7
    0
      irc/config.go
  3. 9
    2
      irc/logger.go
  4. 22
    22
      irc/server.go
  5. 11
    7
      oragono.go

+ 2
- 2
irc/client.go Целия файл

@@ -402,7 +402,7 @@ func (client *Client) AllNickmasks() []string {
402 402
 // SetNickname sets the very first nickname for the client.
403 403
 func (client *Client) SetNickname(nickname string) error {
404 404
 	if client.HasNick() {
405
-		Log.error.Printf("%s nickname already set!", client.nickMaskString)
405
+		client.server.logger.Log(LogError, "nick", client.nick, fmt.Sprintf("%s nickname already set, something is wrong with server consistency", client.nickMaskString))
406 406
 		return ErrNickAlreadySet
407 407
 	}
408 408
 
@@ -543,7 +543,7 @@ var (
543 543
 		"NOTICE":  true,
544 544
 
545 545
 		RPL_WHOISCHANNELS: true,
546
-		RPL_USERHOST: true,
546
+		RPL_USERHOST:      true,
547 547
 	}
548 548
 )
549 549
 

+ 7
- 0
irc/config.go Целия файл

@@ -355,8 +355,10 @@ func LoadConfig(filename string) (config *Config, err error) {
355 355
 	if config.Limits.LineLen.Tags < 512 || config.Limits.LineLen.Rest < 512 {
356 356
 		return nil, errors.New("Line lengths must be 512 or greater (check the linelen section under server->limits)")
357 357
 	}
358
+	var newLogConfigs []LoggingConfig
358 359
 	for _, logConfig := range config.Logging {
359 360
 		// methods
361
+		logConfig.Methods = make(map[string]bool)
360 362
 		for _, method := range strings.Split(logConfig.Method, " ") {
361 363
 			if len(method) > 0 {
362 364
 				logConfig.Methods[strings.ToLower(method)] = true
@@ -374,6 +376,8 @@ func LoadConfig(filename string) (config *Config, err error) {
374 376
 		logConfig.Level = level
375 377
 
376 378
 		// types
379
+		logConfig.Types = make(map[string]bool)
380
+		logConfig.ExcludedTypes = make(map[string]bool)
377 381
 		for _, typeStr := range strings.Split(logConfig.TypeString, " ") {
378 382
 			if len(typeStr) == 0 {
379 383
 				continue
@@ -391,7 +395,10 @@ func LoadConfig(filename string) (config *Config, err error) {
391 395
 		if len(logConfig.Types) < 1 {
392 396
 			return nil, errors.New("Logger has no types to log")
393 397
 		}
398
+
399
+		newLogConfigs = append(newLogConfigs, logConfig)
394 400
 	}
401
+	config.Logging = newLogConfigs
395 402
 
396 403
 	return config, nil
397 404
 }

+ 9
- 2
irc/logger.go Целия файл

@@ -34,6 +34,12 @@ var (
34 34
 		"error":    LogError,
35 35
 		"errors":   LogError,
36 36
 	}
37
+	logLevelDisplayNames = map[LogLevel]string{
38
+		LogDebug: "debug",
39
+		LogInfo:  "info",
40
+		LogWarn:  "warning",
41
+		LogError: "error",
42
+	}
37 43
 )
38 44
 
39 45
 // ClientLogger is a logger dedicated to a single client. This is a convenience class that
@@ -77,7 +83,7 @@ func NewLogger(config []LoggingConfig) (*Logger, error) {
77 83
 			ExcludedTypes: logConfig.ExcludedTypes,
78 84
 		}
79 85
 		if sLogger.MethodFile.Enabled {
80
-			file, err := os.OpenFile(sLogger.MethodFile.Filename, os.O_APPEND, 0666)
86
+			file, err := os.OpenFile(sLogger.MethodFile.Filename, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0666)
81 87
 			if err != nil {
82 88
 				return nil, fmt.Errorf("Could not open log file %s [%s]", sLogger.MethodFile.Filename, err.Error())
83 89
 			}
@@ -85,6 +91,7 @@ func NewLogger(config []LoggingConfig) (*Logger, error) {
85 91
 			sLogger.MethodFile.File = file
86 92
 			sLogger.MethodFile.Writer = writer
87 93
 		}
94
+		logger.loggers = append(logger.loggers, sLogger)
88 95
 	}
89 96
 
90 97
 	return &logger, nil
@@ -132,7 +139,7 @@ func (logger *SingleLogger) Log(level LogLevel, logType, object, message string)
132 139
 	}
133 140
 
134 141
 	// assemble full line
135
-	fullString := fmt.Sprintf("%s : %s : %s : %s", time.Now().UTC().Format("2006-01-02T15:04:05.999Z"), logType, object, message)
142
+	fullString := fmt.Sprintf("%s : %s : %s : %s : %s", time.Now().UTC().Format("2006-01-02T15:04:05Z"), logLevelDisplayNames[level], logType, object, message)
136 143
 
137 144
 	// output
138 145
 	if logger.MethodSTDERR {

+ 22
- 22
irc/server.go Целия файл

@@ -136,18 +136,17 @@ type clientConn struct {
136 136
 }
137 137
 
138 138
 // NewServer returns a new Oragono server.
139
-func NewServer(configFilename string, config *Config) *Server {
139
+func NewServer(configFilename string, config *Config, logger *Logger) (*Server, error) {
140 140
 	casefoldedName, err := Casefold(config.Server.Name)
141 141
 	if err != nil {
142
-		log.Println(fmt.Sprintf("Server name isn't valid: [%s]", config.Server.Name), err.Error())
143
-		return nil
142
+		return nil, fmt.Errorf("Server name isn't valid [%s]: %s", config.Server.Name, err.Error())
144 143
 	}
145 144
 
146 145
 	// startup check that we have HELP entries for every command
147 146
 	for name := range Commands {
148 147
 		_, exists := Help[strings.ToLower(name)]
149 148
 		if !exists {
150
-			log.Fatal("Help entry does not exist for ", name)
149
+			return nil, fmt.Errorf("Help entry does not exist for command %s", name)
151 150
 		}
152 151
 	}
153 152
 
@@ -162,20 +161,20 @@ func NewServer(configFilename string, config *Config) *Server {
162 161
 
163 162
 	operClasses, err := config.OperatorClasses()
164 163
 	if err != nil {
165
-		log.Fatal("Error loading oper classes:", err.Error())
164
+		return nil, fmt.Errorf("Error loading oper classes: %s", err.Error())
166 165
 	}
167 166
 	opers, err := config.Operators(operClasses)
168 167
 	if err != nil {
169
-		log.Fatal("Error loading operators:", err.Error())
168
+		return nil, fmt.Errorf("Error loading operators: %s", err.Error())
170 169
 	}
171 170
 
172 171
 	connectionLimits, err := NewConnectionLimits(config.Server.ConnectionLimits)
173 172
 	if err != nil {
174
-		log.Fatal("Error loading connection limits:", err.Error())
173
+		return nil, fmt.Errorf("Error loading connection limits: %s", err.Error())
175 174
 	}
176 175
 	connectionThrottle, err := NewConnectionThrottle(config.Server.ConnectionThrottle)
177 176
 	if err != nil {
178
-		log.Fatal("Error loading connection throttler:", err.Error())
177
+		return nil, fmt.Errorf("Error loading connection throttler: %s", err.Error())
179 178
 	}
180 179
 
181 180
 	server := &Server{
@@ -204,6 +203,7 @@ func NewServer(configFilename string, config *Config) *Server {
204 203
 			},
205 204
 		},
206 205
 		listeners:      make(map[string]ListenerInterface),
206
+		logger:         logger,
207 207
 		monitoring:     make(map[string][]Client),
208 208
 		name:           config.Server.Name,
209 209
 		nameCasefolded: casefoldedName,
@@ -221,7 +221,7 @@ func NewServer(configFilename string, config *Config) *Server {
221 221
 	// open data store
222 222
 	db, err := buntdb.Open(config.Datastore.Path)
223 223
 	if err != nil {
224
-		log.Fatal(fmt.Sprintf("Failed to open datastore: %s", err.Error()))
224
+		return nil, fmt.Errorf("Failed to open datastore: %s", err.Error())
225 225
 	}
226 226
 	server.store = db
227 227
 
@@ -229,7 +229,7 @@ func NewServer(configFilename string, config *Config) *Server {
229 229
 	err = server.store.View(func(tx *buntdb.Tx) error {
230 230
 		version, _ := tx.Get(keySchemaVersion)
231 231
 		if version != latestDbSchema {
232
-			log.Println(fmt.Sprintf("Database must be updated. Expected schema v%s, got v%s.", latestDbSchema, version))
232
+			logger.Log(LogError, "startup", "server", fmt.Sprintf("Database must be updated. Expected schema v%s, got v%s.", latestDbSchema, version))
233 233
 			return errDbOutOfDate
234 234
 		}
235 235
 		return nil
@@ -237,7 +237,7 @@ func NewServer(configFilename string, config *Config) *Server {
237 237
 	if err != nil {
238 238
 		// close the db
239 239
 		db.Close()
240
-		return nil
240
+		return nil, errDbOutOfDate
241 241
 	}
242 242
 
243 243
 	// load *lines
@@ -261,7 +261,7 @@ func NewServer(configFilename string, config *Config) *Server {
261 261
 		return nil
262 262
 	})
263 263
 	if err != nil {
264
-		log.Fatal(fmt.Sprintf("Could not load salt: %s", err.Error()))
264
+		return nil, fmt.Errorf("Could not load salt: %s", err.Error())
265 265
 	}
266 266
 
267 267
 	if config.Server.MOTD != "" {
@@ -309,11 +309,11 @@ func NewServer(configFilename string, config *Config) *Server {
309 309
 
310 310
 	// start API if enabled
311 311
 	if server.restAPI.Enabled {
312
-		Log.info.Printf("%s rest API started on %s .", server.name, server.restAPI.Listen)
312
+		logger.Log(LogInfo, "startup", "server", fmt.Sprintf("%s rest API started on %s.", server.name, server.restAPI.Listen))
313 313
 		server.startRestAPI()
314 314
 	}
315 315
 
316
-	return server
316
+	return server, nil
317 317
 }
318 318
 
319 319
 // setISupport sets up our RPL_ISUPPORT reply.
@@ -378,7 +378,7 @@ func (server *Server) Shutdown() {
378 378
 	server.clients.ByNickMutex.RUnlock()
379 379
 
380 380
 	if err := server.store.Close(); err != nil {
381
-		Log.error.Println("Server.Shutdown store.Close: error:", err)
381
+		server.logger.Log(LogError, "shutdown", "db", fmt.Sprintln("Server.Shutdown store.Close: error:", err))
382 382
 	}
383 383
 }
384 384
 
@@ -398,7 +398,7 @@ func (server *Server) Run() {
398 398
 			// eventually we expect to use HUP to reload config
399 399
 			err := server.rehash()
400 400
 			if err != nil {
401
-				Log.error.Println("Failed to rehash:", err.Error())
401
+				server.logger.Log(LogError, "rehash", "server", fmt.Sprintln("Failed to rehash:", err.Error()))
402 402
 			}
403 403
 
404 404
 		case conn := <-server.newConns:
@@ -497,7 +497,7 @@ func (server *Server) createListener(addr string, tlsMap map[string]*tls.Config)
497 497
 	server.listeners[addr] = li
498 498
 
499 499
 	// start listening
500
-	Log.info.Printf("%s listening on %s using %s.", server.name, addr, tlsString)
500
+	server.logger.Log(LogInfo, "listeners", "listener", fmt.Sprintf("listening on %s using %s.", addr, tlsString))
501 501
 
502 502
 	// setup accept goroutine
503 503
 	go func() {
@@ -549,7 +549,7 @@ func (server *Server) createListener(addr string, tlsMap map[string]*tls.Config)
549 549
 					server.listenerUpdateMutex.Unlock()
550 550
 
551 551
 					// print notice
552
-					Log.info.Printf("%s updated listener %s using %s.", server.name, addr, tlsString)
552
+					server.logger.Log(LogInfo, "listeners", "listener", fmt.Sprintf("updated listener %s using %s.", addr, tlsString))
553 553
 				}
554 554
 			default:
555 555
 				// no events waiting for us, fall-through and continue
@@ -565,7 +565,7 @@ func (server *Server) createListener(addr string, tlsMap map[string]*tls.Config)
565 565
 func (server *Server) wslisten(addr string, tlsMap map[string]*TLSListenConfig) {
566 566
 	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
567 567
 		if r.Method != "GET" {
568
-			Log.error.Printf("%s method not allowed", server.name)
568
+			server.logger.Log(LogError, "ws", addr, fmt.Sprintf("%s method not allowed", r.Method))
569 569
 			return
570 570
 		}
571 571
 
@@ -578,7 +578,7 @@ func (server *Server) wslisten(addr string, tlsMap map[string]*TLSListenConfig)
578 578
 
579 579
 		ws, err := upgrader.Upgrade(w, r, nil)
580 580
 		if err != nil {
581
-			Log.error.Printf("%s websocket upgrade error: %s", server.name, err)
581
+			server.logger.Log(LogError, "ws", addr, fmt.Sprintf("%s websocket upgrade error: %s", server.name, err))
582 582
 			return
583 583
 		}
584 584
 
@@ -596,7 +596,7 @@ func (server *Server) wslisten(addr string, tlsMap map[string]*TLSListenConfig)
596 596
 		if listenTLS {
597 597
 			tlsString = "TLS"
598 598
 		}
599
-		Log.info.Printf("%s websocket listening on %s using %s.", server.name, addr, tlsString)
599
+		server.logger.Log(LogInfo, "listeners", "listener", fmt.Sprintf("websocket listening on %s using %s.", addr, tlsString))
600 600
 
601 601
 		if listenTLS {
602 602
 			err = http.ListenAndServeTLS(addr, config.Cert, config.Key, nil)
@@ -604,7 +604,7 @@ func (server *Server) wslisten(addr string, tlsMap map[string]*TLSListenConfig)
604 604
 			err = http.ListenAndServe(addr, nil)
605 605
 		}
606 606
 		if err != nil {
607
-			Log.error.Printf("%s listenAndServe (%s) error: %s", server.name, tlsString, err)
607
+			server.logger.Log(LogError, "listeners", "listener", fmt.Sprintf("listenAndServe error [%s]: %s", tlsString, err))
608 608
 		}
609 609
 	}()
610 610
 }

+ 11
- 7
oragono.go Целия файл

@@ -43,6 +43,11 @@ Options:
43 43
 		log.Fatal("Config file did not load successfully:", err.Error())
44 44
 	}
45 45
 
46
+	logger, err := irc.NewLogger(config.Logging)
47
+	if err != nil {
48
+		log.Fatal("Logger did not load successfully:", err.Error())
49
+	}
50
+
46 51
 	if arguments["genpasswd"].(bool) {
47 52
 		fmt.Print("Enter Password: ")
48 53
 		bytePassword, err := terminal.ReadPassword(int(syscall.Stdin))
@@ -52,7 +57,7 @@ Options:
52 57
 		password := string(bytePassword)
53 58
 		encoded, err := irc.GenerateEncodedPassword(password)
54 59
 		if err != nil {
55
-			log.Fatalln("encoding error:", err)
60
+			log.Fatal("encoding error:", err.Error())
56 61
 		}
57 62
 		fmt.Print("\n")
58 63
 		fmt.Println(encoded)
@@ -84,16 +89,15 @@ Options:
84 89
 			}
85 90
 		}
86 91
 	} else if arguments["run"].(bool) {
87
-		irc.Log.SetLevel(config.Server.Log)
88 92
 		rand.Seed(time.Now().UTC().UnixNano())
89
-		server := irc.NewServer(configfile, config)
90
-		if server == nil {
91
-			log.Println("Could not load server")
93
+		server, err := irc.NewServer(configfile, config, logger)
94
+		if err != nil {
95
+			logger.Log(irc.LogError, "startup", "server", fmt.Sprintf("Could not load server: %s", err.Error()))
92 96
 			return
93 97
 		}
94 98
 		if !arguments["--quiet"].(bool) {
95
-			log.Println(fmt.Sprintf("Oragono v%s running", irc.SemVer))
96
-			defer log.Println(irc.SemVer, "exiting")
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))
97 101
 		}
98 102
 		server.Run()
99 103
 	}

Loading…
Отказ
Запис