|  | @@ -2,8 +2,6 @@ package log
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  import (
 |  |  import (
 | 
											
												
													
														|  |  	"fmt"
 |  |  	"fmt"
 | 
											
												
													
														|  | -	"log"
 |  | 
 | 
											
												
													
														|  | -	"os"
 |  | 
 | 
											
												
													
														|  |  )
 |  |  )
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  const (
 |  |  const (
 | 
											
										
											
												
													
														|  | @@ -13,36 +11,25 @@ const (
 | 
											
												
													
														|  |  	ErrorLevel   = LogLevel(3)
 |  |  	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
 |  |  	var data string
 | 
											
												
													
														|  | -	if v == nil || len(v) == 0 {
 |  | 
 | 
											
												
													
														|  | -		data = format
 |  | 
 | 
											
												
													
														|  | 
 |  | +	if len(this.values) == 0 {
 | 
											
												
													
														|  | 
 |  | +		data = this.format
 | 
											
												
													
														|  |  	} else {
 |  |  	} else {
 | 
											
												
													
														|  | -		data = fmt.Sprintf(format, v...)
 |  | 
 | 
											
												
													
														|  | 
 |  | +		data = fmt.Sprintf(this.format, this.values...)
 | 
											
												
													
														|  |  	}
 |  |  	}
 | 
											
												
													
														|  | -	this.logger.Println(prefix + data)
 |  | 
 | 
											
												
													
														|  | 
 |  | +	return this.prefix + data
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  var (
 |  |  var (
 | 
											
												
													
														|  | -	noOpLoggerInstance   logger = &noOpLogger{}
 |  | 
 | 
											
												
													
														|  | -	streamLoggerInstance logger = &streamLogger{
 |  | 
 | 
											
												
													
														|  | -		logger: log.New(os.Stdout, "", log.Ldate|log.Ltime),
 |  | 
 | 
											
												
													
														|  | -	}
 |  | 
 | 
											
												
													
														|  | 
 |  | +	noOpLoggerInstance   logWriter = &noOpLogWriter{}
 | 
											
												
													
														|  | 
 |  | +	streamLoggerInstance logWriter = newStdOutLogWriter()
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  	debugLogger   = noOpLoggerInstance
 |  |  	debugLogger   = noOpLoggerInstance
 | 
											
												
													
														|  |  	infoLogger    = 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.
 |  |  // Debug outputs a debug log with given format and optional arguments.
 | 
											
												
													
														|  |  func Debug(format string, v ...interface{}) {
 |  |  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.
 |  |  // Info outputs an info log with given format and optional arguments.
 | 
											
												
													
														|  |  func Info(format string, v ...interface{}) {
 |  |  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.
 |  |  // Warning outputs a warning log with given format and optional arguments.
 | 
											
												
													
														|  |  func Warning(format string, v ...interface{}) {
 |  |  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.
 |  |  // Error outputs an error log with given format and optional arguments.
 | 
											
												
													
														|  |  func Error(format string, v ...interface{}) {
 |  |  func Error(format string, v ...interface{}) {
 | 
											
												
													
														|  | -	errorLogger.WriteLog("[Error]", format, v...)
 |  | 
 | 
											
												
													
														|  | 
 |  | +	errorLogger.Log(&errorLog{
 | 
											
												
													
														|  | 
 |  | +		prefix: "[Error]",
 | 
											
												
													
														|  | 
 |  | +		format: format,
 | 
											
												
													
														|  | 
 |  | +		values: v,
 | 
											
												
													
														|  | 
 |  | +	})
 | 
											
												
													
														|  |  }
 |  |  }
 |