Переглянути джерело

logger: Move to separate package, make *much* nicer

tags/v0.7.0
Daniel Oaks 7 роки тому
джерело
коміт
439331cfb8
6 змінених файлів з 160 додано та 86 видалено
  1. 2
    2
      irc/channel.go
  2. 5
    5
      irc/client.go
  3. 16
    14
      irc/config.go
  4. 92
    35
      irc/logger/logger.go
  5. 26
    25
      irc/server.go
  6. 19
    5
      oragono.go

+ 2
- 2
irc/channel.go Переглянути файл

@@ -264,7 +264,7 @@ func (channel *Channel) Join(client *Client, key string) {
264 264
 		return
265 265
 	}
266 266
 
267
-	client.server.logger.Log(LogDebug, "join", fmt.Sprintf("%s joined channel %s", client.nick, channel.name))
267
+	client.server.logger.Debug("join", fmt.Sprintf("%s joined channel %s", client.nick, channel.name))
268 268
 
269 269
 	for member := range channel.members {
270 270
 		if member.capabilities[ExtendedJoin] {
@@ -306,7 +306,7 @@ func (channel *Channel) Part(client *Client, message string) {
306 306
 	}
307 307
 	channel.Quit(client)
308 308
 
309
-	client.server.logger.Log(LogDebug, "part", fmt.Sprintf("%s left channel %s", client.nick, channel.name))
309
+	client.server.logger.Debug("part", fmt.Sprintf("%s left channel %s", client.nick, channel.name))
310 310
 }
311 311
 
312 312
 func (channel *Channel) GetTopic(client *Client) {

+ 5
- 5
irc/client.go Переглянути файл

@@ -170,7 +170,7 @@ func (client *Client) run() {
170 170
 
171 171
 		maxlenTags, maxlenRest := client.maxlens()
172 172
 
173
-		client.server.logger.Log(LogDebug, "userinput ", client.nick, "<- ", line)
173
+		client.server.logger.Debug("userinput ", client.nick, "<- ", line)
174 174
 
175 175
 		msg, err = ircmsg.ParseLineMaxLen(line, maxlenTags, maxlenRest)
176 176
 		if err == ircmsg.ErrorLineIsEmpty {
@@ -404,7 +404,7 @@ func (client *Client) AllNickmasks() []string {
404 404
 // SetNickname sets the very first nickname for the client.
405 405
 func (client *Client) SetNickname(nickname string) error {
406 406
 	if client.HasNick() {
407
-		client.server.logger.Log(LogError, "nick", fmt.Sprintf("%s nickname already set, something is wrong with server consistency", client.nickMaskString))
407
+		client.server.logger.Error("nick", fmt.Sprintf("%s nickname already set, something is wrong with server consistency", client.nickMaskString))
408 408
 		return ErrNickAlreadySet
409 409
 	}
410 410
 
@@ -421,7 +421,7 @@ func (client *Client) ChangeNickname(nickname string) error {
421 421
 	origNickMask := client.nickMaskString
422 422
 	err := client.server.clients.Replace(client.nick, nickname, client)
423 423
 	if err == nil {
424
-		client.server.logger.Log(LogDebug, "nick", fmt.Sprintf("%s changed nickname to %s", client.nick, nickname))
424
+		client.server.logger.Debug("nick", fmt.Sprintf("%s changed nickname to %s", client.nick, nickname))
425 425
 		client.server.whoWas.Append(client)
426 426
 		client.nick = nickname
427 427
 		client.updateNickMask()
@@ -446,7 +446,7 @@ func (client *Client) destroy() {
446 446
 		return
447 447
 	}
448 448
 
449
-	client.server.logger.Log(LogDebug, "quit", fmt.Sprintf("%s is no longer on the server", client.nick))
449
+	client.server.logger.Debug("quit", fmt.Sprintf("%s is no longer on the server", client.nick))
450 450
 
451 451
 	// send quit/error message to client if they haven't been sent already
452 452
 	client.Quit("Connection closed")
@@ -595,7 +595,7 @@ func (client *Client) Send(tags *map[string]ircmsg.TagValue, prefix string, comm
595 595
 		line = line[:len(line)-3] + "\r\n"
596 596
 	}
597 597
 
598
-	client.server.logger.Log(LogDebug, "useroutput", client.nick, " ->", strings.TrimRight(line, "\r\n"))
598
+	client.server.logger.Debug("useroutput", client.nick, " ->", strings.TrimRight(line, "\r\n"))
599 599
 
600 600
 	client.socket.Write(line)
601 601
 	return nil

+ 16
- 14
irc/config.go Переглянути файл

@@ -15,6 +15,7 @@ import (
15 15
 	"time"
16 16
 
17 17
 	"github.com/DanielOaks/oragono/irc/custime"
18
+	"github.com/DanielOaks/oragono/irc/logger"
18 19
 	"gopkg.in/yaml.v2"
19 20
 )
20 21
 
@@ -119,13 +120,14 @@ type ConnectionThrottleConfig struct {
119 120
 
120 121
 type LoggingConfig struct {
121 122
 	Method        string
122
-	Methods       map[string]bool
123
+	MethodStderr  bool
124
+	MethodFile    bool
123 125
 	Filename      string
124
-	TypeString    string          `yaml:"type"`
125
-	Types         map[string]bool `yaml:"real-types"`
126
-	ExcludedTypes map[string]bool `yaml:"real-excluded-types"`
127
-	LevelString   string          `yaml:"level"`
128
-	Level         LogLevel        `yaml:"level-real"`
126
+	TypeString    string       `yaml:"type"`
127
+	Types         []string     `yaml:"real-types"`
128
+	ExcludedTypes []string     `yaml:"real-excluded-types"`
129
+	LevelString   string       `yaml:"level"`
130
+	Level         logger.Level `yaml:"level-real"`
129 131
 }
130 132
 
131 133
 type LineLenConfig struct {
@@ -389,26 +391,26 @@ func LoadConfig(filename string) (config *Config, err error) {
389 391
 	var newLogConfigs []LoggingConfig
390 392
 	for _, logConfig := range config.Logging {
391 393
 		// methods
392
-		logConfig.Methods = make(map[string]bool)
394
+		methods := make(map[string]bool)
393 395
 		for _, method := range strings.Split(logConfig.Method, " ") {
394 396
 			if len(method) > 0 {
395
-				logConfig.Methods[strings.ToLower(method)] = true
397
+				methods[strings.ToLower(method)] = true
396 398
 			}
397 399
 		}
398
-		if logConfig.Methods["file"] && logConfig.Filename == "" {
400
+		if methods["file"] && logConfig.Filename == "" {
399 401
 			return nil, errors.New("Logging configuration specifies 'file' method but 'filename' is empty")
400 402
 		}
403
+		logConfig.MethodFile = methods["file"]
404
+		logConfig.MethodStderr = methods["stderr"]
401 405
 
402 406
 		// levels
403
-		level, exists := logLevelNames[strings.ToLower(logConfig.LevelString)]
407
+		level, exists := logger.LogLevelNames[strings.ToLower(logConfig.LevelString)]
404 408
 		if !exists {
405 409
 			return nil, fmt.Errorf("Could not translate log leve [%s]", logConfig.LevelString)
406 410
 		}
407 411
 		logConfig.Level = level
408 412
 
409 413
 		// types
410
-		logConfig.Types = make(map[string]bool)
411
-		logConfig.ExcludedTypes = make(map[string]bool)
412 414
 		for _, typeStr := range strings.Split(logConfig.TypeString, " ") {
413 415
 			if len(typeStr) == 0 {
414 416
 				continue
@@ -418,9 +420,9 @@ func LoadConfig(filename string) (config *Config, err error) {
418 420
 			}
419 421
 			if typeStr[0] == '-' {
420 422
 				typeStr = typeStr[1:]
421
-				logConfig.ExcludedTypes[typeStr] = true
423
+				logConfig.ExcludedTypes = append(logConfig.ExcludedTypes, typeStr)
422 424
 			} else {
423
-				logConfig.Types[typeStr] = true
425
+				logConfig.Types = append(logConfig.Types, typeStr)
424 426
 			}
425 427
 		}
426 428
 		if len(logConfig.Types) < 1 {

irc/logger.go → irc/logger/logger.go Переглянути файл

@@ -1,7 +1,7 @@
1 1
 // Copyright (c) 2017 Daniel Oaks <daniel@danieloaks.net>
2 2
 // released under the MIT license
3 3
 
4
-package irc
4
+package logger
5 5
 
6 6
 import (
7 7
 	"bufio"
@@ -17,62 +17,84 @@ import (
17 17
 	"github.com/mgutz/ansi"
18 18
 )
19 19
 
20
-// LogLevel represents the level to log messages at.
21
-type LogLevel int
20
+// Level represents the level to log messages at.
21
+type Level int
22 22
 
23 23
 const (
24 24
 	// LogDebug represents debug messages.
25
-	LogDebug LogLevel = iota
25
+	LogDebug Level = iota
26 26
 	// LogInfo represents informational messages.
27 27
 	LogInfo
28
-	// LogWarn represents warnings.
29
-	LogWarn
28
+	// LogWarning represents warnings.
29
+	LogWarning
30 30
 	// LogError represents errors.
31 31
 	LogError
32 32
 )
33 33
 
34 34
 var (
35
-	logLevelNames = map[string]LogLevel{
35
+	LogLevelNames = map[string]Level{
36 36
 		"debug":    LogDebug,
37 37
 		"info":     LogInfo,
38
-		"warn":     LogWarn,
39
-		"warning":  LogWarn,
40
-		"warnings": LogWarn,
38
+		"warn":     LogWarning,
39
+		"warning":  LogWarning,
40
+		"warnings": LogWarning,
41 41
 		"error":    LogError,
42 42
 		"errors":   LogError,
43 43
 	}
44
-	logLevelDisplayNames = map[LogLevel]string{
45
-		LogDebug: "debug",
46
-		LogInfo:  "info",
47
-		LogWarn:  "warning",
48
-		LogError: "error",
44
+	LogLevelDisplayNames = map[Level]string{
45
+		LogDebug:   "debug",
46
+		LogInfo:    "info",
47
+		LogWarning: "warning",
48
+		LogError:   "error",
49 49
 	}
50 50
 )
51 51
 
52
-// Logger is the main interface used to log debug/info/error messages.
53
-type Logger struct {
54
-	loggers         []SingleLogger
52
+// Manager is the main interface used to log debug/info/error messages.
53
+type Manager struct {
54
+	loggers         []singleLogger
55 55
 	stderrWriteLock sync.Mutex
56 56
 	DumpingRawInOut bool
57 57
 }
58 58
 
59
-// NewLogger returns a new Logger.
60
-func NewLogger(config []LoggingConfig) (*Logger, error) {
61
-	var logger Logger
59
+// Config represents the configuration of a single logger.
60
+type Config struct {
61
+	// logging methods
62
+	MethodStderr bool
63
+	MethodFile   bool
64
+	Filename     string
65
+	// logging level
66
+	Level Level
67
+	// logging types
68
+	Types         []string
69
+	ExcludedTypes []string
70
+}
71
+
72
+// NewManager returns a new log manager.
73
+func NewManager(config ...Config) (*Manager, error) {
74
+	var logger Manager
62 75
 
63 76
 	for _, logConfig := range config {
64
-		sLogger := SingleLogger{
65
-			MethodSTDERR: logConfig.Methods["stderr"],
77
+		typeMap := make(map[string]bool)
78
+		for _, name := range logConfig.Types {
79
+			typeMap[name] = true
80
+		}
81
+		excludedTypeMap := make(map[string]bool)
82
+		for _, name := range logConfig.ExcludedTypes {
83
+			excludedTypeMap[name] = true
84
+		}
85
+
86
+		sLogger := singleLogger{
87
+			MethodSTDERR: logConfig.MethodStderr,
66 88
 			MethodFile: fileMethod{
67
-				Enabled:  logConfig.Methods["file"],
89
+				Enabled:  logConfig.MethodFile,
68 90
 				Filename: logConfig.Filename,
69 91
 			},
70 92
 			Level:           logConfig.Level,
71
-			Types:           logConfig.Types,
72
-			ExcludedTypes:   logConfig.ExcludedTypes,
93
+			Types:           typeMap,
94
+			ExcludedTypes:   excludedTypeMap,
73 95
 			stderrWriteLock: &logger.stderrWriteLock,
74 96
 		}
75
-		if logConfig.Types["userinput"] || logConfig.Types["useroutput"] || (logConfig.Types["*"] && !(logConfig.ExcludedTypes["userinput"] && logConfig.ExcludedTypes["useroutput"])) {
97
+		if typeMap["userinput"] || typeMap["useroutput"] || (typeMap["*"] && !(excludedTypeMap["userinput"] && excludedTypeMap["useroutput"])) {
76 98
 			logger.DumpingRawInOut = true
77 99
 		}
78 100
 		if sLogger.MethodFile.Enabled {
@@ -91,12 +113,47 @@ func NewLogger(config []LoggingConfig) (*Logger, error) {
91 113
 }
92 114
 
93 115
 // Log logs the given message with the given details.
94
-func (logger *Logger) Log(level LogLevel, logType string, messageParts ...string) {
116
+func (logger *Manager) Log(level Level, logType string, messageParts ...string) {
95 117
 	for _, singleLogger := range logger.loggers {
96 118
 		singleLogger.Log(level, logType, messageParts...)
97 119
 	}
98 120
 }
99 121
 
122
+// Debug logs the given message as a debug message.
123
+func (logger *Manager) Debug(logType string, messageParts ...string) {
124
+	for _, singleLogger := range logger.loggers {
125
+		singleLogger.Log(LogDebug, logType, messageParts...)
126
+	}
127
+}
128
+
129
+// Info logs the given message as an info message.
130
+func (logger *Manager) Info(logType string, messageParts ...string) {
131
+	for _, singleLogger := range logger.loggers {
132
+		singleLogger.Log(LogInfo, logType, messageParts...)
133
+	}
134
+}
135
+
136
+// Warning logs the given message as a warning message.
137
+func (logger *Manager) Warning(logType string, messageParts ...string) {
138
+	for _, singleLogger := range logger.loggers {
139
+		singleLogger.Log(LogWarning, logType, messageParts...)
140
+	}
141
+}
142
+
143
+// Error logs the given message as an error message.
144
+func (logger *Manager) Error(logType string, messageParts ...string) {
145
+	for _, singleLogger := range logger.loggers {
146
+		singleLogger.Log(LogError, logType, messageParts...)
147
+	}
148
+}
149
+
150
+// Fatal logs the given message as an error message, then exits.
151
+func (logger *Manager) Fatal(logType string, messageParts ...string) {
152
+	logger.Error(logType, messageParts...)
153
+	logger.Error("FATAL", "Fatal error encountered, application exiting")
154
+	os.Exit(1)
155
+}
156
+
100 157
 type fileMethod struct {
101 158
 	Enabled  bool
102 159
 	Filename string
@@ -104,18 +161,18 @@ type fileMethod struct {
104 161
 	Writer   *bufio.Writer
105 162
 }
106 163
 
107
-// SingleLogger represents a single logger instance.
108
-type SingleLogger struct {
164
+// singleLogger represents a single logger instance.
165
+type singleLogger struct {
109 166
 	stderrWriteLock *sync.Mutex
110 167
 	MethodSTDERR    bool
111 168
 	MethodFile      fileMethod
112
-	Level           LogLevel
169
+	Level           Level
113 170
 	Types           map[string]bool
114 171
 	ExcludedTypes   map[string]bool
115 172
 }
116 173
 
117 174
 // Log logs the given message with the given details.
118
-func (logger *SingleLogger) Log(level LogLevel, logType string, messageParts ...string) {
175
+func (logger *singleLogger) Log(level Level, logType string, messageParts ...string) {
119 176
 	// no logging enabled
120 177
 	if !(logger.MethodSTDERR || logger.MethodFile.Enabled) {
121 178
 		return
@@ -142,10 +199,10 @@ func (logger *SingleLogger) Log(level LogLevel, logType string, messageParts ...
142 199
 	debug := ansi.ColorFunc("78")
143 200
 	section := ansi.ColorFunc("229")
144 201
 
145
-	levelDisplay := logLevelDisplayNames[level]
202
+	levelDisplay := LogLevelDisplayNames[level]
146 203
 	if level == LogError {
147 204
 		levelDisplay = alert(levelDisplay)
148
-	} else if level == LogWarn {
205
+	} else if level == LogWarning {
149 206
 		levelDisplay = warn(levelDisplay)
150 207
 	} else if level == LogInfo {
151 208
 		levelDisplay = info(levelDisplay)
@@ -155,7 +212,7 @@ func (logger *SingleLogger) Log(level LogLevel, logType string, messageParts ...
155 212
 
156 213
 	sep := grey(":")
157 214
 	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)
158
-	fullStringRaw := fmt.Sprintf("%s : %s : %s : ", time.Now().UTC().Format("2006-01-02T15:04:05Z"), logLevelDisplayNames[level], section(logType))
215
+	fullStringRaw := fmt.Sprintf("%s : %s : %s : ", time.Now().UTC().Format("2006-01-02T15:04:05Z"), LogLevelDisplayNames[level], section(logType))
159 216
 	for i, p := range messageParts {
160 217
 		fullStringFormatted += p
161 218
 		fullStringRaw += p

+ 26
- 25
irc/server.go Переглянути файл

@@ -24,6 +24,7 @@ import (
24 24
 	"time"
25 25
 
26 26
 	"github.com/DanielOaks/girc-go/ircmsg"
27
+	"github.com/DanielOaks/oragono/irc/logger"
27 28
 	"github.com/tidwall/buntdb"
28 29
 )
29 30
 
@@ -102,7 +103,7 @@ type Server struct {
102 103
 	listenerEventActMutex        sync.Mutex
103 104
 	listeners                    map[string]ListenerInterface
104 105
 	listenerUpdateMutex          sync.Mutex
105
-	logger                       *Logger
106
+	logger                       *logger.Manager
106 107
 	monitoring                   map[string][]Client
107 108
 	motdLines                    []string
108 109
 	name                         string
@@ -137,7 +138,7 @@ type clientConn struct {
137 138
 }
138 139
 
139 140
 // NewServer returns a new Oragono server.
140
-func NewServer(configFilename string, config *Config, logger *Logger) (*Server, error) {
141
+func NewServer(configFilename string, config *Config, logger *logger.Manager) (*Server, error) {
141 142
 	casefoldedName, err := Casefold(config.Server.Name)
142 143
 	if err != nil {
143 144
 		return nil, fmt.Errorf("Server name isn't valid [%s]: %s", config.Server.Name, err.Error())
@@ -226,7 +227,7 @@ func NewServer(configFilename string, config *Config, logger *Logger) (*Server,
226 227
 	}
227 228
 
228 229
 	// open data store
229
-	server.logger.Log(LogDebug, "startup", "Opening datastore")
230
+	server.logger.Debug("startup", "Opening datastore")
230 231
 	db, err := buntdb.Open(config.Datastore.Path)
231 232
 	if err != nil {
232 233
 		return nil, fmt.Errorf("Failed to open datastore: %s", err.Error())
@@ -237,7 +238,7 @@ func NewServer(configFilename string, config *Config, logger *Logger) (*Server,
237 238
 	err = server.store.View(func(tx *buntdb.Tx) error {
238 239
 		version, _ := tx.Get(keySchemaVersion)
239 240
 		if version != latestDbSchema {
240
-			logger.Log(LogError, "startup", "server", fmt.Sprintf("Database must be updated. Expected schema v%s, got v%s.", latestDbSchema, version))
241
+			logger.Error("startup", "server", fmt.Sprintf("Database must be updated. Expected schema v%s, got v%s.", latestDbSchema, version))
241 242
 			return errDbOutOfDate
242 243
 		}
243 244
 		return nil
@@ -249,12 +250,12 @@ func NewServer(configFilename string, config *Config, logger *Logger) (*Server,
249 250
 	}
250 251
 
251 252
 	// load *lines
252
-	server.logger.Log(LogDebug, "startup", "Loading D/Klines")
253
+	server.logger.Debug("startup", "Loading D/Klines")
253 254
 	server.loadDLines()
254 255
 	server.loadKLines()
255 256
 
256 257
 	// load password manager
257
-	server.logger.Log(LogDebug, "startup", "Loading passwords")
258
+	server.logger.Debug("startup", "Loading passwords")
258 259
 	err = server.store.View(func(tx *buntdb.Tx) error {
259 260
 		saltString, err := tx.Get(keySalt)
260 261
 		if err != nil {
@@ -274,7 +275,7 @@ func NewServer(configFilename string, config *Config, logger *Logger) (*Server,
274 275
 		return nil, fmt.Errorf("Could not load salt: %s", err.Error())
275 276
 	}
276 277
 
277
-	server.logger.Log(LogDebug, "startup", "Loading MOTD")
278
+	server.logger.Debug("startup", "Loading MOTD")
278 279
 	if config.Server.MOTD != "" {
279 280
 		file, err := os.Open(config.Server.MOTD)
280 281
 		if err == nil {
@@ -320,7 +321,7 @@ func NewServer(configFilename string, config *Config, logger *Logger) (*Server,
320 321
 
321 322
 	// start API if enabled
322 323
 	if server.restAPI.Enabled {
323
-		logger.Log(LogInfo, "startup", "server", fmt.Sprintf("%s rest API started on %s.", server.name, server.restAPI.Listen))
324
+		logger.Info("startup", "server", fmt.Sprintf("%s rest API started on %s.", server.name, server.restAPI.Listen))
324 325
 		server.startRestAPI()
325 326
 	}
326 327
 
@@ -389,7 +390,7 @@ func (server *Server) Shutdown() {
389 390
 	server.clients.ByNickMutex.RUnlock()
390 391
 
391 392
 	if err := server.store.Close(); err != nil {
392
-		server.logger.Log(LogError, "shutdown", fmt.Sprintln("Could not close datastore:", err))
393
+		server.logger.Error("shutdown", fmt.Sprintln("Could not close datastore:", err))
393 394
 	}
394 395
 }
395 396
 
@@ -406,10 +407,10 @@ func (server *Server) Run() {
406 407
 			done = true
407 408
 
408 409
 		case <-server.rehashSignal:
409
-			server.logger.Log(LogInfo, "rehash", "Rehashing due to SIGHUP")
410
+			server.logger.Info("rehash", "Rehashing due to SIGHUP")
410 411
 			err := server.rehash()
411 412
 			if err != nil {
412
-				server.logger.Log(LogError, "rehash", fmt.Sprintln("Failed to rehash:", err.Error()))
413
+				server.logger.Error("rehash", fmt.Sprintln("Failed to rehash:", err.Error()))
413 414
 			}
414 415
 
415 416
 		case conn := <-server.newConns:
@@ -461,7 +462,7 @@ func (server *Server) Run() {
461 462
 					continue
462 463
 				}
463 464
 
464
-				server.logger.Log(LogDebug, "localconnect-ip", fmt.Sprintf("Client connecting from %v", ipaddr))
465
+				server.logger.Debug("localconnect-ip", fmt.Sprintf("Client connecting from %v", ipaddr))
465 466
 
466 467
 				go NewClient(server, conn.Conn, conn.IsTLS)
467 468
 				continue
@@ -510,7 +511,7 @@ func (server *Server) createListener(addr string, tlsMap map[string]*tls.Config)
510 511
 	server.listeners[addr] = li
511 512
 
512 513
 	// start listening
513
-	server.logger.Log(LogInfo, "listeners", fmt.Sprintf("listening on %s using %s.", addr, tlsString))
514
+	server.logger.Info("listeners", fmt.Sprintf("listening on %s using %s.", addr, tlsString))
514 515
 
515 516
 	// setup accept goroutine
516 517
 	go func() {
@@ -562,7 +563,7 @@ func (server *Server) createListener(addr string, tlsMap map[string]*tls.Config)
562 563
 					server.listenerUpdateMutex.Unlock()
563 564
 
564 565
 					// print notice
565
-					server.logger.Log(LogInfo, "listeners", fmt.Sprintf("updated listener %s using %s.", addr, tlsString))
566
+					server.logger.Info("listeners", fmt.Sprintf("updated listener %s using %s.", addr, tlsString))
566 567
 				}
567 568
 			default:
568 569
 				// no events waiting for us, fall-through and continue
@@ -578,7 +579,7 @@ func (server *Server) createListener(addr string, tlsMap map[string]*tls.Config)
578 579
 func (server *Server) wslisten(addr string, tlsMap map[string]*TLSListenConfig) {
579 580
 	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
580 581
 		if r.Method != "GET" {
581
-			server.logger.Log(LogError, "ws", addr, fmt.Sprintf("%s method not allowed", r.Method))
582
+			server.logger.Error("ws", addr, fmt.Sprintf("%s method not allowed", r.Method))
582 583
 			return
583 584
 		}
584 585
 
@@ -591,7 +592,7 @@ func (server *Server) wslisten(addr string, tlsMap map[string]*TLSListenConfig)
591 592
 
592 593
 		ws, err := upgrader.Upgrade(w, r, nil)
593 594
 		if err != nil {
594
-			server.logger.Log(LogError, "ws", addr, fmt.Sprintf("%s websocket upgrade error: %s", server.name, err))
595
+			server.logger.Error("ws", addr, fmt.Sprintf("%s websocket upgrade error: %s", server.name, err))
595 596
 			return
596 597
 		}
597 598
 
@@ -609,7 +610,7 @@ func (server *Server) wslisten(addr string, tlsMap map[string]*TLSListenConfig)
609 610
 		if listenTLS {
610 611
 			tlsString = "TLS"
611 612
 		}
612
-		server.logger.Log(LogInfo, "listeners", fmt.Sprintf("websocket listening on %s using %s.", addr, tlsString))
613
+		server.logger.Info("listeners", fmt.Sprintf("websocket listening on %s using %s.", addr, tlsString))
613 614
 
614 615
 		if listenTLS {
615 616
 			err = http.ListenAndServeTLS(addr, config.Cert, config.Key, nil)
@@ -617,7 +618,7 @@ func (server *Server) wslisten(addr string, tlsMap map[string]*TLSListenConfig)
617 618
 			err = http.ListenAndServe(addr, nil)
618 619
 		}
619 620
 		if err != nil {
620
-			server.logger.Log(LogError, "listeners", fmt.Sprintf("listenAndServe error [%s]: %s", tlsString, err))
621
+			server.logger.Error("listeners", fmt.Sprintf("listenAndServe error [%s]: %s", tlsString, err))
621 622
 		}
622 623
 	}()
623 624
 }
@@ -651,7 +652,7 @@ func (server *Server) tryRegister(c *Client) {
651 652
 	}
652 653
 
653 654
 	// continue registration
654
-	server.logger.Log(LogDebug, "localconnect", fmt.Sprintf("Client registered [%s]", c.nick))
655
+	server.logger.Debug("localconnect", fmt.Sprintf("Client registered [%s]", c.nick))
655 656
 	c.Register()
656 657
 
657 658
 	// send welcome text
@@ -1241,13 +1242,13 @@ func operHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool {
1241 1242
 
1242 1243
 // rehash reloads the config and applies the changes from the config file.
1243 1244
 func (server *Server) rehash() error {
1244
-	server.logger.Log(LogDebug, "rehash", "Starting rehash")
1245
+	server.logger.Debug("rehash", "Starting rehash")
1245 1246
 
1246 1247
 	// only let one REHASH go on at a time
1247 1248
 	server.rehashMutex.Lock()
1248 1249
 	defer server.rehashMutex.Unlock()
1249 1250
 
1250
-	server.logger.Log(LogDebug, "rehash", "Got rehash lock")
1251
+	server.logger.Debug("rehash", "Got rehash lock")
1251 1252
 
1252 1253
 	config, err := LoadConfig(server.configFilename)
1253 1254
 
@@ -1326,7 +1327,7 @@ func (server *Server) rehash() error {
1326 1327
 	// STS
1327 1328
 	stsValue := config.Server.STS.Value()
1328 1329
 	var stsDisabled bool
1329
-	server.logger.Log(LogDebug, "rehash", "STS Vals", CapValues[STS], stsValue, fmt.Sprintf("server[%v] config[%v]", server.stsEnabled, config.Server.STS.Enabled))
1330
+	server.logger.Debug("rehash", "STS Vals", CapValues[STS], stsValue, fmt.Sprintf("server[%v] config[%v]", server.stsEnabled, config.Server.STS.Enabled))
1330 1331
 	if config.Server.STS.Enabled && !server.stsEnabled {
1331 1332
 		// enabling STS
1332 1333
 		SupportedCapabilities[STS] = true
@@ -1351,7 +1352,7 @@ func (server *Server) rehash() error {
1351 1352
 
1352 1353
 	// updated caps get DEL'd and then NEW'd
1353 1354
 	// so, we can just add updated ones to both removed and added lists here and they'll be correctly handled
1354
-	server.logger.Log(LogDebug, "rehash", "Updated Caps", updatedCaps.String(Cap301), strconv.Itoa(len(updatedCaps)))
1355
+	server.logger.Debug("rehash", "Updated Caps", updatedCaps.String(Cap301), strconv.Itoa(len(updatedCaps)))
1355 1356
 	if len(updatedCaps) > 0 {
1356 1357
 		for capab := range updatedCaps {
1357 1358
 			addedCaps[capab] = true
@@ -1470,13 +1471,13 @@ func (server *Server) rehash() error {
1470 1471
 
1471 1472
 // REHASH
1472 1473
 func rehashHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool {
1473
-	server.logger.Log(LogInfo, "rehash", fmt.Sprintf("REHASH command used by %s", client.nick))
1474
+	server.logger.Info("rehash", fmt.Sprintf("REHASH command used by %s", client.nick))
1474 1475
 	err := server.rehash()
1475 1476
 
1476 1477
 	if err == nil {
1477 1478
 		client.Send(nil, server.name, RPL_REHASHING, client.nick, "ircd.yaml", "Rehashing")
1478 1479
 	} else {
1479
-		server.logger.Log(LogError, "rehash", fmt.Sprintln("Failed to rehash:", err.Error()))
1480
+		server.logger.Error("rehash", fmt.Sprintln("Failed to rehash:", err.Error()))
1480 1481
 		client.Send(nil, server.name, ERR_UNKNOWNERROR, client.nick, "REHASH", err.Error())
1481 1482
 	}
1482 1483
 	return false

+ 19
- 5
oragono.go Переглянути файл

@@ -13,6 +13,7 @@ import (
13 13
 	"time"
14 14
 
15 15
 	"github.com/DanielOaks/oragono/irc"
16
+	"github.com/DanielOaks/oragono/irc/logger"
16 17
 	"github.com/DanielOaks/oragono/mkcerts"
17 18
 	"github.com/docopt/docopt-go"
18 19
 	"golang.org/x/crypto/ssh/terminal"
@@ -43,7 +44,20 @@ Options:
43 44
 		log.Fatal("Config file did not load successfully:", err.Error())
44 45
 	}
45 46
 
46
-	logger, err := irc.NewLogger(config.Logging)
47
+	// assemble separate log configs
48
+	var logConfigs []logger.Config
49
+	for _, lConfig := range config.Logging {
50
+		logConfigs = append(logConfigs, logger.Config{
51
+			MethodStderr:  lConfig.MethodStderr,
52
+			MethodFile:    lConfig.MethodFile,
53
+			Filename:      lConfig.Filename,
54
+			Level:         lConfig.Level,
55
+			Types:         lConfig.Types,
56
+			ExcludedTypes: lConfig.ExcludedTypes,
57
+		})
58
+	}
59
+
60
+	logger, err := logger.NewManager(logConfigs...)
47 61
 	if err != nil {
48 62
 		log.Fatal("Logger did not load successfully:", err.Error())
49 63
 	}
@@ -91,16 +105,16 @@ Options:
91 105
 	} else if arguments["run"].(bool) {
92 106
 		rand.Seed(time.Now().UTC().UnixNano())
93 107
 		if !arguments["--quiet"].(bool) {
94
-			logger.Log(irc.LogInfo, "startup", fmt.Sprintf("Oragono v%s starting", irc.SemVer))
108
+			logger.Info("startup", fmt.Sprintf("Oragono v%s starting", irc.SemVer))
95 109
 		}
96 110
 		server, err := irc.NewServer(configfile, config, logger)
97 111
 		if err != nil {
98
-			logger.Log(irc.LogError, "startup", fmt.Sprintf("Could not load server: %s", err.Error()))
112
+			logger.Error("startup", fmt.Sprintf("Could not load server: %s", err.Error()))
99 113
 			return
100 114
 		}
101 115
 		if !arguments["--quiet"].(bool) {
102
-			logger.Log(irc.LogInfo, "startup", "Server running")
103
-			defer logger.Log(irc.LogInfo, "shutdown", fmt.Sprintf("Oragono v%s exiting", irc.SemVer))
116
+			logger.Info("startup", "Server running")
117
+			defer logger.Info("shutdown", fmt.Sprintf("Oragono v%s exiting", irc.SemVer))
104 118
 		}
105 119
 		server.Run()
106 120
 	}

Завантаження…
Відмінити
Зберегти