|
|
@@ -2,8 +2,6 @@ package log
|
|
|
|
|
|
import (
|
|
|
"fmt"
|
|
|
- "log"
|
|
|
- "os"
|
|
|
)
|
|
|
|
|
|
const (
|
|
|
@@ -13,36 +11,25 @@ const (
|
|
|
ErrorLevel = LogLevel(3)
|
|
|
)
|
|
|
|
|
|
-type logger interface {
|
|
|
- WriteLog(prefix, format string, v ...interface{})
|
|
|
+type errorLog struct {
|
|
|
+ prefix string
|
|
|
+ format string
|
|
|
+ values []interface{}
|
|
|
}
|
|
|
|
|
|
-type noOpLogger struct {
|
|
|
-}
|
|
|
-
|
|
|
-func (this *noOpLogger) WriteLog(prefix, format string, v ...interface{}) {
|
|
|
- // Swallow
|
|
|
-}
|
|
|
-
|
|
|
-type streamLogger struct {
|
|
|
- logger *log.Logger
|
|
|
-}
|
|
|
-
|
|
|
-func (this *streamLogger) WriteLog(prefix, format string, v ...interface{}) {
|
|
|
+func (this *errorLog) String() string {
|
|
|
var data string
|
|
|
- if v == nil || len(v) == 0 {
|
|
|
- data = format
|
|
|
+ if len(this.values) == 0 {
|
|
|
+ data = this.format
|
|
|
} else {
|
|
|
- data = fmt.Sprintf(format, v...)
|
|
|
+ data = fmt.Sprintf(this.format, this.values...)
|
|
|
}
|
|
|
- this.logger.Println(prefix + data)
|
|
|
+ return this.prefix + data
|
|
|
}
|
|
|
|
|
|
var (
|
|
|
- noOpLoggerInstance logger = &noOpLogger{}
|
|
|
- streamLoggerInstance logger = &streamLogger{
|
|
|
- logger: log.New(os.Stdout, "", log.Ldate|log.Ltime),
|
|
|
- }
|
|
|
+ noOpLoggerInstance logWriter = &noOpLogWriter{}
|
|
|
+ streamLoggerInstance logWriter = newStdOutLogWriter()
|
|
|
|
|
|
debugLogger = noOpLoggerInstance
|
|
|
infoLogger = noOpLoggerInstance
|
|
|
@@ -74,22 +61,48 @@ func SetLogLevel(level LogLevel) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+func InitErrorLogger(file string) error {
|
|
|
+ logger, err := newFileLogWriter(file)
|
|
|
+ if err != nil {
|
|
|
+ Error("Failed to create error logger on file (%s): %v", file, err)
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ streamLoggerInstance = logger
|
|
|
+ return nil
|
|
|
+}
|
|
|
+
|
|
|
// Debug outputs a debug log with given format and optional arguments.
|
|
|
func Debug(format string, v ...interface{}) {
|
|
|
- debugLogger.WriteLog("[Debug]", format, v...)
|
|
|
+ debugLogger.Log(&errorLog{
|
|
|
+ prefix: "[Debug]",
|
|
|
+ format: format,
|
|
|
+ values: v,
|
|
|
+ })
|
|
|
}
|
|
|
|
|
|
// Info outputs an info log with given format and optional arguments.
|
|
|
func Info(format string, v ...interface{}) {
|
|
|
- infoLogger.WriteLog("[Info]", format, v...)
|
|
|
+ infoLogger.Log(&errorLog{
|
|
|
+ prefix: "[Info]",
|
|
|
+ format: format,
|
|
|
+ values: v,
|
|
|
+ })
|
|
|
}
|
|
|
|
|
|
// Warning outputs a warning log with given format and optional arguments.
|
|
|
func Warning(format string, v ...interface{}) {
|
|
|
- warningLogger.WriteLog("[Warning]", format, v...)
|
|
|
+ warningLogger.Log(&errorLog{
|
|
|
+ prefix: "[Warning]",
|
|
|
+ format: format,
|
|
|
+ values: v,
|
|
|
+ })
|
|
|
}
|
|
|
|
|
|
// Error outputs an error log with given format and optional arguments.
|
|
|
func Error(format string, v ...interface{}) {
|
|
|
- errorLogger.WriteLog("[Error]", format, v...)
|
|
|
+ errorLogger.Log(&errorLog{
|
|
|
+ prefix: "[Error]",
|
|
|
+ format: format,
|
|
|
+ values: v,
|
|
|
+ })
|
|
|
}
|