| 
									
										
										
										
											2019-10-17 15:53:11 +01:00
										 |  |  | // Package log implements a small wrapper around the std lib log package. It
 | 
					
						
							|  |  |  | // implements log levels by prefixing the logs with [INFO], [DEBUG], [WARNING]
 | 
					
						
							|  |  |  | // or [ERROR]. Debug logging is available and enabled if the *debug* plugin is
 | 
					
						
							|  |  |  | // used.
 | 
					
						
							| 
									
										
										
										
											2018-04-18 21:02:01 +01:00
										 |  |  | //
 | 
					
						
							|  |  |  | // log.Info("this is some logging"), will log on the Info level.
 | 
					
						
							|  |  |  | //
 | 
					
						
							| 
									
										
										
										
											2018-10-31 21:32:23 +00:00
										 |  |  | // log.Debug("this is debug output"), will log in the Debug level, etc.
 | 
					
						
							| 
									
										
										
										
											2018-04-18 21:02:01 +01:00
										 |  |  | package log
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import (
 | 
					
						
							|  |  |  | 	"fmt"
 | 
					
						
							| 
									
										
										
										
											2021-10-13 15:30:31 +08:00
										 |  |  | 	"io"
 | 
					
						
							| 
									
										
										
										
											2018-04-18 21:02:01 +01:00
										 |  |  | 	golog "log"
 | 
					
						
							| 
									
										
										
										
											2018-07-20 15:08:06 +01:00
										 |  |  | 	"os"
 | 
					
						
							| 
									
										
										
										
											2019-05-23 21:02:30 +01:00
										 |  |  | 	"sync"
 | 
					
						
							| 
									
										
										
										
											2018-04-18 21:02:01 +01:00
										 |  |  | )
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-23 21:02:30 +01:00
										 |  |  | // D controls whether we should output debug logs. If true, we do, once set
 | 
					
						
							|  |  |  | // it can not be unset.
 | 
					
						
							|  |  |  | var D = &d{}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type d struct {
 | 
					
						
							|  |  |  | 	on bool
 | 
					
						
							|  |  |  | 	sync.RWMutex
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-17 15:53:11 +01:00
										 |  |  | // Set enables debug logging.
 | 
					
						
							| 
									
										
										
										
											2019-05-23 21:02:30 +01:00
										 |  |  | func (d *d) Set() {
 | 
					
						
							|  |  |  | 	d.Lock()
 | 
					
						
							|  |  |  | 	d.on = true
 | 
					
						
							|  |  |  | 	d.Unlock()
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-17 15:53:11 +01:00
										 |  |  | // Clear disables debug logging.
 | 
					
						
							|  |  |  | func (d *d) Clear() {
 | 
					
						
							|  |  |  | 	d.Lock()
 | 
					
						
							|  |  |  | 	d.on = false
 | 
					
						
							|  |  |  | 	d.Unlock()
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Value returns if debug logging is enabled.
 | 
					
						
							| 
									
										
										
										
											2019-05-23 21:02:30 +01:00
										 |  |  | func (d *d) Value() bool {
 | 
					
						
							|  |  |  | 	d.RLock()
 | 
					
						
							|  |  |  | 	b := d.on
 | 
					
						
							|  |  |  | 	d.RUnlock()
 | 
					
						
							|  |  |  | 	return b
 | 
					
						
							|  |  |  | }
 | 
					
						
							| 
									
										
										
										
											2018-04-18 21:02:01 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | // logf calls log.Printf prefixed with level.
 | 
					
						
							|  |  |  | func logf(level, format string, v ...interface{}) {
 | 
					
						
							| 
									
										
										
										
											2019-08-28 14:41:11 +01:00
										 |  |  | 	golog.Print(level, fmt.Sprintf(format, v...))
 | 
					
						
							| 
									
										
										
										
											2018-04-18 21:02:01 +01:00
										 |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // log calls log.Print prefixed with level.
 | 
					
						
							| 
									
										
										
										
											2018-10-31 21:32:23 +00:00
										 |  |  | func log(level string, v ...interface{}) {
 | 
					
						
							| 
									
										
										
										
											2019-08-28 14:41:11 +01:00
										 |  |  | 	golog.Print(level, fmt.Sprint(v...))
 | 
					
						
							| 
									
										
										
										
											2018-10-31 21:32:23 +00:00
										 |  |  | }
 | 
					
						
							| 
									
										
										
										
											2018-04-18 21:02:01 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | // Debug is equivalent to log.Print(), but prefixed with "[DEBUG] ". It only outputs something
 | 
					
						
							|  |  |  | // if D is true.
 | 
					
						
							|  |  |  | func Debug(v ...interface{}) {
 | 
					
						
							| 
									
										
										
										
											2019-05-23 21:02:30 +01:00
										 |  |  | 	if !D.Value() {
 | 
					
						
							| 
									
										
										
										
											2018-04-18 21:02:01 +01:00
										 |  |  | 		return
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 	log(debug, v...)
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Debugf is equivalent to log.Printf(), but prefixed with "[DEBUG] ". It only outputs something
 | 
					
						
							|  |  |  | // if D is true.
 | 
					
						
							|  |  |  | func Debugf(format string, v ...interface{}) {
 | 
					
						
							| 
									
										
										
										
											2019-05-23 21:02:30 +01:00
										 |  |  | 	if !D.Value() {
 | 
					
						
							| 
									
										
										
										
											2018-04-18 21:02:01 +01:00
										 |  |  | 		return
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 	logf(debug, format, v...)
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Info is equivalent to log.Print, but prefixed with "[INFO] ".
 | 
					
						
							|  |  |  | func Info(v ...interface{}) { log(info, v...) }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Infof is equivalent to log.Printf, but prefixed with "[INFO] ".
 | 
					
						
							|  |  |  | func Infof(format string, v ...interface{}) { logf(info, format, v...) }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Warning is equivalent to log.Print, but prefixed with "[WARNING] ".
 | 
					
						
							|  |  |  | func Warning(v ...interface{}) { log(warning, v...) }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Warningf is equivalent to log.Printf, but prefixed with "[WARNING] ".
 | 
					
						
							|  |  |  | func Warningf(format string, v ...interface{}) { logf(warning, format, v...) }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Error is equivalent to log.Print, but prefixed with "[ERROR] ".
 | 
					
						
							|  |  |  | func Error(v ...interface{}) { log(err, v...) }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Errorf is equivalent to log.Printf, but prefixed with "[ERROR] ".
 | 
					
						
							|  |  |  | func Errorf(format string, v ...interface{}) { logf(err, format, v...) }
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-20 15:08:06 +01:00
										 |  |  | // Fatal is equivalent to log.Print, but prefixed with "[FATAL] ", and calling
 | 
					
						
							|  |  |  | // os.Exit(1).
 | 
					
						
							|  |  |  | func Fatal(v ...interface{}) { log(fatal, v...); os.Exit(1) }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Fatalf is equivalent to log.Printf, but prefixed with "[FATAL] ", and calling
 | 
					
						
							|  |  |  | // os.Exit(1)
 | 
					
						
							|  |  |  | func Fatalf(format string, v ...interface{}) { logf(fatal, format, v...); os.Exit(1) }
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-19 16:23:06 +01:00
										 |  |  | // Discard sets the log output to /dev/null.
 | 
					
						
							| 
									
										
										
										
											2021-10-13 15:30:31 +08:00
										 |  |  | func Discard() { golog.SetOutput(io.Discard) }
 | 
					
						
							| 
									
										
										
										
											2018-07-19 16:23:06 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-18 21:02:01 +01:00
										 |  |  | const (
 | 
					
						
							| 
									
										
										
										
											2019-08-28 14:41:11 +01:00
										 |  |  | 	debug   = "[DEBUG] "
 | 
					
						
							|  |  |  | 	err     = "[ERROR] "
 | 
					
						
							|  |  |  | 	fatal   = "[FATAL] "
 | 
					
						
							|  |  |  | 	info    = "[INFO] "
 | 
					
						
							|  |  |  | 	warning = "[WARNING] "
 | 
					
						
							| 
									
										
										
										
											2018-04-18 21:02:01 +01:00
										 |  |  | )
 |