| 
									
										
										
										
											2018-04-18 21:02:01 +01:00
										 |  |  | // Package log implements a small wrapper around the std lib log package.
 | 
					
						
							| 
									
										
										
										
											2018-10-31 21:32:23 +00:00
										 |  |  | // It implements log levels by prefixing the logs with the current time
 | 
					
						
							|  |  |  | // with in RFC3339Milli and [INFO], [DEBUG], [WARNING] or [ERROR].
 | 
					
						
							| 
									
										
										
										
											2018-04-18 21:02:01 +01:00
										 |  |  | // Debug logging is available and enabled if the *debug* plugin is used.
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // 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"
 | 
					
						
							| 
									
										
										
										
											2018-07-19 16:23:06 +01:00
										 |  |  | 	"io/ioutil"
 | 
					
						
							| 
									
										
										
										
											2018-04-18 21:02:01 +01:00
										 |  |  | 	golog "log"
 | 
					
						
							| 
									
										
										
										
											2018-07-20 15:08:06 +01:00
										 |  |  | 	"os"
 | 
					
						
							| 
									
										
										
										
											2018-10-31 21:32:23 +00:00
										 |  |  | 	"time"
 | 
					
						
							| 
									
										
										
										
											2018-04-18 21:02:01 +01:00
										 |  |  | )
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-05 16:29:54 +02:00
										 |  |  | // D controls whether we should output debug logs. If true, we do.
 | 
					
						
							| 
									
										
										
										
											2018-04-18 21:02:01 +01:00
										 |  |  | var D bool
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-31 21:32:23 +00:00
										 |  |  | // RFC3339Milli doesn't exist, invent it here.
 | 
					
						
							| 
									
										
										
										
											2018-11-13 23:22:32 +00:00
										 |  |  | func clock() string { return time.Now().Format("2006-01-02T15:04:05.000Z07:00") }
 | 
					
						
							| 
									
										
										
										
											2018-10-31 21:32:23 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-18 21:02:01 +01:00
										 |  |  | // logf calls log.Printf prefixed with level.
 | 
					
						
							|  |  |  | func logf(level, format string, v ...interface{}) {
 | 
					
						
							| 
									
										
										
										
											2018-10-31 21:32:23 +00:00
										 |  |  | 	golog.Print(clock(), 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{}) {
 | 
					
						
							|  |  |  | 	golog.Print(clock(), level, fmt.Sprint(v...))
 | 
					
						
							|  |  |  | }
 | 
					
						
							| 
									
										
										
										
											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{}) {
 | 
					
						
							|  |  |  | 	if !D {
 | 
					
						
							|  |  |  | 		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{}) {
 | 
					
						
							|  |  |  | 	if !D {
 | 
					
						
							|  |  |  | 		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.
 | 
					
						
							|  |  |  | func Discard() { golog.SetOutput(ioutil.Discard) }
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-18 21:02:01 +01:00
										 |  |  | const (
 | 
					
						
							| 
									
										
										
										
											2018-10-31 21:32:23 +00:00
										 |  |  | 	debug   = " [DEBUG] "
 | 
					
						
							|  |  |  | 	err     = " [ERROR] "
 | 
					
						
							|  |  |  | 	fatal   = " [FATAL] "
 | 
					
						
							|  |  |  | 	info    = " [INFO] "
 | 
					
						
							|  |  |  | 	warning = " [WARNING] "
 | 
					
						
							| 
									
										
										
										
											2018-04-18 21:02:01 +01:00
										 |  |  | )
 |